Sie können sich das offizielle Analysevideo ansehen (solange dieses Video ein Kandidat ist, können Sie es kostenlos ansehen. Für diejenigen, die es nicht sehen können, werde ich in ein paar Tagen einen Blog erstellen). , ich habe die offizielle Standardantwort an das Ende dieses Blogs gestellt, für Ihre eigene Referenz.
Offizielles Analysevideo zum Huashu Cup 2022 zu Frage B》》》》》》》
Hier ist eine Aussage, ich nehme mit der C-Frage am Huashu Cup teil. Die These und der Code beziehen sich auf andere, aber es ist tatsächlich dieser Blog, an dessen Klärung ich so hart gearbeitet habe. Ich bin auch ein Anfänger, und ich Ich habe es nur zum Sortieren verschickt. Die Ideen eignen sich zum Selbstlernen und dienen nur als Referenz. Es gibt keine hervorragende Arbeit oder eine Standardantwort.
Vollständiger Titel:
Link: https://pan.baidu.com/s/16E1X35O13NWIij72OClVgQ?pwd=1234
Extraktionscode: 1234
Artikelverzeichnis
- 1. Das Thema
- 2. Problemanalyse
- 3. Modellannahmen
- 4. Symbolbeschreibung
- 5. Erstellung und Lösung von Problem 1 Modell
-
- 5.1 Die Etablierung des Problemmodells
-
- 5.1.1 Kleine Bauteile bauen große Bauteile zusammen
- 5.1.2 Verbleibende Widgets
- 5.1.3 Berechnung der verbleibenden Großbauteile durch die Bestückungsmenge des Roboters
- 5.1.4 Mengenbeschränkungen für die Robotermontage
- 5.1.5 Verbleibender Roboter
- 5.1.6 Kein Bestand Kein Restbestand
- 5.1.7 Arbeitszeitbeschränkungen
- 5.1.8 Inventargebühr
- 5.1.9 Produktionsvorbereitungskosten
- 5.1.10 Zielfunktion
- 5.2 Problemlösung des Modells
- 6. Zusammenfassung und Lösung von Problem 2 Modell
-
- 6.1 Aufstellung des zweiten Problemmodells
-
- 6.1.1 Kleine Bauteile bauen große Bauteile zusammen
- 6.1.2 Verbleibende Widgets
- 6.1.3 Die Bestückungsmenge des Roboters errechnet sich aus den verbleibenden Großbauteilen
- 6.1.4 Mengenbeschränkungen für die Robotermontage und Restberechnung
- 6.1.5 Gewährleistung der Produktion am nächsten Tag
- 6.1.6 Arbeitszeitbeschränkungen
- 6.1.7 Zielfunktion
- 6.2 Die Lösung des zweiten Problemmodells
- 7. Erstellung und Lösung des Modells von Problem drei
- 8. Aufstellung und Lösung des Modells des vierten Problems
- Neun, die offizielle Standardantwort
1. Das Thema
2. Problemanalyse
3. Modellannahmen
1. Ausreichende Materialien für die Montage kleiner Komponenten.
2. Während des Produktionsprozesses wird die Produktion nicht durch unerwartete Situationen wie Stromausfälle in der Fabrik und mechanische Fehler unterbrochen.
3. Der Kapitalfluss der Fabrik ist normal und die Produktion wird nicht durch Kapitalmangel beeinträchtigt.
4. Nur das Endprodukt Roboter hat externe Nachfrage und andere Komponenten werden nicht extern verkauft.
5. Die Nachfrage nach Robotern wird planmäßig bestimmt und ist nicht von Marktpreisschwankungen betroffen.
4. Symbolbeschreibung
Symbol | veranschaulichen | Einheit |
---|---|---|
d | Tage | Himmel |
MA1 d , MA2 d , MA3 d … MC3 d | Widget-Montagemenge am Tag d | individuell |
SA1 d , SA2 d , SA3 d … SC3 d | Restmenge des Widgets am Tag d | individuell |
MA d , MB d , MC d | Montagemenge von Großkomponenten am Tag d | individuell |
SA d , SB d ,SC d | Restmenge Großkomponenten am Tag d | individuell |
DWd | Die Anzahl der am Tag d angeforderten Roboter | individuell |
MW d | Die Anzahl der am Tag d montierten Roboter | individuell |
SW d | Die verbleibende Anzahl von Robotern am Tag d | individuell |
T d | Gesamtarbeitszeitgrenze am Tag d | Arbeitszeit |
RA1,RA2,…RB,RC | Lagerkosten pro Einheit für die Komponente | Yuan |
FA1,FA2,…,FB,FC | Produktionsvorbereitungskosten des Bauteils | Yuan |
XW d | 0-1 Variable, ob am Tag d Roboter produziert werden sollen | - |
R d | Bestandskosten am Tag d | Yuan |
F d | Produktionsvorbereitungskosten am Tag d | Yuan |
checkDatum t | Datum der t-ten Revision | Himmel |
Tbig d | Gesamtarbeitszeitgrenze am Tag d | Arbeitszeit |
DWpredict d | Die Anzahl der Roboter, die am d-ten Tag einer Woche in der Zukunft angefordert werden | individuell |
5. Erstellung und Lösung von Problem 1 Modell
5.1 Die Etablierung des Problemmodells
5.1.1 Kleine Bauteile bauen große Bauteile zusammen
Hier wird als Beispiel die Montage des großen Bauteils A genommen. Der Zusammenbau einer großen Komponente A erfordert 6 kleine Komponenten A1, 8 kleine Komponenten A2 und 2 kleine Komponenten A3.
Am Tag d beträgt die Anzahl der kleinen Komponenten A1, die zum Zusammenbau der großen Komponente A verwendet wurden: die Anzahl der am Tag d (dem aktuellen Tag) montierten kleinen Komponenten MA1 d und die Anzahl der am Tag d-1 (gestern) verbleibenden kleinen Komponenten SA1 d-1 und nämlich MA1 d + SA1 d-1 . Die Anzahl der Widgets A2 und A3 kann auf die gleiche Weise erhalten werden.
Die Montage einer großen Komponente A erfordert 6 kleine Komponenten A1. Wenn nur A1 berücksichtigt wird, beträgt die maximale Anzahl an großen Komponenten, die montiert werden können:
[ 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+ SA 1 _d - 1]( 1 )
Hinweis: Das Symbol [ ] wird hier abgerundet, d. h. die größte ganze Zahl kleiner als sich selbst nehmen.
Wenn nur A2 betrachtet wird, beträgt die maximale Anzahl von großen Komponenten A, die zusammengebaut werden können, in ähnlicher Weise:
[ 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+ SA 2 _d - 1]( 2 )
Wenn nur A3 betrachtet wird, beträgt die maximale Anzahl von großen Komponenten A, die zusammengebaut werden können:
[ 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+ SA 3 _d - 1]( 3 )
Daher beträgt die maximale Anzahl an Baugruppen des Großbauteils A am Tag 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}Mindest[ (6MA 1 _d+ SA 1 _d - 1,8MA 2 _d+ SA 2 _d - 1,2MA 3 _d+ SA 3 _d - 1) ]( 4 )
Hinweis: Dies muss abgerundet werden
Die Anzahl der für jeden Tag erforderlichen Roboter ist unterschiedlich.Um den Bedarf des Auftrags zu erfüllen, wenn die Fabrik die große KomponenteA montiert, muss sie nicht unbedingt gleich dem Maximalwert sein. Daher sollte die Montagemenge der großen Komponente A am Tag d die folgenden Randbedingungen erfüllen:
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 _d⩽Mindest[ (6MA 1 _d+ SA 1 _d - 1,8MA 2 _d+ SA 2 _d - 1,2MA 3 _d+ SA 3 _d - 1) ]( 5 )
In gleicher Weise sollte am d-Tag die Montagemenge der großen Komponenten B und C die folgenden Einschränkungen erfüllen:
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}MB _d⩽Mindest[ (2MB1 _d+ SB1 _d - 1,4MB2 _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⩽Mindest[ (8MC 1d+ SC1 _d - 1,2MC 2d+ SC2 _d - 1,12MC 2d+ SC2 _d - 1) ]( 6 )
5.1.2 Verbleibende Widgets
Nach dem Zusammenbau einer großen Komponente mit einer kleinen Komponente können Reste der kleinen Komponente vorhanden sein. Hier wird das Widget A1 als Beispiel verwendet.
Am Tag d muss die verbleibende Anzahl von Artikeln A1 die Summe der Anzahl von Artikeln erfüllen, die am Tag d MA1 d zusammengestellt wurden, und die Anzahl von Artikeln, die am Tag d-1 SA1 d-1 verbleiben , abzüglich der Summe der Anzahl von Widgets am Tag d d-1 Der Verbrauch von Al. Um ein großes Bauteil A zusammenzubauen, werden 6 kleine Bauteile A1 benötigt. Daher beträgt die Verbrauchsmenge von Al am Tag d 6 × MA d . Daher ist die Restmenge SA1 d von A1 am Tag d wie folgt:
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 - 1−6∗MA _d( 7 )
Heute – verbraucht = verbleibend
(heutiges Zusammengebautes + gestern übrig gebliebenes) – verbraucht = verbleibend
Die verbleibende Anzahl weiterer kleiner Komponenten erhält man auf die gleiche Weise:
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 - 1−8∗MA _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 - 1−2∗MA _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 - 1−2∗MB _d
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=MA 1 _d+S A 1d - 1−4∗MB _d( 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=MC 1d+SC1 _d - 1−8∗MC _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=MC 2d+SC2 _d - 1−2∗MC _d
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 - 1−12∗MC _d
5.1.3 Berechnung der verbleibenden Großbauteile durch die Bestückungsmenge des Roboters
Die Montage des Roboters, d.h. die Montage des Roboters mit großen Komponenten, ist die gleiche wie die Montage großer Komponenten mit kleinen Komponenten. Daher ist die Anzahl der am d-Tag montierten Roboter wie folgt:
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⩽Mindest[ (3MA 1 _d+ SA 1 _d - 1,4MB2 _d+ SB2 _d - 1,5MC 2d+ SC2 _d - 1) ]( 9 )
Darunter ist MW d die Anzahl der montierten Roboter, MA d die Montageanzahl der großen Komponenten A am Tag d und SA d-1 die verbleibende Anzahl der großen Komponenten A am Tag d-1.
Bauen Sie den Roboter aus großen Komponenten zusammen, die einige Reste haben können. Sie wird auf die gleiche Weise wie die Berechnung der verbleibenden Anzahl von Widgets wie folgt berechnet:
SA d = MA d + SA d − 1 − 3 ∗ MW d SA_d=MA_d+SA_{d-1} -3*MW_dS Ad=MA _d+S Ad - 1−3∗MW _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=MB _d+S Bd - 1−4∗MW _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 - 1−5∗MW _d
5.1.4 Mengenbeschränkungen für die Robotermontage
Alle vom Werk angenommenen Roboteraufträge müssen nach Ablauf geliefert werden, daher sollte die Summe aus der Montagemenge MW d der Roboter am Tag d und der Restmenge SW d der Roboter am Tag d-1 größer sein als die Bedarfsmenge DW d am Tag d .
MW d + SW d − 1 ⩾ DW d (12) MW_d+SW_{d-1} \geqslant DW_d \tag{12}MW _d+S Wd - 1⩾D Wd( 12 )
5.1.5 Verbleibender Roboter
Nach dem täglichen Verkauf von Bots auf Bestellung können einige Reste übrig bleiben. Die Restmenge SW d des Roboters am Tag d ist gleich der Summe der Montagemenge MW d am Tag d und der Restmenge SW d-1 am Tag d-1 abzüglich der Auftragsmenge DW d am Tag . welches ist
SW d = MW d + SW d − 1 − DW d (12) SW_d=MW_d+SW_{d-1} -DW_d \tag{12}S Wd=MW _d+S Wd - 1−D Wd( 12 )
5.1.6 Kein Bestand Kein Restbestand
Tag 1 beginnt ohne vorrätige Komponenten, dh:
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=SB1 _0=SB2 _0=SC1 _0=SC2 _0=SC 30( 13 )
SA 0 = SB 0 = SC 0 = 0 (13) SA_0=SB_0=SC_0=0 \tag{13}S A0=S B0=S C0=0( 13 )
Nach dem siebten Tag, d. h., wird kein Komponentenbestand mehr gelassen.
SA1_7=SA2_7=SA3_7=SB1_7=SB2_7=SC1_7=SC2_7=SC3_7S A 17=S A 27=S A 37=SB1 _7=SB2 _7=SC1 _7=SC2 _7=SC 37
SA 7 = SB 7 = SC 7 = 0 (14) SA_7=SB_7=SC_7=0 \tag{14}S A7=S B7=S C7=0( 14 )
SW7 = 0 SW_7=0S W7=0
5.1.7 Arbeitszeitbeschränkungen
Es dauert 3 Arbeitsstunden, um 1 Stück A herzustellen, 5 Arbeitsstunden, um 1 Stück B herzustellen, und 5 Arbeitsstunden, um 1 Stück C herzustellen. Die folgenden Einschränkungen müssen gleichzeitig erfüllt werden:
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×MB _d+5×MC _d⩽Td( 15 )
5.1.8 Inventargebühr
Wenn eine Komponente am Ende eines Tages auf Lager ist, muss die Fabrik eine bestimmte Bestandsgebühr zahlen, die proportional zur verbleibenden Menge der Komponente ist. Daher können gemäß der verbleibenden Menge an Komponenten am d-Tag die Bestandskosten von kleinen Komponenten, großen Komponenten und Robotern ausgedrückt werden.
R klein A d = RA 1 × SA 1 d + RA 2 × SA 2 d + RA 3 × SA 3 d RkleinA_d = RA1\times SA1_d+RA2\times SA2_d+RA3\times SA3_dR klein A _ _d=RA 1 _×S A 1d+RA 2 _×S A 2d+RA 3 _×S A 3d
R klein B d = RB 1 × SB 1 d + RB 2 × SB 2 d RkleinB_d = RB1\times SB1_d+RB2\times SB2_dRsmallBd=RB1 _×SB1 _d+RB2 _×SB2 _d
R klein C d = RC 1 × SC 1 d + RC 2 × SC 2 d + RC 3 × SC 3 d (16) RkleinC_d = RC1\times SC1_d+RC2\times SC2_d+RC3\times SC3_d \tag{16}R klein C _ _d=RC 1×SC1 _d+RC 2×SC2 _d+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 groß _d=RA _×S Ad+RB×S Bd+RC×S Cd
Darunter sind RA1 die Einzelstück-Bestandskosten der großen Komponente A und SA1 d die verbleibende Menge der großen Komponente A am Tag d. Andere Symbole sind gleich. RsmallA d , RsmallB d und RsmallC d sind die Bestandskosten der kleinen Komponenten A, B und C am d-Tag, Rsmall die Bestandskosten der großen Komponente am d-Tag und R d sind die gesamten Bestandskosten der Tag.
Die Summe sind die Bestandskosten am Tag d:
R d = R klein A d + R klein B d + R klein C d + R großd + RW × SW d (17) R_d =RkleinA_d+RkleinB_d+RkleinC_d+Rgroß_d+RW\times SW_d \tag{17}Rd=R klein A _ _d+RsmallBd+R klein C _ _d+R groß _d+RW _×S Wd( 17 )
5.1.9 Produktionsvorbereitungskosten
Wenn eine Fabrik ein Komponentenprodukt herstellt, muss sie Fixkosten zahlen, die unabhängig von der Produktionsmenge sind und als Produktionsvorbereitungskosten bezeichnet werden.Um die Berechnung der Fixkosten zu erleichtern, wird hier eine 0-1-Variable eingeführt. Nehmen wir als Beispiel die 0-1-Variable XW d eines Produktionsroboters . Wenn am Tag d ein Roboter produziert wird, ist XW d gleich 1; wenn am Tag d kein Roboter produziert wird, dann ist XW d gleich 0. Folgendermaßen
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 )
Die 0-1-Variablen anderer Komponenten können auf die gleiche Weise erhalten werden.
Daher können gemäß den 0-1-Variablen aller Komponenten die Produktionsvorbereitungskosten von kleinen Komponenten, großen Komponenten und Robotern ausgedrückt werden.
F klein A d = XA 1 d × FA 1 + XA 2 d × FA 2 + XA 3 d × FA 3 FkleinA_d =XA1_d \times FA1+XA2_d \times FA2+XA3_d \times FA3F kleiner A _ _d=XA1 _ _d×F A 1+X A 2d×F A 2+XA3 _ _d×F A 3
F klein B d = XB 1 d × FB 1 + XB 2 d × FB 2 FkleinB_d = XB1_d \times FB1+XB2_d \times FB2F kleines B _ _d=XB1 _d×FB 1+XB 2d×FB 2
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}F kleiner C _ _d=XK 1d×FC 1+XK 2d×FC 2+XK 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 groß _d=F A×XA _d+FB×XB _d+FC×XC _d
Darunter ist XA1 d die 0-1-Variable, ob Al am d-Tag produziert werden soll, und FA1 sind die Produktionsvorbereitungskosten von Al.
Andere Symbole sind gleich. FsmallA d , FsmallB d und FsmallC d sind die Produktionsvorbereitungskosten der kleinen Komponenten A, B und C am d-Tag und die Bestandskosten der großen Fbig-Komponenten am d-Tag. F d sind die Produktionsvorbereitungskosten am Tag d.
Die Summe sind die Produktionsvorbereitungskosten am Tag 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\ mal FW \tag{20}Fd=F kleiner A _ _d+F kleines B _ _d+F kleiner C _ _d+F groß _d+X Wd×FW _( 20 )
5.1.10 Zielfunktion
Die Gesamtkosten müssen am kleinsten sein, d. h. die Summe der Bestandskosten und der Produktionsvorbereitungskosten ist am kleinsten, und die Zielfunktion kann erhalten werden:
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}Minute C=d = 1∑7Rd+d = 1∑7Fd( 21 )
5.2 Problemlösung des Modells
Der simulierte Abkühlungsalgorithmus wird mit dem Partikelschwarmalgorithmus kombiniert, und der Code wird in MATLAB geschrieben, um das Ergebnis von Problem eins zu erhalten, wie unten gezeigt.
Das Ergebnis hier ist etwas problematisch, es sollte 7000+ sein.
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. Zusammenfassung und Lösung von Problem 2 Modell
6.1 Aufstellung des zweiten Problemmodells
6.1.1 Kleine Bauteile bauen große Bauteile zusammen
Die Komponenten A, B und C müssen einen Tag im Voraus produziert und eingelagert werden, um WPCR zusammenzubauen, und die Komponenten A1, A2, A3, B1, B2, C1, C2 und C3 müssen ebenfalls produziert und eingelagert werden einen Tag im Voraus, um A, B und C zusammenzubauen. Wenn Sie also den Bestellbedarf für Komponenten am Montag abschließen möchten, müssen Sie die großen Komponenten A, B und C zusammenbauen, die am Montag letzter Woche am Sonntag benötigt werden. Und am letzten Sonntag sollten die kleinen Komponenten, die zum Zusammenbau der großen Komponenten verwendet werden, am letzten Samstag zusammengebaut werden.
Daher sollte die Anzahl der kleinen Komponenten, die zum Zusammenbau großer Komponenten am Tag d verwendet werden, die Summe der Anzahl der kleinen Komponenten sein, die am Tag d-1 montiert wurden, und der Anzahl der kleinen Komponenten, die am Tag d-1 verbleiben. Daher werden die Formeln (5) und (6) modifiziert, um die Beschränkungen großer Komponenten wie folgt zu erhalten:
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 _d⩽Mindest[ (6MA 1 _d - 1+ SA 1 _d - 1,8MA 2 _d - 1+ SA 2 _d - 1,2MA 3 _d - 1+ SA 3 _d - 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]\ Tag{22}MB _d⩽Mindest[ (2MB1 _d - 1+ SB1 _d - 1,4MB2 _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⩽Mindest[ (8MC 1d - 1+ SC1 _d - 1,2MC 2d - 1+ SC2 _d - 1,12MC 3d - 1+ SC3 _d - 1) ]
6.1.2 Verbleibende Widgets
Die Anzahl der am Tag d verbleibenden Widgets, dh die Anzahl der Widgets, die gespeichert werden müssen, kann als zwei Teile betrachtet werden. Ein Teil ist die Anzahl der am Tag d montierten kleinen Komponenten, und der andere Teil ist der verbleibende Teil der am Tag d montierten großen Komponenten, und der verbleibende Teil sollte die Anzahl der am Tag d-1 montierten kleinen Komponenten und die Anzahl von sein verbleibende Kleinkomponenten am Tag d-1 und abzüglich der am Tag d verzehrten Menge,
Resttag d { am Tag d montierte Menge + (am Tag d montierte Menge − 1 + am Tag d − 1 verbleibende Menge) − am Tag d verbrauchte Menge verbleibend am Tag d\begin{cases} Tag d montierte Menge\\ +\ \ (Montagemenge am Tag d-1 + Restmenge am Tag d-1) - Verbrauchte Menge am Tag d\end{cases}Tag d bleibt⎩ ⎨ ⎧Am Tag d montierte Menge+( D−Menge in 1 Tag montiert+d_ _−1 Tag Restmenge)−Verbrauchte Menge Tag d
Der Rest des Widgets sieht also so aus:
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 - 1−6×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 - 1−8×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 - 1−2×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_dSB1 _d=MB1 _d+MB1 _d - 1+SB1 _d - 1−2×MB _d
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 \ Tag{23}SB2 _d=MB2 _d+MB2 _d - 1+SB2 _d - 1−4×MB _d( 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=MC 1d+MC 1d - 1+SC1 _d - 1−8×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=MC 2d+MC 2d - 1+SC2 _d - 1−2×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_dSC 3d=MC 3d+MC 3d - 1+SC 3d - 1−12×MC _d
6.1.3 Die Bestückungsmenge des Roboters errechnet sich aus den verbleibenden Großbauteilen
Die Montage des Roboters ist die gleiche wie die Montage von kleinen Komponenten zu großen Komponenten. Am Tag d wird der Roboter unter Verwendung der Montage von Tag d-1 oder der verbleibenden großen Komponenten zusammengebaut. Die Einschränkungen sind wie folgt:
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⩽Mindest[ (3MA 1 _d - 1+ SA 1 _d - 1,4MB2 _d - 1+ SB2 _d - 1,5MC 3d - 1+ SC3 _d - 1) ]( 24 )
Der Rest der großen Komponente ist wie folgt derselbe wie der Rest der kleinen Komponente:
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=MA _d+MA _d - 1+S Ad - 1−3×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=MB _d+MB _d - 1+S Bd - 1−4×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 - 1−5×MW _d
6.1.4 Mengenbeschränkungen für die Robotermontage und Restberechnung
Die Montagemenge und der Rest des Roboters sind wie folgt unverändert:
MW d + SW d − 1 ⩾ DW d (26) MW_d+SW_{d-1} \geqslant DW_d \tag{26}MW _d+S Wd - 1⩾D 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=MC _d+MW _d - 1+S Wd - 1−D Wd( 26 )
6.1.5 Gewährleistung der Produktion am nächsten Tag
Um die Produktion am Montag nächster Woche zu gewährleisten, sollen die Komponenten am Ende dieser Woche am Sonntag stehen bleiben, also sind die Gleichungen (13) und (14) in Frage 1 nicht zu berücksichtigen. Betrachten Sie den nächsten Montag als den 8. Tag, daher sollte die Summe aus der Anzahl der am 8. Tag montierten Roboter und der verbleibenden Anzahl der Roboter am 7. Tag nicht weniger als die Bestellmenge 39 am nächsten Montag sein, wie folgt:
MW 8 + SW 8 − 1 ⩾ 39 (26) MW_8+SW_{8-1} \geqslant 39 \tag{26}MW _8+S W8 - 1⩾39( 26 )
Es ist erwähnenswert, dass in dieser Woche, um die Produktion von Robotern am Tag d sicherzustellen, die Beschränkungen für die Montagemenge großer Komponenten am Tag d und die Montagemenge kleiner Komponenten am Tag d-1 nicht eindeutig gegeben sind. Allerdings gibt es in Gleichung (26) eine Beschränkung der Auftragsmenge DW d von Robotern am Tag d und der hergestellten Menge MW d am Tag d . Es gibt eine Beschränkung der Montagemenge von großen Komponenten am Tag d, in Gleichung (22) gibt es eine Beschränkung der Montagemenge von kleinen Komponenten am Tag d-1 gegenüber der Anzahl von großen Komponenten, die am Tag d montiert werden.
Daher sind die Einschränkungen, um die Anzahl der am zweiten Tag produzierten Roboter zu garantieren, nicht ausdrücklich gegeben, aber implizit.
6.1.6 Arbeitszeitbeschränkungen
Die Arbeitszeitgrenze wird wie folgt nicht modifiziert:
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×MB _d+5×MC _d⩽Td( 27 )
6.1.7 Zielfunktion
Die Zielfunktion wird nicht modifiziert und ist wie folgt dieselbe wie Problem 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}Minute C=d = 1∑7Rd+d = 1∑7Fd( 28 )
6.2 Die Lösung des zweiten Problemmodells
Verwenden Sie MATLAB, um den Code zu schreiben, um das Ergebnis der zweiten Frage zu erhalten.
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. Erstellung und Lösung des Modells von Problem drei
7.1 Aufstellung des dritten Problemmodells
7.1.1 Bestimmung von Zeitvariablen
In dieser Frage hat sich die Zeit von 7 Tagen auf 30 Wochen und 210 Tage geändert, also ist die Zeitvariable
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 ist der Samstag der Vorwoche in Woche 1 und d=0 ist der Sonntag der Vorwoche in Woche 1. d=1 ist der Montag der 1. Woche, der der erste Tag der 30. Woche ist, d=210 ist der Sonntag der 30. Woche, der der letzte Tag der 30. Woche ist.
7.1.2 0-1 Variablen für Ausfallzeiten
Wenn bei der Modellierung das Problem auftritt, dass eine Variable mehrere ganzzahlige Werte annehmen kann, kann ein Satz von 0-1-Variablen verwendet werden, um die Variable zu ersetzen, indem die Eigenschaft ausgenutzt wird, dass eine 0-1-Variable eine binäre Variable ist. Daher wird aufgrund dieser Eigenschaft ein Satz von 0-1-Variablen eingeführt, um eine Ausfallzeit-0-1-Variable zu ersetzen.
Am Beispiel des ersten Wartungstermins stellt sich das Modell für den ersten Wartungstag wie folgt auf:
checki = { 1 Inspektion am Tag i 0 Keine Inspektion am Tag i(29) check_i=\begin{cases} 1 & Inspektion am Tag i \\ 0 & Keine Inspektion am Tag i \\ \end{cases}\tag {29 }prüfen _ _ _ich={ 10Tag i überholt werdenKeine Wartung am Tag i( 29 )
In der obigen Formel ist die erste Formel eine 0-1-Variable, was bedeutet, ob das erste Wartungsdatum der d-te Tag ist. Da der erste Wartungstag nur an einem der 210 Tage liegen kann, also nur ein Tag, wird die zweite obige Formel für Randbedingungen eingeführt.
Um den spezifischen Wert des Datums der ersten Wartung leicht zu erhalten, wird die dritte Formel in die obige Formel aufgrund der Eigenschaft eingeführt, dass die 0-1-Variable eine binäre Variable ist. Beispielsweise ist das Datum der 1. Überholung dann der 3. Tag
θ 13 = 1 (31) θ_{13}=1 \tag{31} ich13=1( 31 )
θ 11 = θ 12 = θ 14 = . . . = θ 11 = θ 1 ( 210 ) = 0 (31) θ_{11}=θ_{12}=θ_{14}=...=θ_{11}=θ_{1(210)}=0 \tag{ 31}ich11=ich12=ich14=...=ich11=ich1 ( 210 )=0( 31 )
Zu diesem Zeitpunkt ist die zweite Formel der Formel (30) erfüllt.
Dann kann die dritte Formel von (30) umgewandelt werden in:
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 \times 0+2^2 \times 0+2^3 \times 1+...+2^{210} \times 0=2^3 \tag{31}prüfen _ _ _1=21 ich11+22 ich12+...+2210 ich( 1 ) 210=21×0+22×0+23×1+...+2210×0=23( 31 )
Durch die vierte Formel von (30) kann das Datum der ersten Inspektion wie folgt direkt erhalten werden:
check Date 1 = log 2 check 1 = log 2 ( 2 3 ) = 3 (32) checkDate_1=log_2^ {check1 }=log_2^{(2^3)}=3 \tag{32}D a t e prüfen _ _ _1=l o g2prüfen 1 _ _ _=l o g2( 23 )=3( 32 )
Daher werden die 0–1-Variablen von 7 Inspektionen wie folgt erhalten:
wobei chechDate t das spezifische Datum der t-ten Inspektion ist.
7.1.3 Inspektionsintervall
Um das Intervall von 6 Tagen zwischen zwei Inspektionsterminen bequemer anzugeben, wird die Reihenfolge von 7 Inspektionen zunächst eingeschränkt, d. h. das Prüfdatum t wird zuerst sortiert, und zwar wie folgt:
Prüfdatum i < Prüfdatum 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 , ich∈( 1 ,2 ,3...5 ,6 )( 34 )
Nach der Sortierung gilt eine Sperrfrist von 6 Tagen zwischen zwei Prüfterminen wie folgt:
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)\tag{35}c h e c h D a t e i +6<c h e c h D a t e i +1 , ich∈( 1 ,2 ,3...5 ,6 )( 35 )
7.1.4 Definition der Gesamtarbeitszeit-Grenzmatrix
Die Produktionszeit in dieser Frage hat sich von 7 Tagen auf 210 Tage in 30 Wochen geändert, also definieren Sie die Gesamtarbeitsstunden-Grenzmatrix neu:
Darunter ist T d die Gesamtarbeitsstundengrenze am d-Tag der Woche.
Daher sind die Beschränkungen, die die Gesamtmannstundengrenze erfüllen, wie folgt:
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×MC _d⩽T sein gd( 37 )
7.1.5 Beschränkungen der Gesamtarbeitszeit werden nach der Wartung gelockert
Nach der Überholung der Anlage wurde die Produktionskapazität verbessert Nach dem ersten Tag nach der Überholung wird die Gesamtproduktionszeitbegrenzung um 10 %, 8 %, ..., 2 % und 0 % gelockert. Daher können, nachdem die konkreten Termine der 7 Inspektionen festgelegt sind, die Werte in der maximalen Gesamtarbeitsstunden-Grenzmatrix geändert werden, um die Lockerung nach der Inspektion zu erfüllen. Ändern Sie die Formel so, dass sie so aussieht:
T big ( chech Date + offset ) = T big ( chech Date + 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 sein g( c he ch D a t e + o ff set ) _ _=T sein g( c he ch D a t e + o ff set ) _ _×( 1+( 0.1−0,02×aus s t ) )( 38 )
Versatz ∈ ( 0 , 1 , . . . 4 , 5 ) Versatz∈(0,1,...4,5)aus s t _∈( 0 ,1 ,...4 ,5 )
Unter ihnen ist 1, Offset der Datumsoffset, der vom Datum jeder Wartung rückwärts versetzt wird, und die Limitlockerung wird für jeden Offset um 2 % reduziert. Wenn der Offset das 5-fache erreicht, wird die Grenzrelaxation auf 0 % reduziert und der Offset wird gestoppt.
7.1.6 Am Prüftag dürfen keine Bauteile produziert werden
Am Tag der Gerätewartung können keine Komponenten produziert werden, d. h. der Output von großen Komponenten, kleinen Komponenten und Robotern am Wartungstag ist 0, daher sind die Einschränkungen wie folgt:
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=MB1 _j=MB2 _j=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=MB _j=MC _j=MW _j=0( 39 )
j ∈ ( check Date , t ∈ ( 1 , 2 , . . . 6 , 7 ) ) j∈(checkDate_t,t∈(1,2,...6,7))j∈( D a t e prüfen _ _ _t,t∈( 1 ,2 ,...6 ,7 ))
7.1.7 Sicherstellen, dass die Produktion fortgesetzt werden kann
Um sicherzustellen, dass nach Ablauf von 30 Wochen und 210 Tagen der Bestellbedarf noch am 31. Wochenmontag, also dem 211. Tag, erfüllt werden kann, also die Produktionsmenge MW des Roboters am 211. Tag und den Rest Die Menge SW11- des Roboters am 210. Tag sollte nicht kleiner sein als der 211. Tag DW.1, die Bedarfsmenge des Himmelsroboters, das Prinzip ist das gleiche wie das von 6.1.5. Die Einschränkungen sind wie folgt:
MW 211 + SW 211 − 1 ⩾ DW 211 (40) MW_{211}+SW_{211-1}\geqslant DW_{211} \tag{40}MW _211+S W211 - 1⩾D W211( 40 )
Die Frage gibt nicht den Bedarf des Roboters am 211. Tag DW_{211} an, hier werden die 30-wöchigen Montagsdaten gemittelt und gerundet, um DW 211 = 38 zu erhalten.
Andere Nebenbedingungen und Zielfunktionen wurden im Modell von Problem 2 nicht geändert, sodass sie hier nicht wiederholt werden.
7.2 Die Lösung des Drei-Modell-Problems
Verwenden Sie MATLAB, um Code zu schreiben, um das Ergebnis von Frage drei zu erhalten.
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. Aufstellung und Lösung des Modells des vierten Problems
8.1 Die Einrichtung des Vier-Modells des Problems
8.1.1 Datenanalyse
Diese Frage muss die Nutzungsnachfrage von Robotern in der 31. Woche vorhersagen. Gemäß der durch die Frage gegebenen Datenanalyse hat die Datenschwankung eine gewisse Periodizität, und es handelt sich um Periodenzeitreihendaten. Es gibt nur eine abhängige Variable: die Anzahl der eingesetzten Roboter. Dann wird mit der Anzahl der verwendeten Roboter als abhängige Variable ein Vorhersagemodell für die Roboternachfrage basierend auf einer univariaten Zeitreihenanalyse erstellt.
Da die Daten mit Wochen als Zeitvariable keinen bestimmten Zeitraum angeben, sollten Sie die Daten in eine Trainingsgruppe und eine experimentelle Gruppe unterteilen, unterschiedliche Periodenlängen verwenden, um die Trainingsgruppe zu modellieren, die Modelle aussortieren, die den Q-Test bestehen, und Verwenden Sie dann die Daten der experimentellen Gruppe, um festzustellen, welches Modell die besten Vorhersagen macht. Wählen Sie das Modell mit dem kleinsten Vorhersagefehler aus, verwenden Sie alle Daten für die Neumodellierung und treffen Sie Vorhersagen für zukünftige Daten. Zeichnen Sie schließlich das vorhergesagte Zeitreihendiagramm, um zu beurteilen, ob der vorhergesagte Trend angemessen ist.
8.1.2 Datenvorverarbeitung
Beobachtungsdaten für 30 Wochen und 201 Tage ohne fehlende Daten. Definieren Sie eine Zeitvariable in Wochen, zeichnen Sie ein Zeitreihendiagramm mit der Zeit als horizontaler Achse und der Anzahl der Roboter als vertikale Achse. Analysieren Sie das Zeitreihendiagramm und stellen Sie fest, dass die Daten innerhalb eines bestimmten Bereichs ohne Trend oder Saisonalität nach oben und unten schwanken.
8.1.3 Erstellung eines Vorhersagemodells basierend auf univariaten Zeitreihen
Die Trainingsgruppendaten sind eine Sequenz mit einer Zykluslänge von 7, und das optimale Zeitreihenanalysemodell wird mithilfe des SPSS-Expertenmodellierers erstellt. Der Expert Modeler findet automatisch das am besten passende Modell für jede abhängige Sequenz. Wenn eine unabhängige (Prädiktor-)Variable angegeben wird, wählt der Modellierungsexperte für den Inhalt im ARIMA-Modell diejenigen Modelle aus, die einen statistisch signifikanten Zusammenhang mit der abhängigen Reihe haben. Modellvariablen wurden je nach Bedarf unter Verwendung von Differenz- oder Quadratwurzel- oder natürlichen Logarithmentransformationen transformiert. Standardmäßig berücksichtigt der Expert Modeler sowohl exponentielle Glättung als auch ARIMA-Modelle. Es ist jedoch auch möglich, den Expert Modeler darauf zu beschränken, nur nach ARIMA-Modellen oder nur nach exponentiellen Glättungsmodellen zu suchen. Sie können auch die automatische Erkennung von Ausreißern festlegen.
Der sPSS Expert Modeler hat automatisch das optimale Modell für uns ausgewählt: das einfache saisonale Modell.
8.1.4 Testen von Vorhersagemodellen
Überprüfen Sie, ob das Modell vollständig erkannt wird: Nach der Schätzung des Zeitreihenmodells müssen wir einen Test auf weißes Rauschen am Residuum durchführen. Wenn das Residuum weißes Rauschen ist, bedeutet dies, dass das von uns ausgewählte Modell das Gesetz der Zeitreihe vollständig identifizieren kann , das heißt, das Modell ist akzeptabel. ; Wenn das Residuum kein weißes Rauschen ist, bedeutet dies, dass es immer noch einige Informationen gibt, die vom Modell nicht erkannt werden, dann werden sie eliminiert.
Der ACF-Autokorrelationskoeffizient und die partielle PACF-Autokorrelationsfunktion können uns dabei helfen festzustellen, ob es sich bei dem Residuum um weißes Rauschen handelt, d. h. ob die Zeitreihe vom Modell vollständig erkannt werden kann.
Wie aus der obigen Tabelle ersichtlich ist, beträgt der durch den Q-Test für die Residuen erhaltene p-Wert 0,451, d. h. wir können die Nullhypothese nicht ablehnen und denken, dass die Residuen Sequenzen mit weißem Rauschen sind, also kann das einfache saisonale Modell dies gut tun Identifizieren Sie den Roboter in dieser Frage. Fordern Sie Daten an.
Modellvergleich und -auswahl: Verwenden Sie stationäre R 2- oder AIC- und BIC-Kriterien. R 2 kann verwendet werden, um die Qualität der linearen Modellanpassung widerzuspiegeln, je näher es an 1 liegt, desto genauer ist die Anpassung. Je mehr Parameter hinzugefügt werden, desto besser ist der Modellanpassungseffekt, aber dies geht zu Lasten der Komplexität des Modells (Overfitting-Problem). Daher sucht die Modellauswahl nach dem besten Gleichgewicht zwischen der Modellkomplexität und der Fähigkeit des Modells, die Daten zu interpretieren. Da BIC einen größeren Strafkoeffizienten für die Komplexität des Modells hat, ist BIC oft prägnanter als das von AIC ausgewählte Modell, daher das Prinzip, ein kleines R 2 und BIC als Parameter für die Modellauswahl zu wählen.
Der BIC-Ausdruck (Bayesian Information Criterion) lautet wie folgt:
BIC = ln ( T ) (die Anzahl der Parameter im Modell) – 2 ln (die Maximum-Likelihood-Funktion des Modells) (41) BIC=ln(T) (die Anzahl der Parameter im Modell) – 2ln (das Maximum Wahrscheinlichkeit des Modells) Funktion) \tag{41}B ich C=l n ( T ) (Anzahl der Parameter im Modell)−2 l n (Maximum-Likelihood-Funktion des Modells)( 41 )
Holen Sie sich die vorhergesagten Werte für Woche 31: 38, 35, 39, 40, 37, 34, 40. Prognosewerte für die ersten beiden Tage der Woche 32: 38, 35. Rufen Sie daher die Bedarfsmengenmatrix des Roboters am d-ten Tag einer Woche in der Zukunft wie folgt ab:
DW Vorhersage = [ 38 , 35 , 39 , 40 , 37 , 34 , 40 , 38 , 35 ] (42) DWVorhersage=[ 38,35, 39,40,37,34,40,38,35] \tag{42}D W P re d i c t=[ 38 ,35 ,39 ,40 ,37 ,34 ,40 ,38 ,35 ]( 42 )
8.1.5 Jeden Tag eine normale Zustellung garantieren
Um sicherzustellen, dass die täglichen Roboterbestellungen mit einer Wahrscheinlichkeit von mehr als 95 % geliefert werden, werden die Beschränkungen für die Anzahl der montierten Roboter wie folgt geändert:
MW d + SW d − 1 ⩾ DW vorhergesagt × 0,95 (43) MW_{d}+SW_{d-1}\geqslant DW_{predict_d} \times 0,95 \tag{43}MW _d+S Wd - 1⩾D WP re d i c td×0,95( 43 )
8.1.6 Gewährleistung einer normalen Lieferung während der Woche
Um sicherzustellen, dass Roboterbestellungen für die ganze Woche mit einer Wahrscheinlichkeit von mehr als 85 % ausgeliefert werden können, werden folgende Randbedingungen gemacht:
∑ d = 1 7 MW d ⩾ 0,85 × ∑ d = 1 7 DW vorhergesagt (44) \sum_{d=1}^7MW_d \geqslant 0,85 \times \sum_{d=1}^7DWpredict_d \tag{44}d = 1∑7MW _d⩾0,85×d = 1∑7D W P re d i c td( 44 )
Es ist erwähnenswert, dass die täglichen Bestellungen mit einer Wahrscheinlichkeit von mehr als 95 % geliefert wurden und die Roboterbestellungen der ganzen Woche mit einer Wahrscheinlichkeit von mehr als 85 % geliefert werden müssen, d. h. Gleichung (44) wurde in Gleichung (43) impliziert. Daher reicht es aus, jeden Tag eine normale Lieferung sicherzustellen, dh Formel (43) kann ignoriert werden.