2022 Huashu Cup Paper Ideas Analysis + Código Completo (Plano de Montagem de Robô Subaquático)

Você pode dar uma olhada no vídeo oficial de análise (desde que este vídeo seja um concorrente, você pode assisti-lo gratuitamente. Para quem não puder assistir, considerarei criar um blog em alguns dias). , coloquei a resposta padrão oficial no final deste blog. , para sua própria referência.
2022 Huashu Cup Vídeo de Análise Oficial da Pergunta B》》》》》》》

Aqui está uma declaração, estou participando da Copa Huashu com a pergunta C. A tese e o código fazem referência a outros, mas é de fato este blog que trabalhei tanto para resolver. Também sou iniciante e acabei de enviar para resolver. As idéias são convenientes para auto-aprendizagem e são apenas para sua referência. Não existe um excelente artigo ou uma resposta padrão.

Título completo:
link: https://pan.baidu.com/s/16E1X35O13NWIij72OClVgQ?pwd=1234
Código de extração: 1234

Diretório de artigos

1. O tópico

insira a descrição da imagem aqui
insira a descrição da imagem aqui

insira a descrição da imagem aqui
insira a descrição da imagem aqui

2. Análise de Problemas

insira a descrição da imagem aqui

3. Suposições do Modelo

1. Materiais suficientes para a montagem de pequenos componentes.
2. Durante o processo de produção, a produção não será interrompida devido a situações inesperadas, como falta de energia na fábrica e falhas mecânicas.
3. O fluxo de capital da fábrica é normal, e a produção não será afetada por falta de capital.
4. Apenas o robô do produto final tem demanda externa, e outros componentes não são vendidos externamente.
5. A demanda por robôs é determinada de acordo com o plano e não é afetada pelas flutuações dos preços de mercado.

4. Descrição do símbolo

símbolo ilustrar unidade
d dias céu
MA1 d , MA2 d , MA3 d … MC3 d Quantidade de montagem do widget no dia d individual
SA1 d , SA2 d , SA3 d … SC3 d Quantidade restante de widget no dia d individual
MA d , MB d , MC d Quantidade de montagem de grandes componentes no dia d individual
SA d , SB d , SC d Quantidade restante de componentes grandes no dia d individual
DW d O número de robôs exigidos no dia d individual
MW d O número de robôs montados no dia d individual
SW d O número restante de robôs no dia d individual
T d Limite total de horas de trabalho no dia d jornada de trabalho
RA1,RA2,…RB,RC custo de armazenamento por unidade para o componente Yuan
FA1,FA2,…,FB,FC Custo de preparação de produção do componente Yuan
XW d 0-1 variável de produzir robôs no dia d -
R d Custo de estoque no dia d Yuan
F d Custo de preparação da produção no dia d Yuan
checkDate t Data da t-ésima revisão céu
T grande d Limite total de horas de trabalho no dia d jornada de trabalho
DWprevisão d O número de robôs exigidos no dº dia de uma semana no futuro individual

5. Estabelecimento e solução do modelo do problema 1

5.1 O estabelecimento do modelo-problema

5.1.1 Pequenos componentes montam grandes componentes

Aqui, a montagem do grande componente A é tomada como exemplo. A montagem de um componente grande A requer 6 componentes pequenos A1, 8 componentes pequenos A2 e 2 componentes pequenos A3.

No dia d, o número de componentes pequenos A1 usados ​​para montar o componente grande A é: o número de componentes pequenos montados no dia d (o dia atual) MA1 d e o número de componentes pequenos restantes no dia d-1 (ontem) SA1 d-1 e, nomeadamente MA1 d +SA1 d-1 . O número de widgets A2 e A3 pode ser obtido da mesma forma.

A montagem de um componente grande A requer 6 componentes pequenos A1. Se apenas A1 for considerado, o número máximo de componentes grandes que podem ser montados é:

[ MA 1 d + SA 1 d − 1 6 ] (1) \left[ \begin{matrix} \frac{MA1_d+SA1_{d-1}}{6} \end{matrix} \right] \tag{1 }[6MA 1 _d+ S A 1d - 1]( 1 )

Nota: O símbolo [ ] aqui é arredondado para baixo, ou seja, pegue o maior inteiro menor que ele mesmo.

Da mesma forma, se apenas A2 for considerado, o número máximo de componentes grandes A que podem ser montados é:

[ MA 2 d + SA 2 d − 1 8 ] (2) \left[ \begin{matrix} \frac{MA2_d+SA2_{d-1}}{8} \end{matrix} \right] \tag{2 }[8MA 2 _d+ S A 2d - 1]( 2 )
Se apenas A3 for considerado, o número máximo de grandes componentes A que podem ser montados é:

[ MA 3 d + SA 3 d − 1 2 ] (3) \left[ \begin{matrix} \frac{MA3_d+SA3_{d-1}}{2} \end{matrix} \right] \tag{3 }[2MA 3 _d+ S A 3d - 1]( 3 )

Portanto, o número máximo de montagens do grande componente A no dia d é:

min [ ( MA 1 d + SA 1 d − 1 6 , MA 2 d + SA 2 d − 1 8 , MA 3 d + SA 3 d − 1 2 ) ] (4) min\left[ \begin{pmatrix} \ frac{MA1_d+SA1_{d-1}}{6}, \frac{MA2_d+SA2_{d-1}}{8}, \frac{MA3_d+SA3_{d-1}}{2} \end{pmatrix } \right]\tag{4}min[ (6MA 1 _d+ S A 1d - 1,8MA 2 _d+ S A 2d - 1,2MA 3 _d+ S A 3d - 1) ]( 4 )

Nota: Isso precisa ser arredondado para baixo

O número de robôs necessários para cada dia é diferente, para atender a demanda do pedido, quando a fábrica monta o grande componente A, ele não precisa necessariamente ser igual ao valor máximo. Portanto, no dia d, a quantidade de montagem do grande componente A deve satisfazer as seguintes restrições:

MA d ⩽ min [ ( MA 1 d + SA 1 d − 1 6 , MA 2 d + SA 2 d − 1 8 , MA 3 d + SA 3 d − 1 2 ) ] (5) MA_d \leqslant min\left[ \begin{pmatrix} \frac{MA1_d+SA1_{d-1}}{6}, \frac{MA2_d+SA2_{d-1}}{8}, \frac{MA3_d+SA3_{d-1}}{ 2} \end{pmatrix} \right]\tag{5}MA _dmin[ (6MA 1 _d+ S A 1d - 1,8MA 2 _d+ S A 2d - 1,2MA 3 _d+ S A 3d - 1) ]( 5 )

Da mesma forma, no dia d, a quantidade de montagem dos grandes componentes B e C deve atender às seguintes restrições:

MB d ⩽ min [ ( MB 1 d + SB 1 d − 1 2 , MB 2 d + SB 2 d − 1 4 , ) ] (6) MB_d \leqslant min\left[ \begin{pmatrix} \frac{MB1_d+ SB1_{d-1}}{2}, \frac{MB2_d+SB2_{d-1}}{4}, \end{pmatrix} \right]\tag{6}M Bdmin[ (2MB 1d+ SB 1d - 1,4MB 2d+ SB 2d - 1,) ]( 6 )

MC d ⩽ min [ ( MC 1 d + SC 1 d − 1 8 , MC 2 d + SC 2 d − 1 2 , MC 2 d + SC 2 d − 1 12 ) ] (6) MC_d \leqslant min\left[ \begin{pmatrix} \frac{MC1_d+SC1_{d-1}}{8}, \frac{MC2_d+SC2_{d-1}}{2}, \frac{MC2_d+SC2_{d-1}}{ 12} \end{pmatrix} \right]\tag{6}M Cdmin[ (8MC 1d+ SC 1d - 1,2MC 2d+ SC 2d - 1,12MC 2d+ SC 2d - 1) ]( 6 )

5.1.2 Widgets restantes

Depois de montar um componente grande com um componente pequeno, pode haver sobras do componente pequeno. Aqui, o widget A1 é usado como exemplo.
No dia d, o número restante de widgets A1, deve satisfazer, a soma do número de widgets montados no dia d MA1 d , e o número de widgets restantes no dia d-1 SA1 d-1 , menos a soma do número de widgets no dia d d-1 O consumo de Al. Para montar um grande componente A, são necessários 6 pequenos componentes A1. Portanto, a quantidade de consumo de Al no dia d é 6×MA d . Portanto, a quantidade restante SA1 d de A1 no dia d é a seguinte:

SA 1 d = MA 1 d + SA 1 d − 1 − 6 ∗ MA d (7) SA1_d=MA1_d+SA1_{d-1} -6*MA_d \tag{7}S A 1d=MA 1 _d+S A 1d - 16MA _d( 7 )

Hoje - Consumido = Restante
(Montado de Hoje + Resto de Ontem) - Consumido = Restante

O número restante de outros componentes pequenos pode ser obtido da mesma forma:
SA 2 d = MA 2 d + SA 2 d − 1 − 8 ∗ MA d SA2_d=MA2_d+SA2_{d-1} -8*MA_dS A 2d=MA 2 _d+S A 2d - 18MA _d
SA 3 d = MA 3 d + SA 3 d − 1 − 2 ∗ MA d SA3_d=MA3_d+SA3_{d-1} -2*MA_dS A 3d=MA 3 _d+S A 3d - 12MA _d
SB 1 d = MB 1 d + SB 1 d − 1 − 2 ∗ MB d SB1_d=MB1_d+SB1_{d-1} -2*MB_dSB 1d=MB 1d+SB 1d - 12M Bd
SB 2 d = MA 1 d + SA 1 d − 1 − 4 ∗ MB d (8) SB2_d=MA1_d+SA1_{d-1} -4*MB_d \tag{8}SB 2d=MA 1 _d+S A 1d - 14M Bd( 8 )
SC 1 d = MC 1 d + SC 1 d − 1 − 8 ∗ MC d SC1_d=MC1_d+SC1_{d-1} -8*MC_dSC 1d=MC 1d+SC 1d - 18M Cd
SC 2 d = MC 2 d + SC 2 d − 1 − 2 ∗ MC d SC2_d=MC2_d+SC2_{d-1} -2*MC_dSC 2d=MC 2d+SC 2d - 12M Cd
SC 3 d = MC 3 d + SC 3 d − 1 − 12 ∗ MC d SC3_d=MC3_d+SC3_{d-1} -12*MC_dSC 3d=MC 3d+SC 3d - 112M Cd

5.1.3 Cálculo dos componentes grandes restantes pela quantidade de montagem do robô

A montagem do robô, ou seja, montar o robô com componentes grandes, é o mesmo que montar componentes grandes com componentes pequenos, portanto, o número de robôs montados no dia d é o seguinte:

MW d ⩽ min [ ( MA 1 d + SA 1 d − 1 3 , MB 2 d + SB 2 d − 1 4 , MC 2 d + SC 2 d − 1 5 ) ] (9) MW_d \leqslant min\left[ \begin{pmatrix} \frac{MA1_d+SA1_{d-1}}{3}, \frac{MB2_d+SB2_{d-1}}{4}, \frac{MC2_d+SC2_{d-1}}{ 5} \end{pmatrix} \right]\tag{9}M Wdmin[ (3MA 1 _d+ S A 1d - 1,4MB 2d+ SB 2d - 1,5MC 2d+ SC 2d - 1) ]( 9 )

Entre eles, MW d é o número de robôs montados, MA d é o número de montagem de grandes componentes A no dia d, e SA d-1 é o número restante de grandes componentes A no dia d-1.

Monte o robô a partir de componentes grandes, que podem ter algumas sobras. É calculado da mesma forma que calcula o número restante de widgets, da seguinte forma:

SA d = MA d + SA d − 1 − 3 ∗ MW d SA_d=MA_d+SA_{d-1} -3*MW_dSA _d=MA _d+SA _d - 13M Wd
SB d = MB d + SB d − 1 − 4 ∗ MW d (10) SB_d=MB_d+SB_{d-1} -4*MW_d \tag{10}S Bd=M Bd+S Bd - 14M Wd( 10 )
SC d = MC d + SC d − 1 − 5 ∗ MW d SC_d=MC_d+SC_{d-1} -5*MW_dS Cd=M Cd+S Cd - 15M Wd

5.1.4 Restrições de quantidade de montagem do robô

Todos os pedidos de robôs aceitos pela fábrica devem ser entregues quando expiram, portanto, a soma da quantidade de montagem MW d de robôs no dia d e a quantidade restante SW d de robôs no dia d-1 deve ser maior que a quantidade demandada DW d no dia d .
MW d + SW d − 1 ⩾ DW d (12) MW_d+SW_{d-1} \geqslant DW_d \tag{12}M Wd+S Wd - 1D Wd( 12 )

5.1.5 Robô Restante

Pode haver algumas sobras após a venda diária de bots por encomenda. O SW d restante do robô no dia d é igual à soma da quantidade de montagem MW d no dia d e a quantidade restante SW d-1 no dia d-1 menos a quantidade do pedido DW d no dia . qual é

SW d = MW d + SW d − 1 − DW d (12) SW_d=MW_d+SW_{d-1} -DW_d \tag{12}S Wd=M Wd+S Wd - 1D Wd( 12 )

5.1.6 Sem Estoque Não Restante

O dia 1 começa sem nenhum componente em estoque, ou seja:
SA 1 0 = SA 2 0 = SA 3 0 = SB 1 0 = SB 2 0 = SC 1 0 = SC 2 0 = SC 3 0 (13) SA1_0=SA2_0= SA3_0 =SB1_0=SB2_0=SC1_0=SC2_0=SC3_0 \tag{13}S A 10=S A 20=S A 30=SB 10=SB 20=SC 10=SC 20=SC 30( 13 )
SA 0 = SB 0 = SC 0 = 0 (13) SA_0=SB_0=SC_0=0 \tag{13}SA _0=S B0=S C0=0( 13 )

Nenhum inventário de componentes será deixado após o sétimo dia, ou seja,

SA 1 7 = SA 2 7 = SA 3 7 = SB 1 7 = SB 2 7 = SC 1 7 = SC 2 7 = SC 3 7 SA1_7=SA2_7=SA3_7=SB1_7=SB2_7=SC1_7=SC2_7=SC3_7S A 17=S A 27=S A 37=SB 17=SB 27=SC 17=SC 27=SC 37
SA 7 = SB 7 = SC 7 = 0 (14) SA_7=SB_7=SC_7=0 \tag{14}SA _7=S B7=S C7=0( 14 )
SW 7 = 0 SW_7=0S W7=0

5.1.7 Restrições ao horário de trabalho

São necessárias 3 horas de trabalho para produzir 1 peça de A, 5 horas de trabalho para produzir 1 peça de B e 5 horas de trabalho para produzir 1 peça de C. As seguintes restrições precisam ser atendidas de uma só vez:

3 × MA d + 5 × MB d + 5 × MC d ⩽ T d (15) 3\times MA_d+5\times MB_d+5\times MC_d \leqslant T_d \tag{15}3×MA _d+5×M Bd+5×M CdTd( 15 )

5.1.8 Taxa de Inventário

Quando um componente está em estoque ao final de um dia, a fábrica deve pagar uma determinada taxa de estoque, que é proporcional à quantidade restante do componente. Portanto, de acordo com a quantidade restante de componentes no dia d, o custo de estoque de componentes pequenos, componentes grandes e robôs pode ser expresso.

R pequeno A d = RA 1 × SA 1 d + RA 2 × SA 2 d + RA 3 × SA 3 d RpequenoA_d =RA1\times SA1_d+RA2\times SA2_d+RA3\times SA3_dR small A _ _d=R A 1×S A 1d+R A 2×S A 2d+R A 3×S A 3d

R pequeno B d = RB 1 × SB 1 d + RB 2 × SB 2 d RpequenoB_d =RB1\times SB1_d+RB2\times SB2_dR small B _ _d=RB 1×SB 1d+RB 2×SB 2d

R pequeno C d = RC 1 × SC 1 d + RC 2 × SC 2 d + RC 3 × SC 3 d (16) RpequenoC_d =RC1\times SC1_d+RC2\times SC2_d+RC3\times SC3_d \tag{16}R small C _ _d=RC 1×SC 1d+RC 2×SC 2d+RC 3×SC 3d( 16 )

R bigd = RA × SA d + RB × SB d + RC × SC d Rbig_d =RA\times SA_d+RB\times SB_d+RC\times SC_dR grande _d=R A×SA _d+RB×S Bd+RC×S Cd

Entre eles, RA1 é o custo de estoque de peça única do grande componente A e SA1 d é a quantidade restante do grande componente A no dia d. Outros símbolos são os mesmos. RsmallA d , RsmallB d e RsmallC d são os custos de estoque dos pequenos componentes A, B e C no dia d, Rsmall os custos de estoque do componente grande no dia d e R d é o custo total de estoque do d dia.
A soma é o custo de estoque no dia d:

R d = R pequeno A d + R pequeno B d + R pequeno C d + R bigd + RW × SW d (17) R_d =RpequenoA_d+RpequenoB_d+RpequenoC_d+Rbig_d+RW\times SW_d \tag{17}Rd=R small A _ _d+R small B _ _d+R small C _ _d+R grande _d+R W×S Wd( 17 )

5.1.9 Custos de preparação da produção

Quando uma fábrica produz um produto componente, ela precisa pagar um custo fixo independente da quantidade de produção, chamado custo de preparação da produção.Para facilitar o cálculo do custo fixo, é introduzida aqui uma variável 0-1. Tome como exemplo a variável 0-1 XW d de um robô de produção . Se um robô é produzido no dia d, então XW d é 1; se nenhum robô é produzido no dia d, então XW d é 0. Do seguinte modo

XW d = { 1 MW d > 0 0 MW d = 0 (18) XW_d=\begin{cases} 1 & MW_d>0 \\ 0 & MW_d=0 \\ \end{cases}\tag{18}XW _d={ 10M Wd>0M Wd=0( 18 )

As variáveis ​​0-1 de outros componentes podem ser obtidas da mesma forma.

Portanto, de acordo com as variáveis ​​0-1 de todos os componentes, o custo de preparação da produção de componentes pequenos, componentes grandes e robôs pode ser expresso.

F pequeno A d = XA 1 d × FA 1 + XA 2 d × FA 2 + XA 3 d × FA 3 FsmallA_d =XA1_d \times FA1+XA2_d \times FA2+XA3_d \times FA3F small A _ _d=XA 1 _d×F A 1+XA 2 _d×F A 2+XA 3 _d×F A 3

F pequeno B d = XB 1 d × FB 1 + XB 2 d × FB 2 FpequenoB_d =XB1_d \times FB1+XB2_d \times FB2F small B _ _d=XB 1d×FB 1+XB 2d×FB 2

F pequeno C d = XC 1 d × FC 1 + XC 2 d × FC 2 + XC 3 d × FC 3 (19) FpequenoC_d =XC1_d \times FC1+XC2_d \times FC2+XC3_d \times FC3 \tag{19}F small C _ _d=XC 1d×FC 1+XC 2d×FC 2+XC 3d×FC 3( 19 )

F bigd = FA × XA d + FB × XB d + FC × XC d Fbig_d =FA\times XA_d+FB\times XB_d+FC\times XC_dF grande _d=F A×XAd+FB×XB _d+FC×XC _d

Entre eles, XA1 d é a variável 0-1 de produzir Al no dia d, e FA1 é o custo de preparação da produção de Al.
Outros símbolos são os mesmos. FsmallA d , FsmallB d e FsmallC d são os custos de preparação da produção dos componentes pequenos A, B e C no dia d, e o custo de estoque dos componentes grandes Fbig no dia d. F d é o custo de preparação da produção no dia d.

A soma é o custo de preparação da produção no dia d:
F d = F pequeno A d + F pequeno B d + F pequeno C d + F grande + XW d × FW (20) F_d =FpequenoA_d+FpequenoB_d+FpequenoC_d+Fbig_d+ XW_d\ vezes FW \tag{20}Fd=F small A _ _d+F small B _ _d+F small C _ _d+F grande _d+XW _d×F W( 20 )

5.1.10 Função objetivo

O custo total deve ser o menor, ou seja, a soma do custo de estoque e o custo de preparação da produção é o menor, e a função objetivo pode ser obtida:

min C = ∑ d = 1 7 R d + ∑ d = 1 7 F d (21) min C=\sum_{d=1}^7R_d+\sum_{d=1}^7 F_d \tag{21}minC=d = 17Rd+d = 17Fd( 21 )

insira a descrição da imagem aqui

5.2 Resolução de problemas do modelo

O algoritmo de recozimento simulado é combinado com o algoritmo de enxame de partículas, e o código é escrito em MATLAB para obter o resultado do problema um, conforme mostrado abaixo.

O resultado aqui é um pouco problemático, deve ser 7000+.

insira a descrição da imagem aqui

function [X,F]=chushihua1(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C)
%初始化变量、计算目标函数值
flag1=0;
while flag1==0
X=[];
flag1=1;
KC_WPCR=zeros(1,length(WPCR));%记录每天WPCR库存
KC=zeros(3,length(WPCR));%记录每天ABC库存
SY_WPCR=zeros(1,length(WPCR));%记录每天交付WPCR情况
SY=zeros(3,length(WPCR));%记录每天使用ABC情况
SC_WPCR=zeros(1,length(WPCR));%记录每天组装WPCR情况
SC=zeros(3,length(WPCR));%记录每天生产ABC情况
for i=1:length(WPCR)%循环遍历每个WPCR
    if i==1%第一天0库存
        sub=[A_x,B_x,C_x].*WPCR(i);%求出每天的最小ABC需求量
        up=[];
        up(1)=fix((T(i)-sub([2,3])*[TB;TC])/TA);%BC最低供应时,A最大供应量
        up(2)=fix((T(i)-sub([1,3])*[TA;TC])/TB);%AC最低供应时,B最大供应量
        up(3)=fix((T(i)-sub([1,2])*[TA;TB])/TC);%AC最低供应时,B最大供应量
        up=min(up,fix(T(i)./([A_x,B_x,C_x]*[TA;TB;TC])).*[A_x,B_x,C_x]);
    else
        sub=max([A_x,B_x,C_x].*WPCR(i)-KC(:,i-1)',0);%除了第一天,每天减去前一天的库存则为当天至少增加的需求量
        up=[];
        up(1)=fix((T(i)-sub([2,3])*[TB;TC])/TA);%BC最低供应时,A最大供应量
        up(2)=fix((T(i)-sub([1,3])*[TA;TC])/TB);%AC最低供应时,B最大供应量
        up(3)=fix((T(i)-sub([1,2])*[TA;TB])/TC);%AC最低供应时,B最大供应量
        up=min(up,fix(T(i)./([A_x,B_x,C_x]*[TA;TB;TC])).*[A_x,B_x,C_x]);
    end
    %前面的变量会影响后面的变量范围,可能会出现上up小于sub的情况,毕竟有最大工时限制
    if length(find((up-sub)<0))>0%如果出现则重新生成
        flag1=0;
        continue
    end
    flag2=0;
    while flag2==0
        x=[randi([sub(1),up(1)]),randi([sub(2),up(2)]),randi([sub(3),up(3)])];%在区间内随机生成整数
        if x*[TA;TB;TC]<=T(i)%需求量必须满足在工时限制内
            flag2=1;
        end
    end
    %每天组装的WPCR
    if i==1
        s=WPCR(i);%可组装最小数量
        u=min(fix(x./[A_x,B_x,C_x]));%可组装最大数量
    else
        s=WPCR(i)-KC_WPCR(i-1);
        u=min(fix([x+KC(:,i-1)']./[A_x,B_x,C_x]));
    end
    %更新SC、KC、SY矩阵
    %生产
    SC_WPCR(i)=randi([s,u]);
    SC(:,i)=SC(:,i)+x';
    %放库存
    if i==1
        KC_WPCR(i)=KC_WPCR(i)+SC_WPCR(i);
        KC(:,i)=KC(:,i)+SC(:,i);
    else
        KC_WPCR(i)=KC_WPCR(i-1)+SC_WPCR(i);
        KC(:,i)=KC(:,i-1)+SC(:,i);
    end
    %使用
    SY_WPCR(i)=WPCR(i);
    SY(:,i)=[A_x;B_x;C_x].*SC_WPCR(i);
    %更新库存
    KC_WPCR(i)=KC_WPCR(i)-WPCR(i);
    KC(:,i)=KC(:,i)-SY(:,i);
end
X=[SC_WPCR;SC];
X=reshape(X',1,28);
end
X1=[SC_WPCR;SC];%生产
X2=[KC_WPCR;KC];%库存
X1(find(X1>0))=1;
%最优情况,小件无库存但是有生产准备费用
f1=sum(X1.*[W(1);sum(W(2:5));sum(W(6:8));sum(W(9:12))],2);
f2=sum(X2.*C([1,2,6,9])',2);
F=sum(f1)+sum(f2);"
function J=jianyan1(X,WPCR,A_x,B_x,C_x)
%检验变量参与运算后是否出现小于0的值,是则不满足条件
X=X';
KC_WPCR=zeros(1,length(WPCR));%记录每天WPCR库存
KC=zeros(3,length(WPCR));%记录每天ABC库存
SY_WPCR=zeros(1,length(WPCR));%记录每天交付WPCR情况
SY=zeros(3,length(WPCR));%记录每天使用ABC情况
SC_WPCR=zeros(1,length(WPCR));%记录每天组装WPCR情况
SC=zeros(3,length(WPCR));%记录每天生产ABC情况
for i=1:length(WPCR)%循环遍历每个WPCR
    x=X(i,2:4);
    %更新SC、KC、SY矩阵
    %生产
    SC_WPCR(i)=X(i,1);
    SC(:,i)=SC(:,i)+x';
    %放库存
    if i==1
        KC_WPCR(i)=KC_WPCR(i)+SC_WPCR(i);
        KC(:,i)=KC(:,i)+SC(:,i);
    else
        KC_WPCR(i)=KC_WPCR(i-1)+SC_WPCR(i);
        KC(:,i)=KC(:,i-1)+SC(:,i);
    end
    %使用
    SY_WPCR(i)=WPCR(i);
    SY(:,i)=[A_x;B_x;C_x].*SC_WPCR(i);
    %更新库存
    KC_WPCR(i)=KC_WPCR(i)-WPCR(i);
    KC(:,i)=KC(:,i)-SY(:,i);
end
if length(find(KC_WPCR<0))>0 | length(find(KC<0))>0
    J=1;
else
    J=0;
end 
function [F,f1,f2]=fun1(X,WPCR,A_x,B_x,C_x,W,C)
%带入变量计算目标函数值
X=reshape(X',7,4);
KC_WPCR=zeros(1,length(WPCR));%记录每天WPCR库存
KC=zeros(3,length(WPCR));%记录每天ABC库存
SY_WPCR=zeros(1,length(WPCR));%记录每天交付WPCR情况
SY=zeros(3,length(WPCR));%记录每天使用ABC情况
SC_WPCR=zeros(1,length(WPCR));%记录每天组装WPCR情况
SC=zeros(3,length(WPCR));%记录每天生产ABC情况
for i=1:length(WPCR)%循环遍历每个WPCR
    x=X(i,2:4);
    %更新SC、KC、SY矩阵
    %生产
    SC_WPCR(i)=X(i,1);
    SC(:,i)=SC(:,i)+x';
    %放库存
    if i==1
        KC_WPCR(i)=KC_WPCR(i)+SC_WPCR(i);
        KC(:,i)=KC(:,i)+SC(:,i);
    else
        KC_WPCR(i)=KC_WPCR(i-1)+SC_WPCR(i);
        KC(:,i)=KC(:,i-1)+SC(:,i);
    end
    %使用
    SY_WPCR(i)=WPCR(i);
    SY(:,i)=[A_x;B_x;C_x].*SC_WPCR(i);
    %更新库存
    KC_WPCR(i)=KC_WPCR(i)-WPCR(i);
    KC(:,i)=KC(:,i)-SY(:,i);
end
X1=[SC_WPCR;SC];%生产
X2=[KC_WPCR;KC];%库存
X1(find(X1>0))=1;
%最优情况,小件无库存但是有生产准备费用
f1=sum(X1.*[W(1);sum(W(2:5));sum(W(6:8));sum(W(9:12))],1)';
f2=sum(X2.*C([1,2,6,9])',1)';
F=sum(f1)+sum(f2);
clear all
clc
%每天WPCR需求量
WPCR=[39 36 38 40 37 33 40];
%一个WPCR队ABC需求比例
A_x=3;
B_x=4;
C_x=5;
%每天总工时
T=[4500 2500 2750 2100 2500 2750 1500];
%ABC单位工时消耗
TA=3;
TB=5;
TC=5;
%生产准备费用:A A1 A2 A3 B B1 B2 C C1 C2 C3
W=[240 120 40 60 50 160 80 100 180 60 40 70];
%单件库存费用:A A1 A2 A3 B B1 B2 C C1 C2 C3
C=[5 2 5 3 6 1.5 4 5 1.7 3 2 3];

%模拟退火-粒子群算法
T0=100; %初始化温度值
T_min=1; %设置温度下界
alpha=0.95; %温度的下降率
c1=0.4;c2=0.6; %学习因子
wmax=0.6;wmin=0.4; %惯性权重
num=1000; %颗粒总数,效果不好可以增加
X=[];
F=[];
for i=1:num
    [X(i,:),F(i,1)]=chushihua1(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C);
end
%以最小化为例
[bestf,a]=min(F);
bestx=X(a,:);
trace(1)=bestf;
while(T0>T_min)
    XX=[];
    FF=[];
 for i=1:num
        [XX(i,:),FF(i,1)]=chushihua1(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C);
        delta=FF(i,1)-F(i,1);
        if delta<0
            F(i,1)=FF(i,1);
            X(i,:)=XX(i,:);
        else
            P=exp(-delta/T0);
            if P>rand
                F(i,1)=FF(i,1);
                X(i,:)=XX(i,:);
            end
        end  
    end
    fave=mean(F);
    fmin=min(F);
    for i=1:num
        %权重更新
        if F(i)<=fave
            w=wmin+(F(i)-fmin)*(wmax-wmin)/(fave-fmin);
        else
            w=wmax;
        end
        [~,b]=min(F);
        best=X(b,:);%当前最优解
        v=w.*randn(1,28)+c1*rand*(best-X(i,:))+c2*rand*(bestx-X(i,:));%速度
        XX(i,:)=round(X(i,:)+v);%更新位置
        XX(i,:)=max(XX(i,:),0);%不能小于0
        %检验,不满足条件则返回之前的变量
        x=reshape(XX(i,:)',7,4)';%重新排列矩阵维度
        J=jianyan1(X,WPCR,A_x,B_x,C_x);
        if length(find((sum(x(2:4,:).*[TA;TB;TC],1)-T)>0))>0 | sum(x(1,:))<sum(WPCR) | J==1
            XX(i,:)=X(i,:);
        end
        %计算目标函数
        FF(i,1)=fun1(X(i,:),WPCR,A_x,B_x,C_x,W,C);
        %更新最优
        if FF(i,1)<F(i,1)
            F(i,1)=FF(i,1);
            X(i,:)=XX(i,:);
        end 
    end
    if min(F)<bestf
        [bestf,a]=min(F);
        bestx=X(a,:);
    end
    trace=[trace;bestf];
    T0=T0*alpha;
end
disp('最优解为:')
disp('WPCR组装数量、A组装数量、B组装数量、C组装数量')
disp(reshape(bestx',7,4))
disp('生产准备费用、库存费用')
[~,f1,f2]=fun1(bestx,WPCR,A_x,B_x,C_x,W,C)
disp('总费用')
disp(bestf)
figure
plot(trace)
xlabel('迭代次数')
ylabel('函数值')
title('模拟退火算法')
legend('最优值')

6. Resumo e solução do modelo do problema 2

6.1 Estabelecimento do segundo modelo de problema

6.1.1 Pequenos componentes montam grandes componentes

Os componentes A, B e C precisam ser produzidos e armazenados com um dia de antecedência para montar o WPCR, e os componentes A1, A2, A3, B1, B2, C1, C2 e C3 também precisam ser produzidos e armazenados um dia de antecedência para montar A, B e C. Portanto, se você quiser concluir a demanda do pedido de componentes na segunda-feira, precisará montar os componentes grandes A, B e C necessários na segunda-feira da semana passada no domingo. E no último domingo, os pequenos componentes usados ​​para montar os grandes componentes devem ser montados no último sábado.
Portanto, o número de componentes pequenos usados ​​para montar componentes grandes no dia d deve ser a soma do número de componentes pequenos montados no dia d-1 e o número de componentes pequenos restantes no dia d-1. Portanto, as fórmulas (5) e (6) são modificadas para obter as restrições de grandes componentes, como segue:
MA d ⩽ min [ ( MA 1 d − 1 + SA 1 d − 1 6 , MA 2 d − 1 + SA 2 d − 1 8 , MA 3 d − 1 + SA 3 d − 1 2 ) ] MA_d \leqslant min\left[ \begin{pmatrix} \frac{MA1_{d-1}+SA1_{d-1}}{6 }, \frac{MA2_{d-1}+SA2_{d-1}}{8}, \frac{MA3_{d-1}+SA3_{d-1}}{2} \end{pmatrix} \right ]MA _dmin[ (6MA 1 _d - 1+ S A 1d - 1,8MA 2 _d - 1+ S A 2d - 1,2MA 3 _d - 1+ S A 3d - 1) ]

MB d ⩽ min [ ( MB 1 d − 1 + SB 1 d − 1 2 , MB 2 d − 1 + SB 2 d − 1 4 , ) ] (22) MB_d \leqslant min\left[ \begin{pmatrix} \ frac{MB1_{d-1}+SB1_{d-1}}{2}, \frac{MB2_{d-1}+SB2_{d-1}}{4}, \end{pmatrix} \right]\ etiqueta{22}M Bdmin[ (2MB 1d - 1+ SB 1d - 1,4MB 2d - 1+ SB 2d - 1,) ]( 22 )

MC d ⩽ min [ ( MC 1 d − 1 + SC 1 d − 1 8 , MC 2 d − 1 + SC 2 d − 1 2 , MC 3 d − 1 + SC 3 d − 1 12 ) ] MC_d \leqslant min \left[ \begin{pmatrix} \frac{MC1_{d-1}+SC1_{d-1}}{8}, \frac{MC2_{d-1}+SC2_{d-1}}{2}, \frac{MC3_{d-1}+SC3_{d-1}}{12} \end{pmatrix} \right]M Cdmin[ (8MC 1d - 1+ SC 1d - 1,2MC 2d - 1+ SC 2d - 1,12MC 3d - 1+ SC 3d - 1) ]

6.1.2 Widgets restantes

O número de widgets restantes no dia d, ou seja, o número de widgets que precisam ser armazenados, pode ser visto em duas partes. Uma parte é o número de componentes pequenos montados no dia d, e a outra parte é a parte restante dos componentes grandes montados no dia d, e a parte restante deve ser o número de componentes pequenos montados no dia d-1 e o número de componentes pequenos restantes no dia d-1. e, menos a quantidade consumida no dia d,

Dia d restante { quantidade montada no dia d + (quantidade montada no dia d − 1 + quantidade restante no dia d − 1) − quantidade consumida no dia d restante no dia d\begin{casos} dia d Quantidade Montada\\ +\ \ (Quantidade Montada no Dia d-1 + Quantidade Restante no Dia d-1) - Quantidade Consumida no Dia d\end{cases}Dia d restante Quantidade montada no dia d+(th dQuantidade montada em 1 dia+d_ _1 dia de quantidade restante)Quantidade consumida no dia d

Então o resto do widget fica assim:

SA 1 d = MA 1 d + MA 1 d − 1 + SA 1 d − 1 − 6 × MA d SA1_d=MA1_d+MA1_{d-1}+SA1_{d-1}-6 \times MA_dS A 1d=MA 1 _d+MA 1 _d - 1+S A 1d - 16×MA _d
SA 2 d = MA 2 d + MA 2 d − 1 + SA 2 d − 1 − 8 × MA d SA2_d=MA2_d+MA2_{d-1}+SA2_{d-1}-8 \times MA_dS A 2d=MA 2 _d+MA 2 _d - 1+S A 2d - 18×MA _d
SA 3 d = MA 3 d + MA 3 d − 1 + SA 3 d − 1 − 2 × MA d SA3_d=MA3_d+MA3_{d-1}+SA3_{d-1}-2 \times MA_dS A 3d=MA 3 _d+MA 3 _d - 1+S A 3d - 12×MA _d
SB 1 d = MB 1 d + MB 1 d − 1 + SB 1 d − 1 − 2 × MB d SB1_d=MB1_d+MB1_{d-1}+SB1_{d-1}-2 \times MB_dSB 1d=MB 1d+MB 1d - 1+SB 1d - 12×M Bd

SB 2 d = MB 2 d + MB 2 d − 1 + SB 2 d − 1 − 4 × MB d (23) SB2_d=MB2_d+MB2_{d-1}+SB2_{d-1}-4 \times MB_d \ etiqueta{23}SB 2d=MB 2d+MB 2d - 1+SB 2d - 14×M Bd( 23 )
SC 1 d = MC 1 d + MC 1 d − 1 + SC 1 d − 1 − 8 × MC d SC1_d=MC1_d+MC1_{d-1}+SC1_{d-1}-8 \times MC_dSC 1d=MC 1d+MC 1d - 1+SC 1d - 18×M Cd
SC 2 d = MC 2 d + MC 2 d − 1 + SC 2 d − 1 − 2 × MC d SC2_d=MC2_d+MC2_{d-1}+SC2_{d-1}-2 \times MC_dSC 2d=MC 2d+MC 2d - 1+SC 2d - 12×M Cd
SC 3 d = MC 3 d + MC 3 d − 1 + SC 3 d − 1 − 12 × MC d SC3_d=MC3_d+MC3_{d-1}+SC3_{d-1}-12 \times MC_dSC 3d=MC 3d+MC 3d - 1+SC 3d - 112×M Cd

6.1.3 A quantidade de montagem do robô calcula os componentes grandes restantes

A montagem do robô é a mesma que a montagem de componentes pequenos em componentes grandes. No dia d, o robô é montado usando a montagem no dia d-1 ou os componentes grandes restantes. As restrições são as seguintes:

MW d ⩽ min [ ( MA 1 d − 1 + SA 1 d − 1 3 , MB 2 d − 1 + SB 2 d − 1 4 , MC 3 d − 1 + SC 3 d − 1 5 ) ] (24) MW_d \leqslant min\left[ \begin{pmatrix} \frac{MA1_{d-1}+SA1_{d-1}}{3}, \frac{MB2_{d-1}+SB2_{d-1}}{ 4}, \frac{MC3_{d-1}+SC3_{d-1}}{5} \end{pmatrix} \right]\tag{24}M Wdmin[ (3MA 1 _d - 1+ S A 1d - 1,4MB 2d - 1+ SB 2d - 1,5MC 3d - 1+ SC 3d - 1) ]( 24 )

O restante do componente grande é igual ao restante do componente pequeno, como segue:

SA d = MA d + MA d − 1 + SA d − 1 − 3 × MW d SA_d=MA_d+MA_{d-1}+SA_{d-1}-3 \times MW_dSA _d=MA _d+MA _d - 1+SA _d - 13×M Wd
SB d = MB d + MB d − 1 + SB d − 1 − 4 × MW d (25) SB_d=MB_d+MB_{d-1}+SB_{d-1}-4 \times MW_d \tag{25}S Bd=M Bd+M Bd - 1+S Bd - 14×M Wd( 25 )
SC d = MC d + MC d − 1 + SC d − 1 − 5 × MW d SC_d=MC_d+MC_{d-1}+SC_{d-1}-5 \times MW_dS Cd=M Cd+M Cd - 1+S Cd - 15×M Wd

6.1.4 Restrições de quantidade de montagem do robô e cálculo residual

A quantidade de montagem e o restante do robô não são modificados da seguinte forma:

MW d + SW d − 1 ⩾ DW d (26) MW_d+SW_{d-1} \geqslant DW_d \tag{26}M Wd+S Wd - 1D Wd( 26 )
SW d = MC d + MW d − 1 + SW d − 1 − DW d (26) SW_d=MC_d+MW_{d-1}+SW_{d-1}-DW_d \tag{26}S Wd=M Cd+M Wd - 1+S Wd - 1D Wd( 26 )

6.1.5 Garantir a produção do dia seguinte

Para garantir a produção na segunda-feira da próxima semana, os componentes devem ser deixados no final desta semana no domingo, portanto as equações (13) e (14) da questão 1 não devem ser consideradas. Considere a próxima segunda-feira como o 8º dia, então a soma do número de robôs montados no 8º dia e o número de robôs restantes no 7º dia não deve ser menor que a quantidade do pedido 39 na próxima segunda-feira, da seguinte forma:

MW 8 + SW 8 − 1 ⩾ 39 (26) MW_8+SW_{8-1} \geqslant 39 \tag{26}M W8+S W8 - 139( 26 )

Vale a pena notar que nesta semana, para garantir a produção de robôs no dia d, as restrições quanto à quantidade de montagem de componentes grandes no dia d e à quantidade de montagem de componentes pequenos no dia d-1 não são claramente dadas. No entanto, na equação (26), há uma restrição na quantidade do pedido DW d de robôs no dia d e na quantidade MW d fabricada no dia d . Há uma restrição na quantidade de montagem de componentes grandes no dia d, na equação (22), há uma restrição na quantidade de montagem de componentes pequenos no dia d-1 no número de componentes grandes montados no dia d.

Portanto, as restrições para garantir o número de robôs produzidos no segundo dia não são dadas explicitamente, mas estão implícitas.

6.1.6 Restrições ao horário de trabalho

O limite de horas de trabalho não é modificado da seguinte forma:
3 × MA d + 5 × MB d + 5 × MC d ⩽ T d (27) 3\times MA_d+5\times MB_d+5\times MC_d \leqslant T_d \tag { 27}3×MA _d+5×M Bd+5×M CdTd( 27 )

6.1.7 Função objetivo

A função objetivo não é modificada e é a mesma do problema 1:
min C = ∑ d = 1 7 R d + ∑ d = 1 7 F d (28) min C=\sum_{d=1}^7R_d+\ soma_ {d=1}^7 F_d \tag{28}minC=d = 17Rd+d = 17Fd( 28 )

insira a descrição da imagem aqui

6.2 A solução do segundo modelo de problema

Use o MATLAB para escrever o código para obter o resultado da segunda pergunta.
insira a descrição da imagem aqui

clear
clc
%每天WPCR需求量
WPCR=[39 36 38 40 37 33 40];
%一个WPCR队ABC需求比例
A_x=3;
B_x=4;
C_x=5;
D_x=[6;8;2;2;4;8;2;12];
%每天总工时
T=[4500 2500 2750 2100 2500 2750 1500];
%ABC单位工时消耗
TA=3;
TB=5;
TC=5;
%生产准备费用:A A1 A2 A3 B B1 B2 C C1 C2 C3
W=[240 120 40 60 50 160 80 100 180 60 40 70];
%单件库存费用:A A1 A2 A3 B B1 B2 C C1 C2 C3
C=[5 2 5 3 6 1.5 4 5 1.7 3 2 3];

%模拟退火-粒子群算法
T0=100; %初始化温度值
T_min=1; %设置温度下界
alpha=0.95; %温度的下降率
c1=0.4;c2=0.6; %学习因子
wmax=0.6;wmin=0.4; %惯性权重
num=1000; %颗粒总数
X=[];
F=[];
for i=1:num
    [X(i,:),F(i,1)]=chushihua2(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C,D_x);
end
%以最小化为例
[bestf,a]=min(F);
bestx=X(a,:);
trace(1)=bestf;
while(T0>T_min)
    XX=[];
    FF=[];
 for i=1:num
        [XX(i,:),FF(i,1)]=chushihua2(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C,D_x);
        delta=FF(i,1)-F(i,1);
        if delta<0
            F(i,1)=FF(i,1);
            X(i,:)=XX(i,:);
        else
            P=exp(-delta/T0);
            if P>rand
                F(i,1)=FF(i,1);
                X(i,:)=XX(i,:);
            end
        end  
    end
    fave=mean(F);
    fmin=min(F);
    for i=1:num
        %权重更新
        if F(i)<=fave
            w=wmin+(F(i)-fmin)*(wmax-wmin)/(fave-fmin);
        else
            w=wmax;
        end
        [~,b]=min(F);
        best=X(b,:);%当前最优解
        v=w.*randn(1,28)+c1*rand*(best-X(i,:))+c2*rand*(bestx-X(i,:));%速度
        XX(i,:)=round(X(i,:)+v);%更新位置
        XX(i,:)=max(XX(i,:),0);%不能小于0
        %检验,不满足条件则返回之前的变量
        x=reshape(XX(i,:)',7,4)';%重新排列矩阵维度
        J=jianyan2(X,WPCR,A_x,B_x,C_x,D_x);
        if length(find((sum(x(2:4,:).*[TA;TB;TC],1)-T)>0))>0 | sum(x(1,:))<sum(WPCR) | J==1
            XX(i,:)=X(i,:);
        end
        %计算目标函数
        FF(i,1)=fun2(X(i,:),WPCR,A_x,B_x,C_x,W,C,D_x);
        %更新最优
        if FF(i,1)<F(i,1)
            F(i,1)=FF(i,1);
            X(i,:)=XX(i,:);
        end 
    end
    if min(F)<bestf
        [bestf,a]=min(F);
        bestx=X(a,:);
    end
    trace=[trace;bestf];
    T0=T0*alpha;
end
disp('最优解为:')
disp('WPCR组装数量、A组装数量、B组装数量、C组装数量')
disp(reshape(bestx',7,4))
disp('生产准备费用、库存费用')
[~,f1,f2]=fun2(bestx,WPCR,A_x,B_x,C_x,W,C,D_x)
disp('总费用')
disp(bestf)
figure
plot(trace)
xlabel('迭代次数')
ylabel('函数值')
title('模拟退火算法')
legend('最优值')
function [X,F]=chushihua2(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C,D_x)
%初始化变量、计算目标函数值,小件提前两天,大件提前1天
flag1=0;
while flag1==0
X=[];
nn=2;%延迟天数
flag1=1;
KC_WPCR=zeros(1,length(WPCR)+nn);%记录每天WPCR库存
KC=zeros(3,length(WPCR)+nn);%记录每天ABC库存
KC_x=zeros(8,length(WPCR)+nn);%记录每天ABC小件库存
SY_WPCR=zeros(1,length(WPCR)+nn);%记录每天交付WPCR情况
SY=zeros(3,length(WPCR)+nn);%记录每天使用ABC情况
SY_x=zeros(8,length(WPCR)+nn);%记录每天使用ABC小件情况
SC_WPCR=zeros(1,length(WPCR)+nn);%记录每天组装WPCR情况
SC=zeros(3,length(WPCR)+nn);%记录每天生产ABC情况
SC_x=zeros(8,length(WPCR)+nn);%记录每天生产ABC小件情况
for i=1:length(WPCR)%循环遍历每个WPCR
    if i==1%假设第一天刚好满足WPCR
        sub=[A_x,B_x,C_x].*WPCR(i);%求出每天的WPCR最小ABC需求量
        up=sub;
    else
        sub=max([A_x,B_x,C_x].*WPCR(i)-KC(:,i+nn-1)',0);%除了第一天,每天减去前一天的库存则为当天至少增加的需求量
        up=[];
        up(1)=fix((T(i)-sub([2,3])*[TB;TC])/TA);%BC最低供应时,A最大供应量
        up(2)=fix((T(i)-sub([1,3])*[TA;TC])/TB);%AC最低供应时,B最大供应量
        up(3)=fix((T(i)-sub([1,2])*[TA;TB])/TC);%AC最低供应时,B最大供应量
        up=min(up,fix(T(i)./([A_x,B_x,C_x]*[TA;TB;TC])).*[A_x,B_x,C_x]);
    end
    %前面的变量会影响后面的变量范围,可能会出现上up小于sub的情况,毕竟有最大工时限制
    if length(find((up-sub)<0))>0%如果出现则重新生成
        flag1=0;
        continue
    end
    flag2=0;
    while flag2==0
        x=[randi([sub(1),up(1)]),randi([sub(2),up(2)]),randi([sub(3),up(3)])];%在区间内随机生成整数
        if x*[TA;TB;TC]<=T(i)%需求量必须满足在工时限制内
            flag2=1;
        end
    end
    %每天组装的WPCR
    if i==1
        s=WPCR(i);%可组装最小数量
        u=min(fix(x./[A_x,B_x,C_x]));%可组装最大数量
    else
        s=WPCR(i)-KC_WPCR(i+nn-1);
        u=min(fix([x+KC(:,i+nn-1)']./[A_x,B_x,C_x]));
    end
    %更新SC、KC、SY矩阵
    %生产
    SC_WPCR(i+nn)=randi([s,u]);
    SC(:,i+nn-1)=SC(:,i+nn-1)+x';
    SC_x(1:3,i)=D_x(1:3).*SC(1,i+nn-1);
    SC_x(4:5,i)=D_x(4:5).*SC(2,i+nn-1);
    SC_x(6:8,i)=D_x(6:8).*SC(3,i+nn-1);
    %放库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn-1)+SC_WPCR(i+nn);
    KC(:,i+nn-1)=KC(:,i+nn-2)+SC(:,i+nn-1);
    if i==1
       KC_x(:,i+nn-2)=SC_x(:,i+nn-2);
    else
       KC_x(:,i+nn-2)=KC_x(:,i+nn-3)+SC_x(:,i+nn-2);
    end
    %使用
    SY_WPCR(i+nn)=WPCR(i);
    SY(:,i+nn)=[A_x;B_x;C_x].*SY_WPCR(i+nn);
    SY_x(1:3,i+nn-1)=D_x(1:3).*SY(1,i+nn);
    SY_x(4:5,i+nn-1)=D_x(4:5).*SY(2,i+nn);
    SY_x(6:8,i+nn-1)=D_x(6:8).*SY(3,i+nn);
    %更新库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn)-WPCR(i);
    KC(:,i+nn)=KC(:,i+nn-1)-SY(:,i+nn);
    KC_x(:,i+nn-1)=KC_x(:,i+nn-2)-SY_x(:,i+nn-1);
end
X=[SC_WPCR(:,nn+1:end);SC(:,nn:end-1)];
X=reshape(X',1,28);
end
X1=[SC_WPCR(:,nn+1:end);SC(:,nn+1:end)];%生产
X2=[SC_x(:,nn+1:end)];%生产ABC小件
X3=[KC_WPCR(:,nn+1:end);KC(:,nn+1:end)];%库存ABC
X4=[KC_x(:,nn+1:end)];%库存ABC小件
X1(find(X1>0))=1;
X2(find(X2>0))=1;
%最优情况,小件无库存但是有生产准备费用
f1=(sum(X1.*[W(1);W(2);W(6);W(9)],1)+sum(X2.*[W(3:5)';W(7:8)';W(10:12)'],1))';
f2=(sum(X3.*C([1,2,6,9])',1)+sum(X4.*C([3,4,5,7,8,10,11,12])',1))';
F=sum(f1)+sum(f2);
function [F,f1,f2]=fun2(X,WPCR,A_x,B_x,C_x,W,C,D_x)
%初始化变量、计算目标函数值
X=reshape(X',7,4);
nn=2;
KC_WPCR=zeros(1,length(WPCR)+nn);%记录每天WPCR库存
KC=zeros(3,length(WPCR)+nn);%记录每天ABC库存
KC_x=zeros(8,length(WPCR)+nn);%记录每天ABC小件库存
SY_WPCR=zeros(1,length(WPCR)+nn);%记录每天交付WPCR情况
SY=zeros(3,length(WPCR)+nn);%记录每天使用ABC情况
SY_x=zeros(8,length(WPCR)+nn);%记录每天使用ABC小件情况
SC_WPCR=zeros(1,length(WPCR)+nn);%记录每天组装WPCR情况
SC=zeros(3,length(WPCR)+nn);%记录每天生产ABC情况
SC_x=zeros(8,length(WPCR)+nn);%记录每天生产ABC小件情况
for i=1:length(WPCR)%循环遍历每个WPCR
    x=X(i,2:4);
    %更新SC、KC、SY矩阵
    %生产
    SC_WPCR(i+nn)=X(i,1);
    SC(:,i+nn-1)=SC(:,i+nn-1)+x';
    SC_x(1:3,i)=D_x(1:3).*SC(1,i+nn-1);
    SC_x(4:5,i)=D_x(4:5).*SC(2,i+nn-1);
    SC_x(6:8,i)=D_x(6:8).*SC(3,i+nn-1);
    %放库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn-1)+SC_WPCR(i+nn);
    KC(:,i+nn-1)=KC(:,i+nn-2)+SC(:,i+nn-1);
    if i==1
       KC_x(:,i+nn-2)=SC_x(:,i+nn-2);
    else
       KC_x(:,i+nn-2)=KC_x(:,i+nn-3)+SC_x(:,i+nn-2);
    end
    %使用
    SY_WPCR(i+nn)=WPCR(i);
    SY(:,i+nn)=[A_x;B_x;C_x].*SY_WPCR(i+nn);
    SY_x(1:3,i+nn-1)=D_x(1:3).*SY(1,i+nn);
    SY_x(4:5,i+nn-1)=D_x(4:5).*SY(2,i+nn);
    SY_x(6:8,i+nn-1)=D_x(6:8).*SY(3,i+nn);
    %更新库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn)-WPCR(i);
    KC(:,i+nn)=KC(:,i+nn-1)-SY(:,i+nn);
    KC_x(:,i+nn-1)=KC_x(:,i+nn-2)-SY_x(:,i+nn-1);
end
X1=[SC_WPCR(:,nn+1:end);SC(:,nn+1:end)];%生产
X2=[SC_x(:,nn+1:end)];%生产ABC小件
X3=[KC_WPCR(:,nn+1:end);KC(:,nn+1:end)];%库存ABC
X4=[KC_x(:,nn+1:end)];%库存ABC小件
X1(find(X1>0))=1;
X2(find(X2>0))=1;
%最优情况,小件无库存但是有生产准备费用
f1=(sum(X1.*[W(1);W(2);W(6);W(9)],1)+sum(X2.*[W(3:5)';W(7:8)';W(10:12)'],1))';
f2=(sum(X3.*C([1,2,6,9])',1)+sum(X4.*C([3,4,5,7,8,10,11,12])',1))';
F=sum(f1)+sum(f2);
function J=jianyan2(X,WPCR,A_x,B_x,C_x,D_x)
%检验变量参与运算后是否出现小于0的值,是则不满足条件
X=X';
nn=2;
KC_WPCR=zeros(1,length(WPCR)+nn);%记录每天WPCR库存
KC=zeros(3,length(WPCR)+nn);%记录每天ABC库存
KC_x=zeros(8,length(WPCR)+nn);%记录每天ABC小件库存
SY_WPCR=zeros(1,length(WPCR)+nn);%记录每天交付WPCR情况
SY=zeros(3,length(WPCR)+nn);%记录每天使用ABC情况
SY_x=zeros(8,length(WPCR)+nn);%记录每天使用ABC小件情况
SC_WPCR=zeros(1,length(WPCR)+nn);%记录每天组装WPCR情况
SC=zeros(3,length(WPCR)+nn);%记录每天生产ABC情况
SC_x=zeros(8,length(WPCR)+nn);%记录每天生产ABC小件情况
for i=1:length(WPCR)%循环遍历每个WPCR
    x=X(i,2:4);
    %更新SC、KC、SY矩阵
    %生产
    SC_WPCR(i+nn)=X(i,1);
    SC(:,i+nn-1)=SC(:,i+nn-1)+x';
    SC_x(1:3,i)=D_x(1:3).*SC(1,i+nn-1);
    SC_x(4:5,i)=D_x(4:5).*SC(2,i+nn-1);
    SC_x(6:8,i)=D_x(6:8).*SC(3,i+nn-1);
    %放库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn-1)+SC_WPCR(i+nn);
    KC(:,i+nn-1)=KC(:,i+nn-2)+SC(:,i+nn-1);
    if i==1
       KC_x(:,i+nn-2)=SC_x(:,i+nn-2);
    else
       KC_x(:,i+nn-2)=KC_x(:,i+nn-3)+SC_x(:,i+nn-2);
    end
    %使用
    SY_WPCR(i+nn)=WPCR(i);
    SY(:,i+nn)=[A_x;B_x;C_x].*SY_WPCR(i+nn);
    SY_x(1:3,i+nn-1)=D_x(1:3).*SY(1,i+nn);
    SY_x(4:5,i+nn-1)=D_x(4:5).*SY(2,i+nn);
    SY_x(6:8,i+nn-1)=D_x(6:8).*SY(3,i+nn);
    %更新库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn)-WPCR(i);
    KC(:,i+nn)=KC(:,i+nn-1)-SY(:,i+nn);
    KC_x(:,i+nn-1)=KC_x(:,i+nn-2)-SY_x(:,i+nn-1);
end
if length(find(KC_WPCR<0))>0 | length(find(KC<0))>0 | length(find(KC_x<0))>0
    J=1;
else
    J=0;
end

7. Estabelecimento e solução do modelo do problema três

7.1 Estabelecimento do terceiro modelo de problema

7.1.1 Determinação de variáveis ​​de tempo

Nesta questão, o tempo mudou de 7 dias para 30 semanas e 210 dias, então a variável tempo é
d ∈ ( − 1 , 0 , 1 , . . . , 208 , 209 , 210 ) (29) d ∈ (- 1,0, 1, ..., 208, 209, 210) \tag{29}d(1 ,0 , 1 , ... , 208 ,209 ,210 )( 29 )

d=-1 é o sábado da semana anterior na semana 1 e d=0 é o domingo da semana anterior na semana 1. d=1 é a segunda-feira da 1ª semana, que é o primeiro dia da 30ª semana; d=210 é o domingo da 30ª semana, que é o último dia da 30ª semana.

7.1.2 0-1 variáveis ​​para tempo de inatividade

Na modelagem, ao encontrar o problema de que uma variável pode assumir vários valores inteiros, um conjunto de variáveis ​​0-1 pode ser usado para substituir a variável, aproveitando a propriedade de que uma variável 0-1 é uma variável binária. Portanto, em virtude desta propriedade, um conjunto de variáveis ​​0-1 é introduzido para substituir uma variável 0-1 de tempo de inatividade.

Tomando como exemplo a primeira data de manutenção, o modelo para o primeiro dia de manutenção é estabelecido da seguinte forma:

checki = { 1 Inspeção no dia i 0 Sem inspeção no dia i(29) check_i=\begin{cases} 1 & Inspeção no dia i \\ 0 & Sem inspeção no dia i \\ \end{cases}\tag {29 }ch e k _eu={ 10Dia eu para ser revistoSem manutenção no dia i( 29 )

insira a descrição da imagem aqui

Na fórmula acima, a primeira fórmula é uma variável 0-1, o que significa se a primeira data de manutenção é o dº dia. Como o primeiro dia de manutenção só pode ser em um dos 210 dias, ou seja, pode ser apenas um dia, a segunda fórmula acima é introduzida para restrições.

Para obter facilmente o valor específico da data da primeira manutenção, a terceira fórmula na fórmula acima é introduzida em virtude da propriedade de que a variável 0-1 é uma variável binária. Por exemplo, a data da 1ª revisão é o 3º dia, então

θ 13 = 1 (31) θ_{13}=1 \tag{31}eu13=1( 31 )
θ 11 = θ 12 = θ 14 = . . . = θ 11 = θ 1 ( 210 ) = 0 (31) θ_{11}=θ_{12}=θ_{14}=...=θ_{11}=θ_{1(210)}=0 \tag{ 31}eu11=eu12=eu14=...=eu11=eu1 ( 210 )=0( 31 )

Neste momento, a segunda fórmula da fórmula (30) foi satisfeita.
Então a terceira fórmula de (30) pode ser transformada em:
cheque 1 = 2 1 θ 11 + 2 2 θ 12 + . . . + 2 210 θ ( 1 ) 210 = 2 1 × 0 + 2 2 × 0 + 2 3 × 1 + . . . + 2 210 × 0 = 2 3 (31) check_{1}=2^1θ_{11}+2^2θ_{12}+...+2^{210}θ_{( 1) 210} =2^1 \times 0+2^2 \times 0+2^3 \times 1+...+2^{210} \times 0=2^3 \tag{31}ch e k _1=21 eu11+22 eu12+...+2210 eu( 1 ) 210=21×0+22×0+23×1+...+2210×0=23( 31 )

Através da quarta fórmula de (30), a data da primeira inspeção pode ser obtida diretamente, da seguinte forma:
check D ate 1 = log 2 check 1 = log 2 ( 2 3 ) = 3 (32) checkDate_1=log_2^ {check1 }=log_2^{(2^3)}=3 \tag{32}h ec k D a t e _1=l o g2ch e k 1 _=l o g2( 23 )=3( 32 )

Portanto, as variáveis ​​0-1 de 7 inspeções são obtidas da seguinte forma:
insira a descrição da imagem aqui
onde chechDate t é a data específica da t-ésima inspeção.

7.1.3 Intervalo de inspeção

Para dar o intervalo de 6 dias entre duas datas de inspeção de forma mais conveniente, a ordem de 7 inspeções é limitada primeiro, ou seja, o checkDate t é ordenado primeiro, da seguinte forma:
chech D ate i < chech D ate i + 1 , i ∈ ( 1 , 2 , 3...5 , 6 ) (34) chechDate~i~ <chechDate~i+1~ ,i∈(1,2,3...5,6)\tag{34}c h e c h D a t e i  <c h e c h D a t e i +1 , eu( 1 ,2 ,3...5 ,6 )( 34 )

Após a triagem, é dada uma restrição de 6 dias entre duas datas de inspeção, como segue:

chech D ate i + 6 < chech D ate i + 1 , i ∈ ( 1 , 2 , 3...5 , 6 ) (35) chechDate~i~ +6< chechDate~i+1~ ,i∈(1 ,2,3...5,6)\tag{35}c h e c h D a t e i  +6<c h e c h D a t e i +1 , eu( 1 ,2 ,3...5 ,6 )( 35 )

7.1.4 Definindo a Matriz de Limite de Tempo Total de Trabalho

O tempo de produção nesta questão mudou de 7 dias para 210 dias em 30 semanas, então redefina a matriz de limite total de horas de trabalho:
insira a descrição da imagem aqui

Entre eles, T d é o limite total de horas de trabalho no dia d da semana.

Portanto, as restrições que satisfazem o limite total de homem-hora são as seguintes:

3 × MA d + 5 × MB d + 5 × MC d ⩽ T bigd (37) 3 \times MA~d~ +5\times MB~d~ +5\times MC_d\leqslant Tbig_d \tag{37}3×M A d  +5×MB d  +5×M CdT ser gd( 37 )

7.1.5 As restrições ao total de horas de trabalho são relaxadas após a manutenção

Após a revisão do equipamento, a capacidade de produção foi melhorada. Após o primeiro dia após a revisão, o prazo total de produção é relaxado em 10%, 8%, ..., 2% e 0%. Portanto, após a determinação das datas específicas das 7 inspeções, os valores na matriz de limite máximo total homem-hora podem ser alterados para atender ao relaxamento após a inspeção. Altere a fórmula para ficar assim:

T grande (chech Data + offset) = T big (chech Data + offset) × (1 + (0,1 − 0,02 × offset)) (38) Tbig_{(chechDate+offset)}= Tbig_{(chechDate+offset) } \times (1+(0,1-0,02 \times offset)) \tag{38}T ser g( c h ec h D a t e + off set t ) _=T ser g( c h ec h D a t e + off set t ) _×( 1+( 0,10,02×o ff set ) )( 38 )

deslocamento ∈ ( 0 , 1 , . . . 4 , 5 ) deslocamento ∈(0,1,...4,5)off set _ _( 0 ,1 ,...4 ,5 )

Dentre eles, 1, offset é o offset de data, que é compensado para trás a partir da data de cada manutenção, e o relaxamento do limite é reduzido em 2% para cada offset. Quando o deslocamento atinge 5 vezes, o relaxamento do limite é reduzido para 0% e o deslocamento é interrompido.

7.1.6 Nenhum componente pode ser produzido no dia da inspeção

No dia da manutenção do equipamento, nenhum componente pode ser produzido, ou seja, a saída de componentes grandes, componentes pequenos e robôs no dia da manutenção é 0, então as restrições são as seguintes:

MA 1 j = MA 2 j = MA 3 j = MB 1 j = MB 2 j = MC 1 j = MC 2 j = MC 3 j = 0 MA1_j=MA2_j=MA3_j=MB1_j=MB2_j=MC1_j=MC2_j=MC3_j=0MA 1 _j=MA 2 _j=MA 3 _j=MB 1j=MB 2j=MC 1j=MC 2j=MC 3j=0
MA j = MB j = MC j = MW j = 0 (39) MA_j=MB_j=MC_j=MW_j=0 \tag{39}MA _j=M Bj=M Cj=M Wj=0( 39 )
j ∈ ( verifique D atet , t ∈ ( 1 , 2 , . . . 6 , 7 ) ) j∈(checkDate_t,t∈(1,2,...6,7))j( verifique D a t e _ _ _t,t( 1 ,2 ,...6 ,7 ))

7.1.7 Garantir que a produção possa continuar

Para garantir que após o final de 30 semanas e 210 dias, a demanda do pedido ainda possa ser atendida na 31ª semana de segunda-feira, ou seja, no 211º dia, então a quantidade de produção MW do robô no 211º dia e o restante quantidade SW11- do robô no dia 210 não deve ser inferior ao dia 211. DW.1, a quantidade de demanda do robô do céu, o princípio é o mesmo que o de 6.1.5. As restrições são as seguintes:

MW 211 + SW 211 − 1 ⩾ DW 211 (40) MW_{211}+SW_{211-1}\geqslant DW_{211} \tag{40}M W211+S W211 - 1D W211( 40 )

A pergunta não fornece a demanda do robô no 211º dia DW_{211}, aqui os dados de segunda-feira de 30 semanas são calculados e arredondados para obter DW 211 =38.

Outras restrições e funções objetivo não foram alteradas no modelo do problema 2, portanto não serão repetidas aqui.

7.2 A solução do problema dos três modelos

Use o MATLAB para escrever o código para obter o resultado da questão três.
insira a descrição da imagem aqui

clear
clc
%每天WPCR需求量
WPCR=[39 36 38 40 37 33 40
39 33 37 43 34 30 39
42 36 35 38 36 35 41
38 36 36 48 34 35 39
38 36 40 40 40 34 39
40 30 36 40 34 36 37
41 36 41 41 38 29 43
33 31 40 42 42 30 40
35 36 38 33 35 37 41
43 35 42 37 36 33 39
38 32 41 36 40 31 34
37 37 41 39 38 35 38
38 38 33 42 42 29 33
39 37 44 38 35 36 38
40 39 38 38 37 34 44
35 36 38 39 39 39 39
43 28 39 41 38 30 38
35 37 40 41 40 35 41
36 35 40 41 37 38 36
37 38 39 41 38 37 44
37 37 37 36 39 33 41
39 37 42 37 36 28 43
40 32 35 45 40 34 43
38 36 37 36 40 28 45
38 40 38 36 35 40 42
31 31 44 36 31 36 40
40 36 34 43 35 32 39
33 33 36 41 34 38 40
35 34 37 37 39 36 40
37 41 39 41 36 32 44];
WPCR=reshape(WPCR',210,1)';
WPCR=[WPCR,WPCR(1:2)];
%一个WPCR队ABC需求比例
A_x=3;
B_x=4;
C_x=5;
D_x=[6;8;2;2;4;8;2;12];
%每天总工时
T=repmat([4500 2500 2750 2100 2500 2750 1500],1,30);
T=[T(end),T,T(1)];
%ABC单位工时消耗
TA=3;
TB=5;
TC=5;
%生产准备费用:A A1 A2 A3 B B1 B2 C C1 C2 C3
W=[240 120 40 60 50 160 80 100 180 60 40 70];
%单件库存费用:A A1 A2 A3 B B1 B2 C C1 C2 C3
C=[5 2 5 3 6 1.5 4 5 1.7 3 2 3];

%模拟退火-粒子群算法
T0=100; %初始化温度值
T_min=1; %设置温度下界
alpha=0.9; %温度的下降率
c1=0.4;c2=0.6; %学习因子
wmax=0.6;wmin=0.4; %惯性权重
num=2; %颗粒总数
X=[];
A=[];
F=[];
for i=1:num
    [X(i,:),A(i,:),F(i,1)]=chushihua3(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C,D_x);
end
%以最小化为例
[bestf,a]=min(F);
bestx=X(a,:);
bestA=A(a,:);
trace(1)=bestf;
while(T0>T_min)
    XX=[];
    FF=[];
    AA=[];
 for i=1:num
        [XX(i,:),AA(i,:),FF(i,1)]=chushihua3(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C,D_x);
        delta=FF(i,1)-F(i,1);
        if delta<0
            F(i,1)=FF(i,1);
            X(i,:)=XX(i,:);
            A(i,:)=AA(i,:);
        else
            P=exp(-delta/T0);
            if P>rand
                F(i,1)=FF(i,1);
                X(i,:)=XX(i,:);
                A(i,:)=AA(i,:);
            end
        end  
    end
    fave=mean(F);
    fmin=min(F);
    for i=1:num
        %权重更新
        if F(i)<=fave
            w=wmin+(F(i)-fmin)*(wmax-wmin)/(fave-fmin);
        else
            w=wmax;
        end
        [~,b]=min(F);
        best=X(b,:);%当前最优解
        %粒子群算法限制最多找10次位置
        m=1;
        flag=0;
        while flag==1
        v=w.*randn(1,28)+c1*rand*(best-X(i,:))+c2*rand*(bestx-X(i,:));%速度
        XX(i,:)=round(X(i,:)+v);%更新位置
        XX(i,:)=max(XX(i,:),0);%不能小于0
        %检验,不满足条件则返回之前的变量
        x=reshape(XX(i,:)',7,4)';%重新排列矩阵维度
        J=jianyan3(x,AA(i,:),WPCR,A_x,B_x,C_x);
        if (length(find((sum(x(2:4,:).*[TA;TB;TC],1)-T)>0))==0 & sum(x(1,:))>=sum(WPCR) & J==0) | m==10
            XX(i,:)=X(i,:);
        else
            m=m+1;
        end
        end
        %计算目标函数
        FF(i,1)=fun3(XX(i,:),AA(i,:),WPCR,A_x,B_x,C_x,W,C,D_x);
        %更新最优
        if FF(i,1)<F(i,1)
            F(i,1)=FF(i,1);
            X(i,:)=XX(i,:);
            A(i,:)=AA(i,:);
        end 
    end
    if min(F)<bestf
        [bestf,a]=min(F);
        bestx=X(a,:);
        bestA=A(a,:);
    end
    trace=[trace;bestf];
    T0=T0*alpha;
end
disp('最优解为:')
disp('停检时间')
disp(bestA)
disp('WPCR组装数量、A组装数量、B组装数量、C组装数量,见工作区矩阵zz')
x=reshape(bestx',212,4);
zz=[x(1:210,1),x(2:211,2:4)];
disp('生产准备费用、库存费用见工作区矩阵f1、f2')
[~,f1,f2]=fun3(bestx,bestA,WPCR,A_x,B_x,C_x,W,C,D_x);
disp('总费用')
disp(bestf)
figure
plot(trace)
xlabel('迭代次数')
ylabel('函数值')
title('模拟退火算法')
legend('最优值')
function [X,b,F]=chushihua3(WPCR,A_x,B_x,C_x,T,TA,TB,TC,W,C,D_x)
%初始化变量、计算目标函数值,小件提前两天,大件提前1天
flag1=0;
while flag1==0
%检修
flag3=0;
while flag3==0
    A=zeros(1,length(WPCR));
    a=10+randperm(length(WPCR)-20);
    aa=a(1:7);
    A(aa)=1;
    b=find(A==1);
    c=b(2:end)-b(1:end-1);
    d=find(c<6);
    if length(d)==0
        flag3=1;
    end
end
%检修后提高效率
AA=[];%对应的时间
for i=1:length(b)
    AA=[AA,b(i)+1:b(i)+5];
end
G=repmat([1.1 1.08 1.06 10.4 1.02],1,length(b));
TT=T;
TT(AA)=TT(AA).*G;
X=[];
nn=2;%延迟天数
flag1=1;
KC_WPCR=zeros(1,length(WPCR)+nn);%记录每天WPCR库存
KC=zeros(3,length(WPCR)+nn);%记录每天ABC库存
KC_x=zeros(8,length(WPCR)+nn);%记录每天ABC小件库存
SY_WPCR=zeros(1,length(WPCR)+nn);%记录每天交付WPCR情况
SY=zeros(3,length(WPCR)+nn);%记录每天使用ABC情况
% SY_x=zeros(8,length(WPCR)+nn);%记录每天使用ABC小件情况
SC_WPCR=zeros(1,length(WPCR)+nn);%记录每天组装WPCR情况
SC=zeros(3,length(WPCR)+nn);%记录每天生产ABC情况
SC_x=zeros(8,length(WPCR)+nn);%记录每天生产ABC小件情况
for i=1:length(WPCR)%循环遍历每个WPCR
    if i==1%假设第一天刚好满足WPCR
        sub=[A_x,B_x,C_x].*WPCR(i);%求出每天的WPCR最小ABC需求量
        up=sub;
    else
        sub=max([A_x,B_x,C_x].*WPCR(i)-KC(:,i+nn-1)',0);%除了第一天,每天减去前一天的库存则为当天至少增加的需求量
        up=[];
        up(1)=fix((T(i)-sub([2,3])*[TB;TC])/TA);%BC最低供应时,A最大供应量
        up(2)=fix((T(i)-sub([1,3])*[TA;TC])/TB);%AC最低供应时,B最大供应量
        up(3)=fix((T(i)-sub([1,2])*[TA;TB])/TC);%AC最低供应时,B最大供应量
        up=min(up,fix(T(i)./([A_x,B_x,C_x]*[TA;TB;TC])*2).*[A_x,B_x,C_x]);
    end
    %前面的变量会影响后面的变量范围,可能会出现上up小于sub的情况,毕竟有最大工时限制
    if length(find((up-sub)<0))>0%如果出现则重新生成
        flag1=0;
        continue
    end
    flag2=0;
    while flag2==0
        x=[randi([sub(1),up(1)]),randi([sub(2),up(2)]),randi([sub(3),up(3)])];%在区间内随机生成整数
        if i==1
            flag2=1;
        elseif i>1
            if x*[TA;TB;TC]<=T(i)%需求量必须满足在工时限制内
                flag2=1;
            end
        end
    end
    %每天组装的WPCR
    if i==1
        s=WPCR(i);%可组装最小数量
        u=min(fix(x./[A_x,B_x,C_x]));%可组装最大数量
    else
        s=max(WPCR(i)-KC_WPCR(i+nn-1),0);
        u=min(fix([x+KC(:,i+nn-1)']./[A_x,B_x,C_x]));
    end
    if u<s
        flag1=0;
        continue
    end
    %更新SC、KC、SY矩阵
    %生产
    if length(find(b==i))==1
        SC_WPCR(i+nn)=0;
    else
        SC_WPCR(i+nn)=randi([s,u]);
    end
    if length(find(b==i-1))==1
        SC(:,i+nn-1)=0;
    else
        SC(:,i+nn-1)=SC(:,i+nn-1)+x';
    end
    %放库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn-1)+SC_WPCR(i+nn);
    if KC_WPCR(i+nn)<0
        KC_WPCR(i+nn)=0;
    end
    if i==1
        KC(:,i+nn-1)=SC(:,i+nn-1);
    else
        KC(:,i+nn-1)=KC(:,i+nn-1)+SC(:,i+nn-1);
    end
    KC_x(1:3,i+nn-2)=D_x(1:3).*SC(1,i+nn-1);
    KC_x(4:5,i+nn-2)=D_x(4:5).*SC(2,i+nn-1);
    KC_x(6:8,i+nn-2)=D_x(6:8).*SC(3,i+nn-1);
    %使用
    SY_WPCR(i+nn)=WPCR(i);
    SY(:,i+nn)=[A_x;B_x;C_x].*SY_WPCR(i+nn);
    %更新库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn)-WPCR(i);
    KC(:,i+nn)=KC(:,i+nn-1)-SY(:,i+nn);
end
X=[SC_WPCR(:,nn+1:end);SC(:,nn:end-1)];
X=reshape(X',1,848);
end
X1=[SC_WPCR(:,nn+1:end-2);SC(:,nn+1:end-2)];%生产
X3=[KC_WPCR(:,nn+1:end-2);KC(:,nn+1:end-2)];%库存ABC
X4=[KC_x(:,nn+1:end-2)];%库存ABC小件
X1(find(X1>0))=1;
X2=[repmat(X1(2,:),3,1);repmat(X1(3,:),2,1);repmat(X1(4,:),3,1)];
X2(:,b)=0;
%最优情况,小件无库存但是有生产准备费用
f1=(sum(X1.*[W(1);W(2);W(6);W(9)],1)+sum(X2.*[W(3:5)';W(7:8)';W(10:12)'],1))';
f2=(sum(X3.*C([1,2,6,9])',1)+sum(X4.*C([3,4,5,7,8,10,11,12])',1))';
F=sum(f1)+sum(f2);
function [F,f1,f2]=fun3(X,b,WPCR,A_x,B_x,C_x,W,C,D_x)
%初始化变量、计算目标函数值
X=reshape(X',212,4);
nn=2;
KC_WPCR=zeros(1,length(WPCR)+nn);%记录每天WPCR库存
KC=zeros(3,length(WPCR)+nn);%记录每天ABC库存
KC_x=zeros(8,length(WPCR)+nn);%记录每天ABC小件库存
SY_WPCR=zeros(1,length(WPCR)+nn);%记录每天交付WPCR情况
SY=zeros(3,length(WPCR)+nn);%记录每天使用ABC情况
% SY_x=zeros(8,length(WPCR)+nn);%记录每天使用ABC小件情况
SC_WPCR=zeros(1,length(WPCR)+nn);%记录每天组装WPCR情况
SC=zeros(3,length(WPCR)+nn);%记录每天生产ABC情况
SC_x=zeros(8,length(WPCR)+nn);%记录每天生产ABC小件情况
for i=1:length(WPCR)%循环遍历每个WPCR
    x=X(i,2:4);
    %更新SC、KC、SY矩阵
    %生产
    if length(find(b==i))==1
        SC_WPCR(i+nn)=0;
    else
        SC_WPCR(i+nn)=X(i,1);
    end
    if length(find(b==i-1))==1
        SC(:,i+nn-1)=0;
    else
        SC(:,i+nn-1)=SC(:,i+nn-1)+x';
    end
    %放库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn-1)+SC_WPCR(i+nn);
    if KC_WPCR(i+nn)<0
        KC_WPCR(i+nn)=0;
    end
    if i==1
        KC(:,i+nn-1)=SC(:,i+nn-1);
    else
        KC(:,i+nn-1)=KC(:,i+nn-1)+SC(:,i+nn-1);
    end
    KC_x(1:3,i+nn-2)=D_x(1:3).*SC(1,i+nn-1);
    KC_x(4:5,i+nn-2)=D_x(4:5).*SC(2,i+nn-1);
    KC_x(6:8,i+nn-2)=D_x(6:8).*SC(3,i+nn-1);
    %使用
    SY_WPCR(i+nn)=WPCR(i);
    SY(:,i+nn)=[A_x;B_x;C_x].*SY_WPCR(i+nn);
    %更新库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn)-WPCR(i);
    KC(:,i+nn)=KC(:,i+nn-1)-SY(:,i+nn);
end
X1=[SC_WPCR(:,nn+1:end-2);SC(:,nn+1:end-2)];%生产
X3=[KC_WPCR(:,nn+1:end-2);KC(:,nn+1:end-2)];%库存ABC
X4=[KC_x(:,nn+1:end-2)];%库存ABC小件
X1(find(X1>0))=1;
X2=[repmat(X1(2,:),3,1);repmat(X1(3,:),2,1);repmat(X1(4,:),3,1)];
X2(:,b)=0;
%最优情况,小件无库存但是有生产准备费用
f1=(sum(X1.*[W(1);W(2);W(6);W(9)],1)+sum(X2.*[W(3:5)';W(7:8)';W(10:12)'],1))';
f2=(sum(X3.*C([1,2,6,9])',1)+sum(X4.*C([3,4,5,7,8,10,11,12])',1))';
F=sum(f1)+sum(f2);
function J=jianyan3(X,b,WPCR,A_x,B_x,C_x,D_x)
%检验变量参与运算后是否出现小于0的值,是则不满足条件
X=X';
nn=2;
KC_WPCR=zeros(1,length(WPCR)+nn);%记录每天WPCR库存
KC=zeros(3,length(WPCR)+nn);%记录每天ABC库存
KC_x=zeros(8,length(WPCR)+nn);%记录每天ABC小件库存
SY_WPCR=zeros(1,length(WPCR)+nn);%记录每天交付WPCR情况
SY=zeros(3,length(WPCR)+nn);%记录每天使用ABC情况
SY_x=zeros(8,length(WPCR)+nn);%记录每天使用ABC小件情况
SC_WPCR=zeros(1,length(WPCR)+nn);%记录每天组装WPCR情况
SC=zeros(3,length(WPCR)+nn);%记录每天生产ABC情况
SC_x=zeros(8,length(WPCR)+nn);%记录每天生产ABC小件情况
for i=1:length(WPCR)%循环遍历每个WPCR
    x=X(i,2:4);
    %更新SC、KC、SY矩阵
    %生产
    if length(find(b==i))==1
        SC_WPCR(i+nn)=0;
    else
        SC_WPCR(i+nn)=X(i,1);
    end
    if length(find(b==i-1))==1
        SC(:,i+nn-1)=0;
    else
        SC(:,i+nn-1)=SC(:,i+nn-1)+x';
    end
    %放库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn-1)+SC_WPCR(i+nn);
    if KC_WPCR(i+nn)<0
        KC_WPCR(i+nn)=0;
    end
    if i==1
        KC(:,i+nn-1)=SC(:,i+nn-1);
    else
        KC(:,i+nn-1)=KC(:,i+nn-1)+SC(:,i+nn-1);
    end
    KC_x(1:3,i+nn-2)=D_x(1:3).*SC(1,i+nn-1);
    KC_x(4:5,i+nn-2)=D_x(4:5).*SC(2,i+nn-1);
    KC_x(6:8,i+nn-2)=D_x(6:8).*SC(3,i+nn-1);
    %使用
    SY_WPCR(i+nn)=WPCR(i);
    SY(:,i+nn)=[A_x;B_x;C_x].*SY_WPCR(i+nn);
    %更新库存
    KC_WPCR(i+nn)=KC_WPCR(i+nn)-WPCR(i);
    KC(:,i+nn)=KC(:,i+nn-1)-SY(:,i+nn);
end
if length(find(KC_WPCR<0))>0 | length(find(KC<0))>0 | length(find(KC_x<0))>0
    J=1;
else
    J=0;
end

8. Estabelecimento e solução do modelo do quarto problema

8.1 O estabelecimento dos quatro modelos do problema

8.1.1 Análise de Dados

Esta questão precisa prever a demanda de uso de robôs na 31ª semana. De acordo com a análise de dados dada pela questão, a flutuação dos dados tem uma certa periodicidade, e são dados de séries temporais. Existe apenas uma variável dependente: o número de robôs usados. Em seguida, com o número de robôs utilizados como variável dependente, é estabelecido um modelo de previsão de demanda de robôs baseado na análise de séries temporais univariadas.

Como os dados com semanas como variável de tempo não fornecem um período específico, considere dividir os dados em um grupo de treinamento e um grupo experimental, use diferentes períodos de duração para modelar o grupo de treinamento, exclua os modelos que passam no teste Q e em seguida, use os dados do grupo experimental. Os dados determinam qual modelo prevê o melhor. Selecione o modelo com o menor erro de previsão, use todos os dados para remodelar e faça previsões sobre dados futuros. Finalmente, desenhe o diagrama de série temporal previsto para julgar se a tendência prevista é razoável.

8.1.2 Pré-processamento de Dados

Observando dados por 30 semanas e 201 dias, sem dados perdidos. Defina uma variável de tempo em semanas, desenhe um gráfico de série temporal com o tempo como eixo horizontal e o número de robôs como eixo vertical. Analise o gráfico de série temporal e descubra que os dados flutuam para cima e para baixo dentro de um determinado intervalo, sem tendência ou sazonalidade.

8.1.3 Estabelecimento de modelo de previsão baseado em séries temporais univariadas

Os dados do grupo de treinamento são uma sequência com uma duração de ciclo de 7, e o modelo de análise de série temporal ideal é estabelecido usando o modelador especialista SPSS. O Expert Modeler encontra automaticamente o melhor modelo de ajuste para cada sequência dependente. Se uma variável independente (preditora) for especificada, o modelador especialista seleciona para o conteúdo do modelo ARIMA aqueles modelos que possuem uma relação estatisticamente significativa com a série dependente. As variáveis ​​do modelo foram transformadas usando diferenças ou raízes quadradas ou transformações logarítmicas naturais, conforme apropriado. Por padrão, o Expert Modeler considera os modelos Exponential Smoothing e ARIMA. No entanto, também é possível limitar o Expert Modeler para pesquisar apenas modelos ARIMA ou apenas modelos de suavização exponencial. Você também pode especificar a detecção automática de valores discrepantes.

O sPSS Expert Modeler escolheu automaticamente o modelo ideal para nós: o modelo sazonal simples.

8.1.4 Teste de modelos preditivos

Verifique se o modelo é completamente reconhecido: Após estimar o modelo de série temporal, precisamos realizar um teste de ruído branco no resíduo. Se o resíduo for ruído branco, significa que o modelo que selecionamos pode identificar completamente a lei da série temporal , ou seja, o modelo é aceitável. ; Se o resíduo não for ruído branco, significa que ainda existe alguma informação não reconhecida pelo modelo, então ela será eliminada.

O coeficiente de autocorrelação ACF e a função de autocorrelação parcial PACF podem nos ajudar a determinar se o resíduo é ruído branco, ou seja, se a série temporal pode ser totalmente reconhecida pelo modelo.

insira a descrição da imagem aqui
Como pode ser visto na tabela acima, o valor p obtido pelo teste Q sobre os resíduos é 0,451, ou seja, não podemos rejeitar a hipótese nula e pensar que os resíduos são sequências de ruído branco, então o modelo sazonal simples pode bem identifique o robô nesta questão. Exija dados.

Comparação e seleção de modelos: Use critérios estacionários R 2 ou AIC e BIC. R 2 pode ser usado para refletir a qualidade do ajuste do modelo linear, quanto mais próximo de 1, mais preciso será o ajuste. Quanto mais parâmetros forem adicionados, melhor será o efeito de ajuste do modelo, mas isso terá o custo de aumentar a complexidade do modelo (problema de overfitting). Portanto, a seleção do modelo busca o melhor equilíbrio entre a complexidade do modelo e a capacidade do modelo de interpretar os dados. Como o BIC tem um coeficiente de penalidade maior para a complexidade do modelo, o BIC é muitas vezes mais conciso do que o modelo selecionado pelo AIC, por isso o princípio de escolher um R 2 pequeno e BIC como parâmetros para a seleção do modelo.

A expressão BIC (Critério de Informação Bayesiano) é a seguinte:

BIC = ln ( T ) (o número de parâmetros no modelo) - 2 ln (a função de máxima verossimilhança do modelo) (41) BIC=ln(T) (o número de parâmetros no modelo) - 2ln (o máximo probabilidade do modelo) função) \tag{41}B I C=l n ( T ) (número de parâmetros no modelo)2 l n (função de verossimilhança máxima do modelo)( 41 )

Obtenha os valores previstos para a semana 31: 38, 35, 39, 40, 37, 34, 40. Valores previstos para os dois primeiros dias da semana 32: 38, 35. Portanto, obtenha a matriz de quantidade de demanda do robô no dº dia de uma semana no futuro, como segue:
DW predict = [ 38 , 35 , 39 , 40 , 37 , 34 , 40 , 38 , 35 ] (42) DWpredict=[ 38,35, 39,40,37,34,40,38,35] \tag{42}D W pre d i c t _=[ 38 ,35 ,39 ,40 ,37 ,34 ,40 ,38 ,35 ]( 42 )

8.1.5 Garantir entrega normal todos os dias

Para garantir que os pedidos diários de robôs sejam entregues com uma probabilidade superior a 95%, as restrições sobre o número de robôs montados são modificadas da seguinte forma:

MW d + SW d − 1 ⩾ DW previsto × 0,95 (43) MW_{d}+SW_{d-1}\geqslant DW_{predict_d} \times 0,95 \tag{43}M Wd+S Wd - 1D Wpré d i c t _d×0,95( 43 )

8.1.6 Garantir entrega normal durante toda a semana

Para garantir que os pedidos de robôs para toda a semana possam ser entregues com uma probabilidade superior a 85%, são feitas as seguintes restrições:

∑ d = 1 7 MW d ⩾ 0,85 × ∑ d = 1 7 DW previsto (44) \sum_{d=1}^7MW_d \geqslant 0,85 \times \sum_{d=1}^7DWpredict_d \tag{44}d = 17M Wd0,85×d = 17D W pre d i c t _d( 44 )
Vale ressaltar que os pedidos diários foram entregues com probabilidade superior a 95%, e os pedidos do robô de toda a semana devem ser entregues com probabilidade superior a 85%, ou seja, equação (44) foi implícito na equação (43). Portanto, basta garantir o parto normal todos os dias, ou seja, a fórmula (43) pode ser ignorada.

Nove, a resposta padrão oficial

1. O resultado final da primeira pergunta

insira a descrição da imagem aqui

2. O resultado final da segunda pergunta

insira a descrição da imagem aqui

3. O resultado final da terceira pergunta

insira a descrição da imagem aqui

4. O resultado final da quarta questão

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/wxfighting/article/details/126279581
Recomendado
Clasificación