Compare commits

...

3 commits

Author SHA1 Message Date
Wurzelkoch fcf4a3177a kleiner Fehler 2019-12-11 10:40:23 +01:00
Wurzelkoch 51df63666e Andere penalty Gewichtung 2019-12-11 10:37:28 +01:00
Wurzelkoch 630f6d145d Ausgabe angepasst - jetzt in Gramm/Tag 2019-12-08 09:47:11 +01:00
5 changed files with 11 additions and 9 deletions

View file

@ -6,7 +6,7 @@
ampl.linux64/ampl ampl.linux64/ampl
2. Eingabe 2. Eingabe
include main.ampl; include main.ampl;
3. Es werden der Kaufpreis in Euro/Tag und die Einkaufsmengen in 100g/Tag (außer Vitaminpillen) angezeigt. 3. Es werden die Einkaufsmengen in g bzw. Stück (bei Vitaminpillen), die Gesamtmasse in g und der Kaufpreis in Euro jeweiln für eine Tagesration angezeigt.
Andere berechnete Werte können mit Andere berechnete Werte können mit
display variable; display variable;
angezeigt werden. angezeigt werden.
@ -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.

View file

@ -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];
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/100*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;

View file

@ -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
; ;

View file

@ -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 kaufpreis, menge, sum{i in ZUTATEN} menge[i]; display {i in ZUTATEN} menge[i]*bezugsmenge[i], total_weight, kaufpreis ;

View file

@ -5,7 +5,7 @@ MultivitamineOR
#SonnenblumenölOR #SonnenblumenölOR
#PuderzuckerOR #PuderzuckerOR
ErbsenproteinOR ErbsenproteinOR
WeizenmehlOR #WeizenmehlOR
#OlivenölOR #OlivenölOR
#MaltodextrinOR #MaltodextrinOR
#Sojaflocken #Sojaflocken