From 51df63666ea128835e7b2810d5be95b72db669fb Mon Sep 17 00:00:00 2001
From: Wurzelkoch <wurzelkoch@users.sf.net>
Date: Wed, 11 Dec 2019 10:37:28 +0100
Subject: [PATCH] Andere penalty Gewichtung

---
 README.md  | 2 +-
 Rezept.mod | 6 +++---
 config.dat | 6 ++++--
 main.ampl  | 2 +-
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/README.md b/README.md
index 6978255..57624fd 100644
--- a/README.md
+++ b/README.md
@@ -34,5 +34,5 @@ weiter ausführen.
 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
 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.
 
diff --git a/Rezept.mod b/Rezept.mod
index 944d6a2..8ce0b0b 100644
--- a/Rezept.mod
+++ b/Rezept.mod
@@ -8,18 +8,18 @@ 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 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
 #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 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} 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];
 #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 ogrenze {s in STOFFE}: rezeptwert[s] <= maxwert[s]; #undefined should render Infinity here.
 subject to omega_ratio_constraint: omega_ratio <= 6;
diff --git a/config.dat b/config.dat
index 0da84e1..da7fbf6 100644
--- a/config.dat
+++ b/config.dat
@@ -1,4 +1,5 @@
 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:
 param bezugsmenge:=
@@ -8,7 +9,8 @@ Multivitamine 1
 
 #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.
+#Should be below 1, in order not to overrate this compared to weight and price
 param pill_penalty: 1 2:=
-Multivitamine       1 1
-MultivitamineOR     1 10
+Multivitamine       1 .1
+MultivitamineOR     1 .1
 ;
diff --git a/main.ampl b/main.ampl
index 582681f..f3d95e7 100644
--- a/main.ampl
+++ b/main.ampl
@@ -3,4 +3,4 @@ model Rezept.mod;
 data Rezept.dat;
 option solver "ampl.linux64/minos";
 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 ;