$Title Umladeproblem $Ontext Vorlesung: Supply Chain Management Abschnitt: 4.2 Strategische Netzwerkplanung Problemstellung: Festlegung von Liefermengen und Transferpreisen zwischen Supply-Chain-Partnern als bilineares Programm - Data - Author: Christoph Schwindt Date: 12/01/2020 $Offtext $eolcom// $include tpo_data.gms variables gewinn Gesamtgewinn der Supply Chain nach Steuern (Zielfunktion) pi(j) Transferpreis fuer Lieferbeziehung j v(j) Menge von Lieferbeziehung j ; positive variables pi, v ; ***** Exaktes Modell ***** equations def_gewinn Definition des Gesamtgewinns nebenbedingungen_fuer_pi(i) Nebenbedingungen fuer pi-Variablen in >=-Schreibweise nebenbedingungen_fuer_v(i) Nebenbedingungen fuer v-Variablen in >=-Schreibweise ; def_gewinn.. gewinn =e= sum(j, d(j)*pi(j)*v(j)) + sum(j, c(j)*pi(j)) + sum(j, cBar(j)*v(j)) ; nebenbedingungen_fuer_pi(i)$ipi(i).. sum(j, a(i,j)*pi(j)) =g= b(i) ; nebenbedingungen_fuer_v(i)$iv(i).. sum(j, aBar(i,j)*v(j)) =g= bBar(i) ; model tpo / def_gewinn, nebenbedingungen_fuer_pi, nebenbedingungen_fuer_v / ; options nlp = lindoglobal optcr = 1e-6 reslim = 60 ; solve tpo maximizing gewinn using nlp ; display 'Loesung des exakten Modells', gewinn.l, pi.l, v.l ; ******************************* ***** Heuristik von Konno ***** equations def_gewinn_lp_v Definition des Gesamtgewinns fuer gegebene v-Werte def_gewinn_lp_pi Definition des Gesamtgewinns fuer gegebene pi-Werte ; def_gewinn_lp_v.. gewinn =e= sum(j, d(j)*pi(j)*v_val(j)) + sum(j, c(j)*pi(j)) + sum(j, cBar(j)*v_val(j)) ; def_gewinn_lp_pi.. gewinn =e= sum(j, d(j)*pi_val(j)*v(j)) + sum(j, c(j)*pi_val(j)) + sum(j, cBar(j)*v(j)) ; model tpo_v / def_gewinn_lp_v, nebenbedingungen_fuer_pi / ; model tpo_pi / def_gewinn_lp_pi, nebenbedingungen_fuer_v / ; option lp = cplex ; tpo_v.solprint = 2 ; // Unterdrueckung der Eintraege im Listing-File tpo_pi.solprint = 2 ; // Unterdrueckung der Eintraege im Listing-File scalars ctr Zaehler / 1 / cont Indikator fuer Fortsetzung des Verfahrens gewinn_init Initialer Gewinn ; gewinn_init = sum(j, d(j)*pi_init(j)*v_init(j)) + sum(j, c(j)*pi_init(j)) + sum(j, cBar(j)*v_init(j)) ; set k Iterationen / k0*k100 / ; parameters report(k,*,*) Dokumentation der Iterationen ; report('k0', 'pi-Werte', j) = 0 ; // Damit die Eintrage im Report in der richtigen Reihenfolge erscheinen report('k0', 'Gewinn 1', '') = 0 ; // Damit die Eintrage im Report in der richtigen Reihenfolge erscheinen report('k0', 'v-Werte', j) = v_init(j) ; report('k0', 'Gewinn 2', '') = gewinn_init ; v_val(j) = v_init(j) ; repeat( ctr = ctr + 1 ; solve tpo_v maximizing gewinn using lp ; pi_val(j) = pi.l(j) ; report(k, 'pi-Werte', j)$(ord(k)=ctr) = pi_val(j) ; report(k, 'Gewinn 1', '')$(ord(k)=ctr) = gewinn.l ; solve tpo_pi maximizing gewinn using lp ; cont = sum(j$(v.l(j) ne v_val(j)), 1) ; v_val(j) = v.l(j) ; report(k, 'v-Werte', j)$(ord(k)=ctr) = v_val(j) ; report(k, 'Gewinn 2', '')$(ord(k)=ctr) = gewinn.l ; until not cont ) ; display 'Schritte der Konno-Heuristik', report ;