SoylentCalculator/Rezept.mod
Wurzelkoch 22ec46283e Alnatura Preise
Namen in Rezept-pool geändert.
Preise in Rezept-dat eingefügt.
Nährwerte noch nicht.
Alle Preise auf 1kg
2019-11-28 16:12:50 +01:00

27 lines
1.5 KiB
Modula-2

set ZUTATEN;
set STOFFE;
set INDEX; #Indexmenge
param preis {z in ZUTATEN} >= 0;
param werte {z in ZUTATEN, s in STOFFE} >= 0;
param minwert {s in STOFFE} >= 0 default 0;
param maxwert {s in STOFFE} >= 0 default Infinity;
var menge {z in ZUTATEN} >= 0;
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 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.
var kaufpreis = sum {z in ZUTATEN} preis[z]*menge[z];
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 total_weight_penalty = sum {z in ZUTATEN} menge[z]*weight_penalty*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];
#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;
subject to ugrenze {s in STOFFE}: rezeptwert[s] >= minwert[s];
#subject to ogrenze {s in STOFFE}: rezeptwert[s] <= maxwert[s];
subject to omega_ratio_constraint: omega_ratio <= 6;