Andere penalty Gewichtung
This commit is contained in:
parent
630f6d145d
commit
51df63666e
|
@ -34,5 +34,5 @@ weiter ausführen.
|
||||||
Zeile aktiv ist. Die Datei grenzen-orig.dat sollte nicht verändert werden.
|
Zeile aktiv ist. Die Datei grenzen-orig.dat sollte nicht verändert werden.
|
||||||
* Wenn die Datei grenzen-orig.dat aktiv ist und in zutaten.dat nur die Zeilen mit *OR aktiv sind, erhält das Programm
|
* Wenn die Datei grenzen-orig.dat aktiv ist und in zutaten.dat nur die Zeilen mit *OR aktiv sind, erhält das Programm
|
||||||
genau die Eingabedaten des ursprünglichen Rezepts.
|
genau die Eingabedaten des ursprünglichen Rezepts.
|
||||||
* Für diverse Strafkosten: in config.dat rumspielen.
|
* Für diverse Strafkosten: in config.dat rumspielen. Dort die Kommentare beachten.
|
||||||
|
|
||||||
|
|
|
@ -8,18 +8,18 @@ param maxwert {s in STOFFE} >= 0 default Infinity;
|
||||||
var menge {z in ZUTATEN} >= 0;
|
var menge {z in ZUTATEN} >= 0;
|
||||||
|
|
||||||
param bezugsmenge {z in ZUTATEN} default 100; #nicht immer ist menge in 100g, teilweise in Stück
|
param bezugsmenge {z in ZUTATEN} default 100; #nicht immer ist menge in 100g, teilweise in Stück
|
||||||
param weight_penalty >= 0 default 0.05; #Transportkosten je 100g
|
param weight_penalty >= 0 <= 1 default 0.05; #Transportkosten je 100g
|
||||||
param pill_penalty {z in ZUTATEN, i in INDEX} default 0; #für einzelne Zutaten können Strafkosten bei Überschreiten einer Höchstmenge verhängt werden
|
param pill_penalty {z in ZUTATEN, i in INDEX} default 0; #für einzelne Zutaten können Strafkosten bei Überschreiten einer Höchstmenge verhängt werden
|
||||||
#Die Höchstmenge wird in pill_penalty[z,1], die Strafkosten für jede darüberliegende Einheit in pill_penalty[z,2] gespeichert.
|
#Die Höchstmenge wird in pill_penalty[z,1], die Strafkosten für jede darüberliegende Einheit in pill_penalty[z,2] gespeichert.
|
||||||
|
|
||||||
var kaufpreis = sum {z in ZUTATEN} preis[z]/10*menge[z]; #Alnatura-Preise sind in 1kg statt 100g…
|
var kaufpreis = sum {z in ZUTATEN} preis[z]/10*menge[z]; #Alnatura-Preise sind in 1kg statt 100g…
|
||||||
var omega_ratio = sum{z in ZUTATEN} menge[z]*werte[z,"Omega-6"]/sum{y in ZUTATEN} menge[y]*werte[z,"Omega-3"];
|
var omega_ratio = sum{z in ZUTATEN} menge[z]*werte[z,"Omega-6"]/sum{y in ZUTATEN} menge[y]*werte[z,"Omega-3"];
|
||||||
var rezeptwert {s in STOFFE} = sum {z in ZUTATEN} menge[z]*werte[z,s];
|
var rezeptwert {s in STOFFE} = sum {z in ZUTATEN} menge[z]*werte[z,s];
|
||||||
var total_weight_penalty = sum {z in ZUTATEN} exp(menge[z]*weight_penalty*bezugsmenge[z]/100); #je 100g
|
var total_weight = sum {z in ZUTATEN} menge[z]*bezugsmenge[z]/100; #je 100g
|
||||||
var total_pill_penalty = sum {z in ZUTATEN} max(menge[z]-pill_penalty[z,1],0)*pill_penalty[z,2];
|
var total_pill_penalty = sum {z in ZUTATEN} max(menge[z]-pill_penalty[z,1],0)*pill_penalty[z,2];
|
||||||
#Wenn die zutatenweise Obergrenze in pill_penalty[z,1] überschritten ist, werden Strafkosten für die Überschussmenge berechnet.
|
#Wenn die zutatenweise Obergrenze in pill_penalty[z,1] überschritten ist, werden Strafkosten für die Überschussmenge berechnet.
|
||||||
|
|
||||||
minimize gesamtpreis: kaufpreis + total_weight_penalty + total_pill_penalty;
|
minimize gesamtpreis: kaufpreis*(1-weight_penalty) + total_weight*weight_penalty + total_pill_penalty;
|
||||||
subject to ugrenze {s in STOFFE}: rezeptwert[s] >= minwert[s]; #undefined renders 0 => no problem here
|
subject to ugrenze {s in STOFFE}: rezeptwert[s] >= minwert[s]; #undefined renders 0 => no problem here
|
||||||
subject to ogrenze {s in STOFFE}: rezeptwert[s] <= maxwert[s]; #undefined should render Infinity here.
|
subject to ogrenze {s in STOFFE}: rezeptwert[s] <= maxwert[s]; #undefined should render Infinity here.
|
||||||
subject to omega_ratio_constraint: omega_ratio <= 6;
|
subject to omega_ratio_constraint: omega_ratio <= 6;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
param weight_penalty 0.5455; #Transportkosten je 100g
|
param weight_penalty 0.5455; #Transportkosten je 100g
|
||||||
|
#should be below 1. If equal 1, prices will not be taken into account.
|
||||||
|
|
||||||
#Um einzelne Zutaten nach Stück statt 100g zu berechnen:
|
#Um einzelne Zutaten nach Stück statt 100g zu berechnen:
|
||||||
param bezugsmenge:=
|
param bezugsmenge:=
|
||||||
|
@ -8,7 +9,8 @@ Multivitamine 1
|
||||||
|
|
||||||
#für einzelne Zutaten können Strafkosten bei Überschreiten einer Höchstmenge verhängt werden
|
#für einzelne Zutaten können Strafkosten bei Überschreiten einer Höchstmenge verhängt werden
|
||||||
#Die Höchstmenge wird in pill_penalty[z,1], die Strafkosten für jede darüberliegende Einheit in pill_penalty[z,2] gespeichert.
|
#Die Höchstmenge wird in pill_penalty[z,1], die Strafkosten für jede darüberliegende Einheit in pill_penalty[z,2] gespeichert.
|
||||||
|
#Should be below 1, in order not to overrate this compared to weight and price
|
||||||
param pill_penalty: 1 2:=
|
param pill_penalty: 1 2:=
|
||||||
Multivitamine 1 1
|
Multivitamine 1 .1
|
||||||
MultivitamineOR 1 10
|
MultivitamineOR 1 .1
|
||||||
;
|
;
|
||||||
|
|
|
@ -3,4 +3,4 @@ model Rezept.mod;
|
||||||
data Rezept.dat;
|
data Rezept.dat;
|
||||||
option solver "ampl.linux64/minos";
|
option solver "ampl.linux64/minos";
|
||||||
solve;
|
solve;
|
||||||
display {i in ZUTATEN} menge[i]*bezugsmenge[i], sum{i in ZUTATEN} menge[i]*bezugsmenge[i], kaufpreis ;
|
display {i in ZUTATEN} menge[i]*bezugsmenge[i], total_weight, kaufpreis ;
|
||||||
|
|
Loading…
Reference in a new issue