2022 Huashu Cup ペーパー アイデア分析 + 完全なコード (水中ロボット アセンブリ プラン)

公式の分析動画をご覧いただけます(この動画が出場者である限り、無料で視聴できます。視聴できない方のために、数日中にブログを作成することを検討します)。 、このブログの最後に公式の標準回答を掲載しました。ご参考までに。
2022 花樹杯公式問題B分析動画》》》》》》》》

ここに声明があります, 私はCの質問でHuashu Cupに参加しています. 論文とコードは他の人を参照しています, しかし、私が整理するのに一生懸命働いたのは確かにこのブログです. 私も初心者です, そして私はアイデアは自己学習に便利であり、参考用であり、優れた論文や標準的な回答などはありません。

完全なタイトル:
リンク: https://pan.baidu.com/s/16E1X35O13NWIij72OClVgQ?pwd=1234
抽出コード: 1234

記事ディレクトリ

1. トピック

ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入

2. 問題分析

ここに画像の説明を挿入

3. モデルの仮定

1.小さなコンポーネントを組み立てるための十分な材料。
2.生産工程中、工場の停電や機械の故障などの不測の事態により生産が中断されることはありません。
3.工場の資本の流れは正常であり、資本不足による生産への影響はありません。
4. 最終製品のロボットのみが外部需要を持ち、他のコンポーネントは外部に販売されません。
5. ロボットの需要は計画に応じて決定され、市場価格の変動に左右されません。

4. シンボルの説明

シンボル 例証する 単位
d 日々
MA1 d、MA2 d、MA3 d … MC3 d d日のウィジェット組立数量 個々の
SA1 d、 SA2 d、SA3 d … SC3 d d日目のウィジェットの残量 個々の
MAd MBdMCd _ d日の大型部品組立量 個々の
SAd SBdSCd _ d日の大型部品の残量 個々の
DWd _ 日 d に要求されたロボットの数 個々の
分子量d 日 d に組み立てられたロボットの数 個々の
SWd _ 日 d の残りのロボット数 個々の
T d日の総労働時間制限 勤務時間
RA1、RA2、…RB、RC コンポーネントの単位あたりの保管コスト
FA1、FA2、…、FB、FC コンポーネントの製作準備費
XWd _ 日 d にロボットを生産するかどうかの 0-1 変数 -
Rd _ d日の在庫費用
Fd _ d日生産準備費用
checkDate t t 回目のオーバーホールの日付
Tbig d d日の総労働時間制限 勤務時間
DWpredict d 将来の d 番目の曜日に要求されるロボットの数 個々の

5. 問題 1 モデルの確立と解決

5.1 問題モデルの確立

5.1.1 小さなコンポーネントが大きなコンポーネントを組み立てる

ここでは、大型部品Aの組立を例にとります。大きなコンポーネント A を組み立てるには、6 つの小さなコンポーネント A1、8 つの小さなコンポーネント A2、および 2 つの小さなコンポーネント A3 が必要です。

d日において、大部品Aの組立に使用された小部品A1の数は、d日(当日)に組立てられた小部品の数MA1dと、 -1日(昨日)に残った小部品の数である。 SA1d-1、すなわちMA1+SA1d-1ウィジェット数 A2 と A3 も同様に取得できます。

大きなコンポーネント A を組み立てるには、6 つの小さなコンポーネント A1 が必要です。A1 だけを考慮すると、組み立てることができる大きなコンポーネントの最大数は次のようになります。

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

注: ここでの記号 [ ] は切り捨てられます。つまり、それ自体より小さい最大の整数を取ります。

同様に、A2 のみを考慮する場合、組み立てることができる大型コンポーネント A の最大数は次のとおりです。

[ MA 2 d + SA 2 d − 1 8 ] (2) \left[ \begin{matrix} \frac{MA2_d+SA2_{d-1}}{8} \end{matrix} \right] \tag{2 }[82 _d+ S A 2d 1]( 2 )
A3 のみを考慮する場合、組み立て可能な大型コンポーネント A の最大数は次のとおりです。

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

したがって、d 日における大型構成部品 A の最大組立数は次のとおりです。

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 } \右]\タグ{4}[ (61 _d+ S A 1d 182 _d+ S A 2d 12M A 3d+ S A 3d 1) ]( 4 )

注:これは四捨五入する必要があります

1日に必要なロボットの数は異なりますが、注文の需要を満たすために、工場が大型部品Aを組み立てる場合、必ずしも最大値と同じである必要はありません。したがって、d 日では、大型構成部品 A の組立数量は次の制約を満たす必要があります。

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}_d[ (61 _d+ S A 1d 182 _d+ S A 2d 12M A 3d+ S A 3d 1) ]( 5 )

同様に、d 日に、大型構成部品 B と C の組立数量は、次の制約を満たす必要があります。

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 Bd[ (2MB1 _d+ SB1 _d 14MB2 _d+ SB2 _d 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}MC_d[ (8MC1 _d+ SC1 _d 12MC2 _d+ SC2 _d 112MC2 _d+ SC2 _d 1) ]( 6 )

5.1.2 残りのウィジェット

大きなコンポーネントと小さなコンポーネントを組み立てた後、小さなコンポーネントからの残り物がある場合があります。ここでは、ウィジェット A1 を例として使用します。
d 日において、ウィジェットの残りの数 A1 は、d 日に組み立てられたウィジェットの数の合計 MA1 dと、d-1 日に残っているウィジェットの数 SA1 d-1から、数の合計を引いた値を満たすものとします。日 d のウィジェットの数 d-1 Al の消費。大きなコンポーネント A を組み立てるには、6 つの小さなコンポーネント A1 が必要です。したがって、d日のAl消費量は6×MAである。したがって、d 日における A1 の残量 SA1 dは次のようになります。

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=1 _d+S A 1d 16_d( 7 )

今日の - 消費済み = 残り
(今日の組み立て済み + 昨日の残り物) - 消費済み = 残り

残りの小さなコンポーネントの数も同様に取得できます。
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=2 _d+S A 2d 18_d
SA 3 d = MA 3 d + SA 3 d − 1 − 2 ∗ MA d SA3_d=MA3_d+SA3_{d-1} -2*MA_dSA3 _ _d=M A 3d+SA3 _ _d 12_d
SB 1 d = MB 1 d + SB 1 d − 1 − 2 * MB d SB1_d=MB1_d+SB1_{d-1} -2*MB_dSB1 _d=MB1 _d+SB1 _d 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}SB2 _d=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_dSC1 _d=MC1 _d+SC1 _d 18MC_d
SC 2 d = MC 2 d + SC 2 d − 1 − 2 * MC d SC2_d=MC2_d+SC2_{d-1} -2*MC_dSC2 _d=MC2 _d+SC2 _d 12MC_d
SC3d = MC3d + SC3d − 1 − 12 *MCd SC3_d=MC3_d+SC3_{d-1} -12*MC_dSC3 _d=MC3 _d+SC3 _d 112MC_d

5.1.3 ロボットの組立数量による残りの大型部品の計算

ロボットの組み立て、つまりロボットに大きな部品を組み立てるということは、大きな部品を小さな部品に組み立てることと同じなので、d 日に組み立てられたロボットの数は次のようになります。

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}MW _d[ (31 _d+ S A 1d 14MB2 _d+ SB2 _d 15MC2 _d+ SC2 _d 1) ]( 9 )

このうち、MW dは組み立てられたロボットの数、MA dは d 日の大型部品 A の組み立て数、SA d-1は d-1 日の大型部品 A の残りの数です。

いくつかの残り物があるかもしれない大きなコンポーネントからロボットを組み立てます。次のように、ウィジェットの残りの数を計算するのと同じ方法で計算されます。

SA d = MA d + SA d − 1 − 3 ∗ MW d SA_d=MA_d+SA_{d-1} -3*MW_dS Ad=_d+S Ad 13MW _d
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 14MW _d( 10 )
SC d = MC d + SC d − 1 − 5 ∗ MW d SC_d=MC_d+SC_{d-1} -5*MW_dS Cd=MC_d+S Cd 15MW _d

5.1.4 ロボット組立数量の制約

工場で受注したロボットはすべて期限が切れた時点で納入しなければならないため、d日のロボット組立数量MW dとd- 1日のロボットの残り数量SW dの合計は、需要数量よりも多くなるはずです。 DW d 日d .
MW d + SW d − 1 ⩾ DW d (12) MW_d+SW_{d-1} \geqslant DW_d \tag{12}MW _d+南西_d 1D Wd( 12 )

5.1.5 ロボット残量

注文するボットの毎日の販売後に、いくつかの残り物がある場合があります。d日のロボットの残SWdは、d日の組立数量MW dとd- 1日の残数量SWd-1の合計から当日の注文数量DWdを差し引いたものに等しい。これは

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

5.1.6 在庫なし 残りなし

1 日目はコンポーネントの在庫なしで始まります。つまり、
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 \タグ{13}S A 10=S A 20=SA3 _ _0=SB1 _0=SB2 _0=SC1 _0=SC2 _0=SC3 _0( 13 )
SA 0 = SB 0 = SC 0 = 0 (13) SA_0=SB_0=SC_0=0 \タグ{13}S A0=S B0=S C0=0( 13 )

コンポーネントの在庫は 7 日後に残りません。

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=SA3 _ _7=SB1 _7=SB2 _7=SC1 _7=SC2 _7=SC3 _7
SA 7 = SB 7 = SC 7 = 0 (14) SA_7=SB_7=SC_7=0 \タグ{14}S A7=S B7=S C7=0( 14 )
SW7=0 SW_7=0南西_7=0

5.1.7 労働時間の制限

A を 1 個作るのに 3 時間、B を 1 個作るのに 5 時間、C を 1 個作るのに 5 時間かかります。次の制約を一度に満たす必要があります。

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×_d+5×M Bd+5×MC_dTd( 15 )

5.1.8 在庫手数料

一日の終わりに部品が在庫にある場合、工場は部品の残りの数量に比例する一定の在庫手数料を支払わなければなりません。したがって、d日の部品の残量に応じて、小型部品、大型部品、ロボットの在庫コストを表すことができます。

R small A d = RA 1 × SA 1 d + RA 2 × SA 2 d + RA 3 × SA 3 d RsmallA_d =RA1\times SA1_d+RA2\times SA2_d+RA3\times SA3_dRsmallA _ _ _ _d=R A 1×S A 1d+R A 2×S A 2d+R A 3×SA3 _ _d

R small B d = RB 1 × SB 1 d + RB 2 × SB 2 d RsmallB_d =RB1\times SB1_d+RB2\times SB2_dRB _ _d=RB1 _×SB1 _d+RB2 _×SB2 _d

R small C d = RC 1 × SC 1 d + RC 2 × SC 2 d + RC 3 × SC 3 d (16) RsmallC_d =RC1\times SC1_d+RC2\times SC2_d+RC3\times SC3_d \tag{16}RスモールC _ _d=RC1 _×SC1 _d+RC2 _×SC2 _d+RC3 _×SC3 _d( 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ビッグ_d=あら_×S Ad+RB×S Bd+RC×S Cd

このうち、RA1 は大型部品 A の単品在庫原価、SA1 dは大型部品 A の d 日の残数量です。他の記号は同じです。RsmallA d、RsmallB d、および RsmallC dは d 日の小型コンポーネント A、B、および C の在庫コスト、Rsmall は d 日の大型コンポーネントの在庫コスト、R dは d 日の在庫コストの合計です。日。
合計は d 日の在庫コストです。

R d = R small A d + R small B d + R small C d + R bigd + RW × SW d (17) R_d =RsmallA_d+RsmallB_d+RsmallC_d+Rbig_d+RW\times SW_d \tag{17}Rd=RsmallA _ _ _ _d+RB _ _d+RスモールC _ _d+Rビッグ_d+R W×南西_d( 17 )

5.1.9 生産準備費用

工場が部品製品を生産するとき、生産準備費用と呼ばれる生産量に依存しない固定費を支払う必要があります.固定費の計算を容易にするために、ここでは0-1の変数が導入されています. 例として、生産ロボットの 0-1 変数 XW dを取り上げます。ロボットが d 日に生産された場合、XW dは 1 であり、d 日にロボットが生産されなかった場合、XW dは 0 です。次のように

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}X Wd={ 10MW _d>0MW _d=0( 18 )

他のコンポーネントの 0-1 変数も同様に取得できます。

したがって、すべてのコンポーネントの 0-1 変数に従って、小さなコンポーネント、大きなコンポーネント、およびロボットの生産準備コストを表すことができます。

F small 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 s ma ll Ad=X A 1d×F A 1+X A 2d×F A 2+X A 3d×F A 3

F small B d = XB 1 d × FB 1 + XB 2 d × FB 2 FsmallB_d =XB1_d \times FB1+XB2_d \times FB2F s ma ll Bd=XB1 _d×FB1 _+XB2 _d×FB2 _

F small C d = XC 1 d × FC 1 + XC 2 d × FC 2 + XC 3 d × FC 3 (19) FsmallC_d =XC1_d \times FC1+XC2_d \times FC2+XC3_d \times FC3 \tag{19}FC _ _d=XC1 _d×FC1 _+XC2 _d×FC2 _+XC3 _d×FC3 _( 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ビッグ_d=F A×X Ad+FB×X Bd+FC×X Cd

このうち、XA1 dは d 日に Al を生産するかどうかの 0-1 変数であり、FA1 は Al の生産準備コストです。
他の記号は同じです。FsmallA d、FsmallB d、FsmallC dは、小型部品 A、B、C の d 日の生産準備費と Fbig 大型部品の d 日の在庫原価です。F dは d 日の生産準備費用です。

合計は、d 日の生産準備コストです。
F d = F small A d + F small B d + F small C d + F bigd + XW d × FW (20) F_d =FsmallA_d+FsmallB_d+FsmallC_d+Fbig_d+ XW_d\回 FW \tag{20}d=F s ma ll Ad+F s ma ll Bd+FC _ _d+Fビッグ_d+X Wd×FW _( 20 )

5.1.10 目的関数

総コストが最小、つまり、在庫コストと生産準備コストの合計が最小である必要があり、次の目的関数を取得できます。

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

ここに画像の説明を挿入

5.2 モデルの問題解決

シミュレーテッド アニーリング アルゴリズムは粒子群アルゴリズムと組み合わされ、コードは MATLAB で記述され、以下に示すように問題 1 の結果が得られます。

ここでの結果は少し問題があります。7000+ になるはずです。

ここに画像の説明を挿入

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. 問題 2 モデルの再開と解決

6.1 第二問題モデルの確立

6.1.1 小さなコンポーネントが大きなコンポーネントを組み立てる

コンポーネント A、B、および C は、WPCR を組み立てる 1 日前に作成して保管する必要があり、コンポーネント A1、A2、A3、B1、B2、C1、C2、および C3 も作成して保管する必要があります。前日にA、B、Cを組み立てます。したがって、構成部品のオーダー需要を月曜日に完了したい場合は、先週の月曜日に必要な大型構成部品 A、B、および C を日曜日に組み立てる必要があります。そして先週の日曜日、大きなコンポーネントを組み立てるために使用された小さなコンポーネントは、最後の土曜日に組み立てられる必要があります。
したがって、d 日で大部品を組み立てるために使用される小部品の数は、d-1 日で組み立てられた小部品の数と、d-1 日で残っている小部品の数の合計になります。したがって、式 (5) および (6) は、次のように大きなコンポーネントの制約を取得するために修正されます。
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 ]_d[ (61 _d 1+ S A 1d 182 _d 1+ S A 2d 12M A 3d 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]\タグ{22}M Bd[ (2MB1 _d 1+ SB1 _d 14MB2 _d 1+ SB2 _d 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]MC_d[ (8MC1 _d 1+ SC1 _d 12MC2 _d 1+ SC2 _d 112MC3 _d 1+ SC3 _d 1) ]

6.1.2 残りのウィジェット

日 d に残っているウィジェットの数、つまり、保存する必要があるウィジェットの数は、2 つの部分で見ることができます。1 つは d 日に組み立てられた小さなコンポーネントの数、もう 1 つは d 日に組み立てられた残りの大きなコンポーネントの数であり、残りの部分は d-1 日に組み立てられた小さなコンポーネントの数とd-1日目に残った少量の成分と、d日目に消費された量を差し引いたもの、

d 日残り { d 日組み立て数量 + (d 日組み立て数量 − 1 + d 日残り数量 − 1) − d 日消費数量 d 日残り \begin{cases} 日 d 組み立て数量\\ +\ \ (d-1 日に組み立てられた数量 + d-1 日に残った数量) - d-1 日に消費された数量\end{cases}残りd d組立数量+(1日で組み立てられる数量+_1日残量)d消費

したがって、ウィジェットの残りの部分は次のようになります。

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=1 _d+1 _d 1+S A 1d 16×_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=2 _d+2 _d 1+S A 2d 18×_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_dSA3 _ _d=M A 3d+M A 3d 1+SA3 _ _d 12×_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_dSB1 _d=MB1 _d+MB1 _d 1+SB1 _d 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 \タグ{23}SB2 _d=MB2 _d+MB2 _d 1+SB2 _d 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_dSC1 _d=MC1 _d+MC1 _d 1+SC1 _d 18×MC_d
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_dSC2 _d=MC2 _d+MC2 _d 1+SC2 _d 12×MC_d
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_dSC3 _d=MC3 _d+MC3 _d 1+SC3 _d 112×MC_d

6.1.3 ロボットの組立数量は、残りの大きなコンポーネントを計算します

ロボットの組み立ては、小さな部品から大きな部品への組み立てと同じで、d 日には、d-1 日の組み立てまたは残りの大きな部品を使用してロボットを組み立てます。

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}MW _d[ (31 _d 1+ S A 1d 14MB2 _d 1+ SB2 _d 15MC3 _d 1+ SC3 _d 1) ]( 24 )

次のように、大きなコンポーネントの残りの部分は、小さなコンポーネントの残りの部分と同じです。

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_dS Ad=_d+_d 1+S Ad 13×MW _d
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×MW _d( 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=MC_d+MC_d 1+S Cd 15×MW _d

6.1.4 ロボット組立数量制約と残差計算

ロボットの組立数量と残りの部分は、次のように変更されません。

MW d + SW d − 1 ⩾ DW d (26) MW_d+SW_{d-1} \geqslant DW_d \tag{26}MW _d+南西_d 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}南西_d=MC_d+MW _d 1+南西_d 1D Wd( 26 )

6.1.5 翌日の生産を保証する

来週の月曜日の生産を確実にするために、コンポーネントは日曜日に今週末に残される必要があるため、質問 1 の式 (13) と (14) は考慮されるべきではありません。翌月曜を8日目とすると、8日目に組み立てたロボットの数と7日目の残りのロボット数の合計が、次のように、次の月曜日の注文数量39を下回らないようにする必要があります。

MW 8 + SW 8 − 1 ⩾ 39 (26) MW_8+SW_{8-1} \geqslant 39 \tag{26}MW _8+南西_8 139( 26 )

今週はロボットのd日生産を確実にするために、d日大型部品の組立数量とd-1日小型部品の組立数量の制約が明確に与えられていないことに注意してください。ただし、式 (26) では、d 日のロボットの発注量 DW dと d 日の製造量 MW dに制約があり、 d日の大型部品の組立量には制約があり、式 (22) では、d 日で組み立てられる大きなコンポーネントの数に対する、d-1 日での小さなコンポーネントの組み立て数量に関する制約があります。

したがって、2 日目に生産されるロボットの数を保証する制約は、明示的には与えられませんが、暗黙のうちに与えられます。

6.1.6 労働時間の制限

労働時間制限は次のように変更されません:
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×_d+5×M Bd+5×MC_dTd( 27 )

6.1.7 目的関数

目的関数は変更されておらず、次のように問題 1 と同じです:
min C = ∑ d = 1 7 R d + ∑ d = 1 7 F d (28) min C=\sum_{d=1}^7R_d+\ sum_ {d=1}^7 F_d \tag{28}最小C=d = 17Rd+d = 17d( 28 )

ここに画像の説明を挿入

6.2 2 番目の問題モデルの解

MATLAB を使用してコードを記述し、2 番目の質問の結果を取得します。
ここに画像の説明を挿入

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. 問題 3 モデルの確立と解決

7.1 第三の問題モデルの確立

7.1.1 時間変数の決定

この問題では、時間が 7 日から 30 週 210 日になったので、時間変数は
d ∈ ( − 1 , 0 , 1 , . . , 208 , 209 , 210 ) (29) d ∈ (- 1,0, 1, ..., 208, 209, 210) \タグ{29}dε(1 0 , 1 , ... , 208 ,209 210 ( 29 )

d=-1 は第 1 週の前の週の土曜日、d=0 は第 1 週の前の週の日曜日です。d=1 は第 1 週の月曜日、つまり第 30 週の最初の日、d=210 は第 30 週の日曜日、つまり第 30 週の最終日です。

7.1.2 ダウンタイムの 0-1 変数

モデリングにおいて、変数が複数の整数値を取ることができるという問題が発生した場合、0-1 の変数が 2 値変数であるという性質を利用して、0-1 の変数のセットを使用して変数を置き換えることができます。したがって、このプロパティのおかげで、1 つのダウンタイム 0-1 変数を置き換えるために、0-1 変数のセットが導入されます。

最初のメンテナンス日を例にとると、最初のメンテナンス日のモデルは次のように確立されます。

checki = { 1 i 日検査 0 i 日検査なし(29) check_i=\begin{cases} 1 & i 日検査 \\ 0 & i 日検査なし \\ \end{cases}\tag {29 }チェック_ _ _={ 10オーバーホールするi日目メンテナンス( 29 )

ここに画像の説明を挿入

上記の式では、最初の式は 0-1 の変数で、最初のメンテナンス日が d 日であるかどうかを意味します。最初のメンテナンス日は 210 日のうちの 1 日、つまり 1 日のみになる可能性があるため、上記の 2 番目の式が制約に導入されます。

最初のメンテナンスの日付の特定の値を簡単に取得するために、0-1 変数が 2 値変数であるという性質により、上記の式の 3 番目の式が導入されます。たとえば、1 回目のオーバーホールの日付が 3 日目である場合、

θ 13 = 1 (31) θ_{13}=1 \タグ{31}13=1( 31 )
θ 11 = θ 12 = θ 14 = . . . = θ 11 = θ 1 ( 210 ) = 0 (31) θ_{11}=θ_{12}=θ_{14}=...=θ_{11}=θ_{1(210)}=0 \タグ{ 31}11=12=14=...=11=1 ( 210 )=0( 31 )

このとき、式(30)の第2式が成立している。
次に、(30) の 3 番目の式は次のように変換できます:
check 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 \回 0+2^2 \回 0+2^3 \回 1+...+2^{210} \回 0=2^3 \タグ{31}チェック_ _ _1=2111+2212+...+2210( 1 ) 210=21×0+22×0+23×1+...+2210×0=23( 31 )

(30) の 4 番目の式により、次のように最初の検査の日付を直接取得できます
。 }=log_2^{(2^3)}=3 \タグ{32}日付確認する_ _ _ _1=ログ_ _2チェック1 _ _ _=ログ_ _2( 23 )=3( 32 )

したがって、7 回の検査の 0-1 変数は次のように取得されます。
ここに画像の説明を挿入
ここで、chechDate tは t 番目の検査の特定の日付です。

7.1.3 検査間隔

より便利に 2 つの検査日の間に 6 日間の間隔を与えるために、7 つの検査の順序が最初に制限されます。つまり、次のように checkDate t最初にソートされます。
i ∈ ( 1 , 2 , 3...5 , 6 ) (34) chechDate~i~ < chechDate~i+1~ ,i∈(1,2,3...5,6)\tag{34}ch e ch D at e i _ _  <ch e ch D at e i _ _ +1  ε( 1 ,2 3...5 6 )( 34 )

ソート後、次のように、2 つの検査日の間に 6 日間の制約が与えられます。

chech Date i + 6 < chech Date i + 1 , i ∈ ( 1 , 2 , 3...5 , 6 ) (35) chechDate~i~ +6< chechDate~i+1~ ,i∈(1 ,2,3...5,6)\タグ{35}ch e ch D at e i _ _  +6<ch e ch D at e i _ _ +1  ε( 1 ,2 3...5 6 )( 35 )

7.1.4 総作業時間制限マトリックスの定義

この質問の生産時間は、30 週間で 7 日から 210 日に変更されたため、総労働時間制限マトリックスを再定義します。
ここに画像の説明を挿入

このうち、T dは d 曜日の総労働時間制限です。

したがって、総工数制限を満たす制約は次のようになります。

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×マアド_ _  +5×メガバイト_  +5×MC_dT be gd( 37 )

7.1.5 メンテナンス後、総労働時間の制限を緩和

設備のオーバーホール後、生産能力が向上し、オーバーホール後の1日目以降、合計生産時間制限が10%、8%、...、2%、0%緩和されます。したがって、7回の検査の具体的な日付が決定された後、最大総工数制限マトリックスの値は、検査後の緩和に合わせて変更できます。式を次のように変更します。

T big ( チェック日付 + オフセット ) = T big ( チェック日付 + オフセット ) × ( 1 + ( 0.1 − 0.02 × オフセット ) ) (38) Tbig_{(チェック日付 + オフセット)}= Tbig_{(チェック日付 + オフセット) } \times (1+(0.1-0.02 \times オフセット)) \tag{38}T be g(チェック日付+オフセット) _ _ _ _ _ _ _ _ _=T be g(チェック日付+オフセット) _ _ _ _ _ _ _ _ _×( 1+( 0.10.02×オフセット) ) _ _( 38 )

オフセット ∈ ( 0 , 1 , . . . 4 , 5 ) オフセット ∈(0,1,...4,5)オフセット_ _ε( 0 ,1 ...4 5 )

このうち、1、オフセットは各メンテナンスの日付から遡ってオフセットする日付オフセットで、オフセットごとに制限緩和が2%ずつ軽減されます。オフセットが 5 倍に達すると、制限緩和が 0% に減少し、オフセットが停止します。

7.1.6 検査日に部品を生産できない

設備メンテナンス当日は、部品を生産できない、つまりメンテナンス日の大型部品、小型部品、ロボットの生産量が0なので、制約条件は以下のようになります。

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=01 _=2 _=M A 3=MB1 _=MB2 _=MC1 _=MC2 _=MC3 _=0
MA j = MB j = MC j = MW j = 0 (39) MA_j=MB_j=MC_j=MW_j=0 \tag{39}_=M B=MC_=MW _=0( 39 )
j ∈ ( check D atet , t ∈ ( 1 , 2 , . . . 6 , 7 ) ) j∈(checkDate_t,t∈(1,2,...6,7))jε(日付確認_ _ _ _ _ttε( 1 ,2 ...6 7 ))

7.1.7 生産を継続できるようにする

30 週と 210 日が経過した後も、31 週目の月曜日、つまり 211 日目に注文需要を満たすことができるようにするため、211 日目のロボットの生産量 MW と残りの210 日目のロボットの数量 SW11- は 211 日目より少なくてはならない. DW.1, スカイロボットの需要数量, 原則は 6.1.5 と同じ. 制約は次のとおりです。

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

この質問は、211 日目のロボットの需要 DW_{211} を示していません。ここでは、30 週間の月曜日のデータが平均化され、四捨五入されて DW 211 =38 が得られます。

問題 2 のモデルでは、その他の制約と目的関数は変更されていないため、ここでは繰り返しません。

7.2 3 モデル問題の解

MATLAB を使用してコードを記述し、質問 3 の結果を取得します。
ここに画像の説明を挿入

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. 第四の問題のモデルの確立と解決

8.1 問題の 4 つのモデルの確立

8.1.1 データ分析

この質問は、第 31 週のロボットの使用需要を予測する必要があります. 質問によって与えられたデータ分析によると、データの変動には一定の周期性があり、それは期間の時系列データです. 従属変数は 1 つだけです:使用ロボットの数。次に、従属変数として使用されるロボットの数を使用して、単変量時系列分析に基づくロボット需要予測モデルが確立されます。

時間変数として週を含むデータは特定の期間を与えないため、データをトレーニング グループと実験グループに分割することを検討し、異なる期間の長さを使用してトレーニング グループをモデル化し、Q 検定に合格したモデルを除外します。次に、実験グループのデータを使用して、どのモデルが最もよく予測されるかを決定します。予測誤差が最小のモデルを選択し、すべてのデータを使用して再モデル化し、将来のデータを予測します。最後に、予測された時系列図を描画して、予測された傾向が妥当かどうかを判断します。

8.1.2 データの前処理

30 週間と 201 日間のデータを観察し、欠損データはありません。時間変数を週単位で定義し、横軸を時間、縦軸をロボット数とする時系列グラフを描きます。時系列グラフを分析し、トレンドや季節性なしに、データが特定の範囲内で上下に変動していることを確認します。

8.1.3 単変量時系列に基づく予測モデルの確立

トレーニング グループ データはサイクル長 7 のシーケンスであり、最適な時系列分析モデルは SPSS エキスパート モデラーを使用して確立されます。エキスパート モデラーは、依存する各シーケンスに最適なモデルを自動的に見つけます。独立 (予測) 変数が指定されている場合、エキスパート モデラーは、従属系列と統計的に有意な関係を持つモデルを ARIMA モデルのコンテンツとして選択します。モデル変数は、必要に応じて差または平方根または自然対数変換を使用して変換されました。デフォルトでは、エキスパート モデラーは指数平滑法と ARIMA モデルの両方を考慮します。ただし、エキスパート モデラーを制限して、ARIMA モデルのみ、または指数平滑モデルのみを検索することもできます。外れ値の自動検出を指定することもできます。

sPSS Expert Modeler は、最適なモデルである単純な季節モデルを自動的に選択しました。

8.1.4 予測モデルのテスト

モデルが完全に認識されているかどうかを確認します: 時系列モデルを推定した後, 残差に対してホワイト ノイズ テストを実行する必要があります. 残差がホワイト ノイズの場合, 選択したモデルが時系列の法則を完全に識別できることを意味します. ; つまり、モデルは許容可能です. ; 残差がホワイト ノイズでない場合、モデルによって認識されない情報がまだあることを意味し、それは削除されます。

ACF 自己相関係数と PACF 偏自己相関関数は、残差がホワイト ノイズであるかどうか、つまり、モデルが時系列を完全に認識できるかどうかを判断するのに役立ちます。

ここに画像の説明を挿入
上の表からわかるように、残差の Q 検定で得られた p 値は 0.451 です。つまり、帰無仮説を棄却して、残差がホワイト ノイズ シーケンスであると考えることができないため、単純な季節モデルはうまくいく可能性があります。この質問でロボットを識別します. 要求データ.

モデルの比較と選択: 定常 R 2または AIC および BIC 基準を使用します。R 2は、線形モデル フィッティングの品質を反映するために使用できます。R 2 が 1 に近いほど、フィッティングがより正確になります。パラメータを追加すればするほど、モデルのフィッティング効果は向上しますが、モデルの複雑さが増します (オーバーフィッティングの問題)。したがって、モデルの選択では、モデルの複雑さとモデルがデータを解釈する能力との間の最適なバランスが求められます。BIC はモデルの複雑さに対するペナルティ係数が大きいため、BIC は AIC で選択されたモデルよりも簡潔であることが多いため、モデル選択のパラメーターとして小さい R 2と BIC を選択するという原則が適用されます。

BIC (ベイジアン情報量基準) 式は次のとおりです。

BIC = ln ( T ) (モデル内のパラメーターの数) - 2 ln (モデルの最尤関数) (41) BIC=ln(T) (モデル内のパラメーターの数) - 2ln (最大尤度関数)モデルの可能性) 関数) \tag{41}B I C=l n ( T ) (モデル内のパラメーターの数)2 l n (モデルの最尤関数)( 41 )

31 週目の予測値を取得します: 38、35、39、40、37、34、40。32週目の最初の2日間の予測値: 38, 35. したがって、次のように、将来のd 番目の曜日のロボット需要量マトリックスを取得します。
38,35, 39,40,37,34,40,38,35] \タグ{42}D W予測_ _ _ _ _=[ 38 35 ,39 ,40 ,37 34 40 ,38 ,35 ]( 42 )

8.1.5 毎日の通常配送を保証

毎日のロボット注文が 95% 以上の確率で確実に配送されるようにするために、組み立てられるロボットの数に関する制約が次のように変更されます。

MW d + SW d − 1 ⩾ DW 予測 × 0.95 (43) MW_{d}+SW_{d-1}\geqslant DW_{predict_d} \times 0.95 \tag{43}MW _d+南西_d 1D W予測する_ _ _ _d×0.95( 43 )

8.1.6 1 週間を通して通常の配信を保証する

1 週間のロボット注文を 85% 以上の確率で配送できるようにするために、次の制約が適用されます。

∑ d = 1 7 MW d ⩾ 0.85 × ∑ d = 1 7 DW 予測 (44) \sum_{d=1}^7MW_d \geqslant 0.85 \times \sum_{d=1}^7DWpredict_d \tag{44}d = 17MW _d0.85×d = 17D W予測_ _ _ _ _d( 44 )
1 日の注文は 95% 以上の確率で配送され、1 週間のロボットの注文は 85% 以上の確率で配送されなければならないことに注意してください。つまり、式 (44)は式 (43) で暗示されています。したがって、毎日正常に配信されれば十分です。つまり、式 (43) は無視できます。

9、公式標準回答

1. 最初の質問の最終結果

ここに画像の説明を挿入

2. 2 番目の質問の最終結果

ここに画像の説明を挿入

3. 3 番目の質問の最終結果

ここに画像の説明を挿入

4. 4 番目の質問の最終結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/wxfighting/article/details/126279581