2019-04-29 08:42:59 +00:00
|
|
|
set ZUTATEN;
|
|
|
|
set STOFFE;
|
|
|
|
set INDEX; #Indexmenge
|
2020-02-19 22:05:41 +00:00
|
|
|
param preis {z in ZUTATEN} >= 0; #in €/kg oder €/10Stück
|
|
|
|
param werte {z in ZUTATEN, s in STOFFE} >= 0; #je 100g oder Stück
|
|
|
|
param minwert {s in STOFFE} >= 0 default 0; #ebenso
|
|
|
|
param maxwert {s in STOFFE} >= 0 default Infinity; #ebenso
|
|
|
|
var menge {z in ZUTATEN} >= 0; # in g oder Stück
|
2019-12-15 10:21:03 +00:00
|
|
|
param ref {z in ZUTATEN} >= 0 default 0;
|
2019-04-29 08:42:59 +00:00
|
|
|
|
|
|
|
param bezugsmenge {z in ZUTATEN} default 100; #nicht immer ist menge in 100g, teilweise in Stück
|
2019-12-11 09:37:28 +00:00
|
|
|
param weight_penalty >= 0 <= 1 default 0.05; #Transportkosten je 100g
|
2019-11-28 15:12:50 +00:00
|
|
|
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.
|
2019-04-29 08:42:59 +00:00
|
|
|
|
2020-02-19 22:05:41 +00:00
|
|
|
var kaufpreis = sum {z in ZUTATEN} preis[z]/(10*bezugsmenge[z])*menge[z]; #Alnatura-Preise sind in €/1kg statt 100g…
|
2019-04-29 08:42:59 +00:00
|
|
|
var omega_ratio = sum{z in ZUTATEN} menge[z]*werte[z,"Omega-6"]/sum{y in ZUTATEN} menge[y]*werte[z,"Omega-3"];
|
2020-02-19 22:05:41 +00:00
|
|
|
var rezeptwert {s in STOFFE} = sum {z in ZUTATEN} menge[z]*werte[z,s]/bezugsmenge[z];
|
|
|
|
var total_weight = sum {z in ZUTATEN} menge[z];
|
2019-04-29 08:42:59 +00:00
|
|
|
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.
|
|
|
|
|
2019-12-11 09:40:23 +00:00
|
|
|
minimize gesamtpreis: kaufpreis*(1-weight_penalty) + total_weight/100*weight_penalty + total_pill_penalty;
|
2019-11-29 14:58:38 +00:00
|
|
|
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.
|
2020-02-19 22:05:41 +00:00
|
|
|
#subject to omega_ratio_constraint: omega_ratio <= 6;
|
2019-04-29 08:42:59 +00:00
|
|
|
|