%%Zur Ausfuehrung des Programms alles bis auf den Startaufruf markieren. Im Menue Oz %%den Eintrag -Feed Region- auswaehlen. Anschliessend den gewuenschten Startaufruf markieren %%und ebenfalls den Eintrag -Feed Region- auswaehlen. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%% %%%Eingabedaten%%%%% %%%%%%%%%%%%%%%%%%%% declare Auftragsliste = auftragsliste(fa: [ga(pet:6 pd:4 mg:1 vb:1 pro:3) fb(pet:6 pd:4 mg:1 vb:1 pro:3) kc(pet:9 pd:7 mg:1 vb:1 pro:4) ed(pet:9 pd:8 mg:1 vb:1 pro:5) we(pet:12 pd:8 mg:1 vb:1 pro:5) tf(pet:21 pd:15 mg:1 vb:1 pro:9) zg(pet:21 pd:11 mg:1 vb:1 pro:1) hh(pet:21 pd:11 mg:1 vb:1 pro:5) ai(pet:24 pd:7 mg:1 vb:1 pro:3) bj(pet:27 pd:7 mg:1 vb:1 pro:3) ck(pet:30 pd:7 mg:1 vb:1 pro:4) dl(pet:39 pd:20 mg:1 vb:1 pro:7) tm(pet:39 pd:20 mg:1 vb:1 pro:7) gn(pet:45 pd:20 mg:1 vb:1 pro:7)]) Ruestzeitenmatrix = ruestzeiten(zeiten(0 30 60 50 90 120 150 180 210 240) zeiten(30 0 30 30 60 90 120 150 180 210) zeiten(60 30 0 20 30 60 90 120 150 180) zeiten(50 30 20 0 30 60 90 120 150 180) zeiten(90 60 30 30 0 30 60 90 120 150) zeiten(120 90 60 60 30 0 30 60 90 120) zeiten(150 120 90 90 60 30 0 30 60 90) zeiten(180 150 120 120 90 60 30 0 30 60) zeiten(210 180 150 150 120 90 60 30 0 30) zeiten(240 210 180 180 150 120 90 60 30 0)) %%%%%%%%%%%%%%%%%%%%%%%%% %%%Funktionspool%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% fun {GetPet FaSpezi} {List.toRecord pet {Map FaSpezi fun {$ Y} {Label Y}#Y.pet end}} end fun {GetPd FaSpezi} {List.toRecord pd {Map FaSpezi fun {$ Y} {Label Y}#Y.pd end}} end fun {GetVerbrauch FaSpezi} {List.toRecord vb {Map FaSpezi fun {$ Y} {Label Y}#Y.vb end}} end fun {GetProdukt FaSpezi} {List.toRecord pro {Map FaSpezi fun {$ Y} {Label Y}#Y.pro end}} end fun {GetAuftraegeAufMaschinengruppe FaSpezi} D={Dictionary.new} in {ForAll FaSpezi proc {$ Y} if {HasFeature Y mg} then R=Y.mg in {Dictionary.put D R {Label Y}|{Dictionary.condGet D R nil}} end end} {Dictionary.toRecord tor D} end %%%%%%%%%%%%%%%%%%%%%%% %%%Scripterzeugung%%%%% %%%%%%%%%%%%%%%%%%%%%%% fun {Compile Spezifikation} FaSpezi = Spezifikation.fa Auftraege = {Map FaSpezi Label} %Liste aller FA AnzFA = {List.length Auftraege} %Anzahl der FA Pet = {GetPet FaSpezi} %Produktionsendtermine der FA Pd = {GetPd FaSpezi} %Produktionsdauer der FA AuftrMg = {GetAuftraegeAufMaschinengruppe FaSpezi} %FA die auf einer Maschinengruppe produziert werden Verbrauch = {GetVerbrauch FaSpezi} %Verbrauch an Kapazitaet fuer jeden FA --> immer 1 Produkt = {GetProdukt FaSpezi} %Liste, welches Produkt der FA enthaelt KumKap = kap(4) %Anzahl der Maschinen in einer Maschinengruppe in proc {$ Loesung} Start = {FD.record start Auftraege 0#FD.sup} %Zeitpunkt an dem die Produktion des FA beginnt Zuordnung = {FD.record zuordnung Auftraege 1#KumKap.1} %Zuordnung auf welcher Maschine ein FA bearbeitet wird X = {NewCell 10000} Wert = {NewCell 0} Wert2 = {NewCell 0} Wert3 = {NewCell 0} Wert4 = {NewCell 0} XM = {NewCell 10000} AktuFA = {NewCell 0} FolgFA = {NewCell 0} AktuProd = {NewCell 0} FolgProd = {NewCell 0} SumRuest = {NewCell 0} GesamtRuest= {FD.decl} in Loesung = loesung(starttermin: Start maschinenzuordnung: Zuordnung ruestzeitensumme: GesamtRuest) %Constraints zur Einhaltung der Produktionsendtermine %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {ForAll Auftraege proc {$ Y} Pet.Y - Pd.Y >=: Start.Y end} %Kapazitaetsconstraint zur Einhaltung der kumulierten Kapazitaet der Maschinengruppe %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {Schedule.cumulative AuftrMg Start Pd Verbrauch KumKap} %Erste Distribuierung: nach Start %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {FD.distribute ff Start} %Constraints zur Einhaltung der Kapazitaet auf der einzelnen Maschine %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {ForAllTail Auftraege proc {$ Y1|Yr} {ForAll Yr proc {$ Y2} if Start.Y1 == Start.Y2 then Zuordnung.Y2 \=: Zuordnung.Y1 elseif Start.Y1 < Start.Y2 andthen Start.Y2 - Start.Y1 < Pd.Y1 then Zuordnung.Y1 \=: Zuordnung.Y2 elseif Start.Y2 < Start.Y1 andthen Start.Y1 - Start.Y2 < Pd.Y2 then Zuordnung.Y1 \=: Zuordnung.Y2 end end} end} %Einschraenkung der Symmetrien durch festsetzen des ersten FA auf die Maschine 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {ForAll Auftraege proc {$ Y} if Start.Y < @X then X:=Start.Y Wert:={Label Y} end end} Zuordnung.@Wert =: 1 X := 10000 {ForAll Auftraege proc {$ Y} if Start.Y < @X andthen @Wert \= {Label Y} then X:=Start.Y Wert2:={Label Y} end end} Zuordnung.@Wert2 =: 2 X := 10000 {ForAll Auftraege proc {$ Y} if Start.Y < @X andthen @Wert \= {Label Y} andthen @Wert2 \= {Label Y} then X:=Start.Y Wert3:={Label Y} end end} Zuordnung.@Wert3 =: 3 X := 10000 {ForAll Auftraege proc {$ Y} if Start.Y < @X andthen @Wert \= {Label Y} andthen @Wert2 \= {Label Y} andthen @Wert3 \= {Label Y} then X:=Start.Y Wert4:={Label Y} end end} Zuordnung.@Wert4 =: 4 %Zweite Distribuierung: nach Zuordnung %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {FD.distribute ff Zuordnung} %Ermittlung der Ruestzeitensumme %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {For 1 KumKap.1 1 %Ruestzeiten auf jeder Maschine ermitteln proc {$ M} {ForAll Auftraege % StartWert ermitteln proc {$ Y} if Start.Y < @XM andthen Zuordnung.Y == M then XM:=Start.Y AktuFA:={Label Y} AktuProd := Produkt.Y end end} XM:=10000 {For 1 AnzFA 1 proc {$ X} if @AktuFA \= 0 then {ForAll Auftraege % Wert nach MinWert ermitteln proc {$ Y} if Start.Y < @XM andthen Zuordnung.Y == M andthen Start.Y > Start.@AktuFA then XM:=Start.Y FolgFA:={Label Y} FolgProd := Produkt.Y end end} if @AktuFA \= @FolgFA andthen @FolgProd \= 0 then SumRuest:=@SumRuest + Ruestzeitenmatrix.@AktuProd.@FolgProd end XM:= 10000 AktuFA:=@FolgFA AktuProd:=@FolgProd end end} AktuFA:=0 AktuProd:=0 FolgFA:=0 FolgProd:=0 XM:=10000 end} GesamtRuest =: @SumRuest end end %%%%%%%%%%%%%%%%%%%%%%%% %Bewertungsfunktion%%% %%%%%%%%%%%%%%%%%%%%%%%% proc {MinRuest Old New} New.ruestzeitensumme <: Old.ruestzeitensumme end %%%%%%%%%%%%%%%%%%%% %%%Startaufrufe%%%%% %%%%%%%%%%%%%%%%%%%% {ExploreOne {Compile Auftragsliste}} {ExploreAll {Compile Auftragsliste}} {ExploreBest {Compile Auftragsliste} MinRuest} %Ermittlung der Besten Loesung durch Branch and Bound