Mathematische Optimierung von Ernährungsaufgaben mit Excel, Solver und Python

March 31, 2024

In diesem Beitrag geht es um Optimierungsaufgaben. Man kann auch von Entscheidungsproblemen sprechen, und ich zeige, wie man sie in Excel mit dem Solver oder mit Python löst.

Optimieren bedeutet, ich möchte möglichst viel oder möglichst wenig von etwas erreichen, und zwar immer unter gewissen Restriktionen. Also z.B. möglichst viele Essensportionen bei gegebenem Budget oder möglichst geringes Gewicht für die Nahrungsmittel eines Extremsportlers bei gegebenen Mindest-Energiemengen.

Weiterhin soll es hier nur um konkrete, mathematisch formulierbare Problemstellungen gehen, bei denen die Modellparameter auch im eigenen Einflussbereich liegen. Also Entscheidungsprobleme, keine inneren-Schweinehund-Überwindungsprobleme.

Ein Beispiel

Ich benötige bestimmte Mengen zweier Nährstoffe, nennen wir sie mal einfallslos Nährstoff 1 und Nährstoff 2.

Nun soll es zwei Produkte geben, die die beiden Nährstoffe in unterschiedlichen Mengen enthalten, und natürlich zu unterschiedlichen Preisen. Unter der Annahme, dass man die beiden Produkte kombinieren kann, ist nun die optimale Kombination in Bezug auf den Preis zu finden.

Ich hatte in einem anderen Beitrag vollmundig (natürlich muss ich wieder Begriffe aus der Ernährung unterbringen) angekündigt, dass die Themen hier etwas über das (Erbsen) Zählen hinausgehen, aber keine Angst, ich glaube, dass die hier genutzten Formeln noch gut verständlich sind und den Sachverhalt sehr einfach darstellen.

Also:

  • Produkt A soll 2 Einheiten von Nährstoff 1 haben und 1 Einheit von Nährstoff B
  • Produkt B soll 1 Einheit von Nährstoff 1 haben und 3 Einheiten von Nährstoff B
  • Produkt A kostet 1 EUR je Einheit
  • Produkt B kostet 1,5 EUR je Einheit
  • x ist die Anzahl der Einheiten von Produkt A
  • x ist die Anzahl der Einheiten von Produkt B

x und y sind also keine gegebenen Parameter wie die Preise und der Nährstoffgehalt, sondern genau die zu findende Lösung. Wir suchen also die Kombinationen für x und y, für die die Kosten möglichst niedrig sind.

Man nennt das "Zielfunktion". Mithilfe der Preise kann man diese wie folgt formulieren:

1 x + 1,5 y -> min

Wenn diese Schilderung die Aufgabe vollständig widerspiegeln würde, wäre die Lösung klar: 0 Einheiten von Produkt A und 0 Einheiten von Produkt B sind am billigsten, also x=0 und y=0. Das wäre natürlich irgendwie sinnlos, und in der Praxis kommen jetzt die Restriktionen (=Vorgaben) ins Spiel.

Sagen wir mal, dass ich einen Produktcocktail benötige, der mind. 10 Einheiten von Nährstoff 1 und 15 Einheiten von Nährstoff 2 enthält. Oben hatte ich den jeweiligen Nährstoffgehalt der Produkte aufgeführt.

Daraus ergibt sich die Nährstoffmenge 1 als x * 2 plus y * 1. Und diese muss >= 10 sein.
Und x * 1 plus y * 3 muss >= 15 sein.
Somit per Formel:

2x + 1y >= 10
1x + 3y >= 15

Kleines Gedankenspiel; kann man das eigentlich mit ein wenig überlegen einfach herausbekommen? Bzw. woran liegt es, dass es hier nicht so einfach ist? Nun, der Knackpunkt ist, dass sich über die unterschiedlichen Nährstoffgehalte innerhalb der Produkte A und B gegenläufige Preise ergeben. Nährstoff 1 erhält man billiger über Produkt A, Nährstoff 2 über Produkt B. Würde ein Produkt beide Nährstoffe günstiger als das andere Produkt liefern können, wäre die Sache klar, man bräuchte nur das eine Produkt.

Der Simplex-Algorithmus

Ein Algorithmus ist eine Rechenvorschrift. Und Basis für das Erfinden und spätere Ausführen einer solchen Vorschrift ist, dass das Problem formalisiert dargestellt werden kann. Und in der Tat geht die Formeldarstellung in diese Richtung. Wenn man die Zahlen, die eigentlich das Problem beschreiben, also in unserem Fall die Nährstoffgehalte, Kosten und Mindestnährwerte tabellarisch oder mathematisch darstellt, kann man damit den Algorithmus füttern. Man nennt diese Zahlen auch die Koeffizienten. Nehmen wir dafür auch wiederum Buchstaben, ergibt sich als Zielfunktion:

c1 x1 + c2 x2 -> minimieren

Und die Restriktionen:

a11 x1 + a12 x2 <= b1
a21 x1 + a22 x2 <= b2

Man kann die Restriktionen mit Matrixschreibweise noch kompakter schreiben, nämlich A x <= b.

Übrigens: ich bin jetzt mal kurz von x und y auf x1 und x2 umgeschwenkt. Damit soll angedeutet werden, dass auch mehr als nur zwei Variablen Bestandteil des Problems sein können. Also auch x3, x4 ...
Es können auch mehr als 2 Restriktionen beteiligt sein, es können Gleichungen anstelle der Ungleichungen genutzt werden, es kann auch maximiert statt minimiert werden und und und.

Bereits etwa 1940 wurde mit dem Simplex-Algorithmus eine Methode zur Lösung solcher Probleme entwickelt. Die eigentliche Rechenvorschrift geht zu weit für diesen Artikel, es sei nur das Grundprinzip genannt, dass die Ungleichungen über die Einführung zusätzlicher Variablen, der sog. Schlupfvariablen, in Gleichungen umgewandelt werden, die dann "gelöst" werden können. So entstehen also gültige Lösungen (oder man kommt zur Erkenntnis, dass es keine gültigen Lösungen gibt), die dann im Folgenden verfeinert werden können.

Kurvendiskussion

Ob man den Simplex Algorithmus verstehen möchte, oder einfach nur tiefer in das Beispiel einsteigen möchte - eine graphische Darstellung hilft.

Zumindest, wenn es nur zwei Variablen gibt. Also zurück von der allgemeinen Betrachtung zum Ernährungsbeispiel mit den zwei Produkten A und B, von denen wir die optimalen Mengen x und y für unseren Nährstoffcocktail ermitteln möchten.
Klingelt da etwas aus der Schulzeit? Ein Wertepaar x und y kann man in ein Koordinatensystem eintragen, mit x horizontal und y vertikal. Nun zu den Restriktionen.

2x + 1y >= 10 kann man umformen in y >= -2x + 10.

Y = -2x + 10 ist eine Gerade mit dem Y-Abschnitt 10 und der Steigung -2. Sie durchschneidet die X-Achse bei 5. Die Nährstoffrestriktion wird für alle Punkte, also Wertepaare x, y, erfüllt, die oberhalb der Geraden liegen.
Die zweite Nährstoffrestriktion, 1x + 3y >= 15, kann umgeformt werden zu y >= -1/3 x + 5.

Beide Geraden sind in der folgenden Graphik eingezeichnet. Restriktion 1 in blau, Restriktion 2 in rot.

Graph Lösungsraum

Der lila Bereich ist derjenige, für die die Punkte x, y oberhalb beider Geraden liegen, also beide Restriktionen erfüllt werden. Es handelt sich hier um den Lösungsraum.

Der Lösungsraum ist unendlich groß, denn nach oben sind keine Grenzen gesetzt. Aber die Produkte kosten ja Geld, so liegt auf der Hand, dass die optimalen Lösungen, also diejenigen mit den geringsten Kosten, am linken bzw. unteren Rand des lila-Raums liegen, also insbesondere auf einer der beiden Geraden oder gar am Schnittpunkt der beiden Geraden.

Vielleicht zeichnen wir einfach mal die Zielfunktion auf die gleiche Art ein wie die beiden Restriktionen.

Formen wir die Zielfunktion 1 x + 1,5 y -> min mal um. Hoppla, hier steht ja nun einfach "min", wo bei den Restriktionen eine Zahl stand. Also:
y = - 2/3 x + 2/3 * min

Wir kennen also die Steigung, aber nicht den Y-Abschnitt. Eine Gerade stellt die Kombinationen von x und y dar, die auf einem Preisniveau liegen. Der Y-Abschnitt steht für die Kosten, wobei noch der Faktor 2/3 berücksichtigt werden muss.

Graph Zielfunktionen

Wir haben also zunächst einen Lösungsraum gezeichnet, nun haben wir ganz viele Geraden, die die unterschiedlichen Kostenniveaus darstellen. Versuchen wir also, die niedrigste Gerade zu finden, die gerade noch den Lösungsraum berührt. Wenn es genau einen Schnittpunkt gibt, haben wir die optimale Lösung (und natürlich kann es auch sein, dass es keine Lösung oder auch viele Lösungen gibt.

Graph Lösung

Die Lösung liegt hier also bei x = 3 und y = 4. Die Zielgerade ist diejenige mit dem Y-Achsenabschnitt 6, was durch 2/3 dividiert 9 ergibt. 9 sind also die minimalen Kosten.

Kleine Anmerkung, dieses einfache Beispiel suggeriert, als wäre es einfach immer der Schnittpunkt dreier Geraden. Das ist nicht der Fall. Man stelle sich ein Modell mit 5 Restriktionen vor. Dann besteht der Lösungsraum aus einem Polygon mit mehreren Ecken. Durch jede Ecke verläuft eine mögliche Repräsentation einer Zielgeraden, und die niedrigste führt zur optimalen Lösung.

Excel und der Solver

Der Solver ist ein (vermutlich eher unbekanntes) Addin in Excel, das in der Lage ist, diese Optimierungsproblems zu lösen.

Es ist typischerweise in den Excel Optionen zunächst unter "Inaktive Anwendungs-Add-Ins" gelistet und muss über die Funktion "Verwalten" durch Anklicken angeschaltet werden.

solver Addin

Anschließend steht der Solver im Menü-Band "Daten" zur Verfügung.

solver addin ribbon

Die Anwendung des Solvers auf das Ernährungsbeispiel ist in der folgenden, herunterladbaren Excel-Arbeitsmappe implementiert.

Hier klicken zum Download des Excel-Beispiels

Im ersten Blatt ist zunächst die Aufgabenstellung in einer Tabelle aufgeführt.

Solver Aufgabenstellung

Die orangenen Felder enthalten die Parameter, die oben aufgelistet wurden. In den gelben Feldern kann man Anzahlen für x und y, also die Anzahlen für Produkte A bzw. B eingeben. Hieraus ergeben sich in den grünen Feldern die Kosten und resultierenden Nährstoffmengen. Es wird weiterhin angegeben, ob für Nährstoff 1 bzw. Nährstoff 2 die Mindestmengen erreicht werden. Über bedingte Formatierungen werden die resultierenden Nährstoffmengen rot angezeigt, wenn die Mindestmengen noch nicht erreicht sind.

solver ungenügende Lösung

Die Parameter sind mit Excel-Namen versehen worden, damit man sie bequem auch in weiteren Blättern nutzen kann.

Solver Namensmanager

Im Einzelnen sind noch drei Blätter enthalten: manuelle Lösung, Solver und Python.

Bei der manuellen Lösung geht es mehr oder weniger um ein "Herumspielen" mit den Daten, um ein Gefühl dafür zu erlangen, wie die Kosten und Nährstoffgehalte zusammenhängen und wie man sich einer Lösung nähert. Dies soll hier nicht weiter behandelt werden.

Zu einer Python-Lösung kommen wir später noch, daher nun erst mal zurück zum Solver.

Um die Funktionsweise zu verstehen, muss man sich vergegenwärtigen, was weiter oben über die formale Darstellung gesagt wurde. Ein Optimierungsproblem, wie wir es behandeln, besteht im Wesentlichen aus den Restriktionen und der Zielfunktion. Somit muss ein Addin zur Problemlösung eine Möglichkeit bereitstellen, dem Addin diese Parameter bekannt zu geben. Dies geschieht über den folgenden Dialog, der erscheint, wenn man im Daten-Menü den Solver anklickt.

Solver Parameter

Genaugenommen werden aber nicht alle Parameter an das Solver-Addin übergeben, so dass dieses komplett selbstständig arbeiten könnte, sondern der Solver funktioniert im Zusammenspiel mit der direkt im Excel Blatt abgebildeten Rechenlogik. Z.B. wird als Ziel D6 festgelegt, nicht die Zielfunktion mit den Parametern 1x + 1,5y.

Die Funktion ist also in der Formel der Zelle D6 abgebildet und der Solver ruft sie immer wieder mit unterschiedlichen Werten für x und y auf. Dass x und y hierzu in die Zellen C3 und C4 geschrieben werden müssen, wird über die Angabe "Durch Ändern von Variablenzellen" bekannt gemacht.

Analog zur Zielfunktion werden auch die Funktionen, die aus den Produktmengen den Nährstoffgehalt berechnen, nicht im Solver direkt abgebildet, sondern der Solver liest immer wieder die Zellen E6 und F6 aus, in denen diese Berechnung stattfindet.

Der Solver "weiß" also gar nichts darüber, mit welcher Formel aus den Mengen auf den Nährstoffgehalt geschlossen wird (also 2x + 1y für Nährstoff 1 und 1x + 3y), sondern muss immer wieder die Zellen E6 und F6 abfragen.

Diese Art der Abbildung ist wesentlich universeller, als würde der Solver ausschließlich Parameter entgegennehmen, die dann auf festgelegte Art weiterverarbeitet werden würden.

Mit unserem funktionierenden Rechenmodell sowie der Verbindung zum Solver kann jener sich dann ans Optimieren machen. Dies sieht dann aus wie in der folgenden Abbildung, in der der Solver lediglich die Fertigmeldung zeigt und die eigentliche Lösung in der Excel-Tabelle steckt, dort sind die Werte 3 bzw. 4 für x und y, also Produktmengen A und B zu sehen, und weiterhin die resultierenden Kosten von 9.

Solver Lösung

Diese Werte kennen wir ja schon aus der graphischen Lösung, und wer es manuell versucht hat, mit dem entsprechenden Blatt in der Excel-Datei, sieht dort auch die Lösung (und kann nachvollziehen, dass es sinnlos ist, weitere Kombinationen von x und y aufzulisten, in der Hoffnung, eine bessere Lösung zu finden).

Python in Excel

In der Excel-Datei steckt auch noch eine zweite Möglichkeit, Optimierungsprobleme zu lösen, nämlich über die Programmiersprache Python. Tatsächlich geht dieser Ansatz weit über Optimierungsprobleme hinaus, sondern erlaubt grundsätzlich, bestimmte Python Programme in Excel auszuführen.

Hier nochmals der Download-Link für das Excel-Beispiel

Wer weiß noch, wofür das Akronym BASIC der gleichnamigen Programmiersprache steht? Genau: Beginners' All-purpose Symbolic Instruction Code. Meines Erachtens hat Python dieser Sprache vor allem in Bezug auf das All-purpose den Rang abgelaufen. Ich kann mit Python Spiele programmieren, Webanwendungen bauen, aber ebenso die neuesten Entwicklungen in der künstlichen Intelligenz oder dem Machine Learning nutzen.

Diese Allzweckwaffe hat Microsoft nun in Excel eingebaut, wobei man einschränkend sagen muss, sie sind (Stand März 2024) dabei, es zu tun. Momentan muss man dazu dem sog. Insider Kanal beitreten und kann Python in Excel als Beta-Version nutzen.

Wenn man diese Hürde genommen hat und eine Excel-Version mit eingebautem Python verfügbar hat, kann in eine Zelle einfach den Befehl =PY eingeben, und erlebt dann, wie die Zelle auf den Python Modus umgeschaltet wird, zu erkennen an dem grün unterlegten PY in der Formelleiste.

Mindestens genauso wichtig wie die Sprache selbst sind die Bibliotheken, die für die Nutzung mit Python zur Verfügung stehen. So wie es auf dem Smartphone "für alles eine App" gibt, gibt es für alles in Python eine Bibliothek. In Excel kann man jedoch nicht alle Bibliotheken benutzen, sondern eine von der Firma Anaconda kuratierte Zusammenstellung. Anaconda ist weitgehend spezialisiert auf Data Science, so dass dieser Bereich bestens abgedeckt ist. Insbesondere die folgenden Bibliotheken kann man geradezu als Standard in dem Bereich sehen:
(Links führen zu Amazon und sind daher Werbung, leider ist die Literatur zu diesem Themengebiet typischerweise in englischer Sprache)

Für die Lösung des Optimierungsproblems nutzen wir die Bibliothek SciPy. Genauer: den Befehl linprog aus dem Paket SciPy.

Diese Nutzung kündigt man quasi an, indem man sein Programm mit der folgenden Zeile beginnt:
from scipy.optimize import linprog

Das Programm, so wie man es in einer Python Entwicklungsumgebung wie VSCode oder Jupyter Notebook schreiben könnte, sieht folgendermassen aus:

# Kostenfunktion
c = [Kosten_je_Einheit_Produkt_A, Kosten_je_Einheit_Produkt_B]
# Ungleichungen
A = [[-enthaltene_Nährstoffe_1_in_A, -enthaltene_Nährstoffe_1_in_B],
[-enthaltene_Nährstoffe_2_in_A, -enthaltene_Nährstoffe_2_in_B]]
# rechte Seite der Ungleichungen
b = [-Mindestmenge_Nährstoff_1, -Mindestmenge_Nährstoff_2]
# Lösung
Model = linprog(c, A_ub=A, b_ub=b)
# Ergebnis
print(Model)

Die mit einem # versehenen Stellen sind Kommentare zur besseren Verständlichkeit. Die Initialisierung der Variablen wie "Kosten_je_Einheit_Produkt_A" mit dem konkreten Wert spare ich mir hier. Wie man das macht, hängt sowieso sehr stark von der verwendeten Umgebung ab. Geht es um eine Webanwendung oder eben (wie hier) um Excel.

Tatsächlich würde man auch nicht für jeden einzelnen Parameter eine eigene Variable definieren, aber das schien mir hier verständlicher als eine kompaktere, elegantere Schreibweise.

Für Personen ohne Programmierkenntnisse ist das hier starker Tobak, und dieser Artikel ist natürlich keine Einführung in Python. Wichtigste Erkenntnis ist aber: die eigentliche Nutzung der Optimierungsfunktion steckt in der einen, unscheinbaren Zeile

Model = linprog(c, A_ub=A, b_ub=b)

Zurück zu der konkreten Nutzung in Excel. Hier kann man, wie kurz angesprochen, Python Code in eine Zelle packen.

Excel in Python

Die sogenannten "Best Practices", also Nutzungsempfehlungen, über die unter Experten weitgehend Einigkeit herrscht, sind hier noch nicht so ganz ausgereift, da Python in Excel noch so jung ist.

Es kristallisiert sich aber schon heraus, dass man nicht ein ganzes Python Programm in eine Zelle packt, sondern es etwas aufteilt.

Hier prallen im Prinzip die (möglicherweise) chaotische Sicht einer Tabellenkalkulation (ein großes Arbeitsblatt mit Verbindungen kreuz und quer) mit der sogenannten prozeduralen Sicht eines Programms zusammen, auch wenn ein Programm auch nicht immer von oben nach unten einfach so durchläuft.

Ein Kompromiss ist also eine gewisse Aufteilung, bei der man aber darauf achtet, dass man die Zellen mit Python Code nicht kreuz und quer verteilt, sondern einigermassen geordnet untereinander, denn sie werden auch im Prinzip von oben nach unten ausgeführt.

Nun kommen die Verbindungen von Python und der eigentlichen Excel Arbeitsmappe ins Spiel. Im Python Code kann ich Excel-Objekte einfach über die Funktion xl() nutzen. Also, z.B.

xl("enthaltene_Nährstoffe_1_in_A")
In dem Fall muss enthaltene_Nährstoffe_1_in_A als Excel-Name definiert sein, was ja in unserem Beispiel der Fall ist.

Kleine Randbemerkung: der Befehl linprog aus dem SciPy Paket kann mit Ungleichungen der Richtung "größer-gleich" nicht umgehen, sondern nur mit "kleiner-gleich". Dies ist kein Problem, die simple Umformung der Multiplikation mit Minus-Eins (also einfach ein Minuszeichen vor allen Parametern) löst das.

Mit xl() bringen wir also Excel-Arbeitsblatt-Werte in den Python-Code ein. Der Rückweg erfolgt einfach, in dem das Resultat der letzten Codezeile zum Ergebnis der Excel-Zelle wird.

Ich habe mich also dafür entscheiden, die erste Codezeile quasi alleine in eine Excel-Zelle zu packen:

from scipy.optimize import linprog

Nun schreibe ich einfach "Import SciPy" darunter, was gültiger Python-Code ist, der eben genau die Zeichenfolge "Import SciPy" ausgibt. Und diese Ausgabe landet in der Excel-Zelle, ganz einfach zur Erläuterung.

Ob die Ausgabe Erläuterungen oder tatsächliche berechnete Werte enthält, mit denen man dann in Excel etwas tun möchte, oder gar Kombinationen, bleibt jedem selbst überlassen.

Z.B. erzeugt der Python-Code …

f"Optimierte Kosten (als Prüfzahl zum Vergleich mit den in der Tabelle berechneten Kosten): {Model.fun}"

… eine Ausgabe, die ein wenig Erläuterung enthält, aber dann auch die Ausgabe des konkreten, berechneten Wertes für die minimalen Kosten Model.fun beinhaltet.

Excel in Python

Die Zellen, in denen Python Code steckt, haben links ein kleines Symbol (zwei übereinanderliegende Papierblätter?). Z.B. auch die Zellen mit den zu optimierenden Anzahlen, wo die Ausgaben Model.x[0] bzw. Model.x[1] die korrekten Werte 3 und 4 ausgeben.
Das ist übrigens so ein Programmiererding, dass Nummerierungen nicht bei 1, sondern bei 0 starten. Also x[0] und x[1] statt x1 und x2 bzw. statt x und y.

Während ich in der ersten Python-Codeauflistung für die Ausgabe einfach den Befehl print(Model) geschrieben hatte, was das Gesamtergebnis als langen Text ausgibt (nachdem Model durch linprog erstellt wurde), habe ich im Excel selektiver auf das Ergebnis zugegriffen (Model.fun, Model.x[0], Model.x[1] …)

Anwendung

Wir haben uns über ein simples Problem an die Möglichkeit der Optimierungen, insbesondere in Excel mit Solver oder Python, herangearbeitet. Die Frage ist nun, was sind tatsächlich Anwendungen in der Ernährung? Wer die Optimierungsalgorithmen, lineare Optimierung, lineare Programmierung, Simplex usw. aus dem Studium kennt (gehört übrigens zum Fachgebiet Operations Research), der kennt solche Ansätze vor allem aus der industriellen Produktionsplanung. Und wird evtl. überrascht sein, dass eines der ersten Anwendungsgebiete tatsächlich aus dem Bereich Ernährung kam, und dass die aufgeworfene Fragestellung viel zur Entwicklung des Simplex Algorithmus beigetragen hat.

George Joseph Stigler, späterer Nobel-Preisträger für Wirtschaftswissenschaften, hat in einem Aufsatz "The Cost of Subsistence" 1945 die Fragestellung aufgeworfen, was der Mindestpreis für eine Ernährung ist, die gerade alle erforderlichen Mengen von Energie (also Kalorien), Proteinen, Mineralstoffen und Vitaminen enthält.

Er hat auf Basis der Organisation "National Research Council" eine Aufstellung der empfohlenen Nährwerte für einen "moderat aktiven Mann" mit Gewicht 154 Pfund angefertigt. Diese geht von 3000 Kalorien aus, 70 gr. Protein, 12 Milligramm Eisen usw. aus.

Stiegler hat weiterhin akribisch eine Liste von 77 Lebensmitteln mit ihren Nährstoffgehalten und Preisen aufgestellt. Das erinnert natürlich an die Problemstellung des hier behandelten Beispiels. Nur leider gab es noch keinen Solver…

Stiegler Auflistung 77 Lebensmittel

(Quelle: George Joseph Stigler, "The Cost of Subsistence", 1945)

Die Lösung war ein Herantasten. Stiegler konnte die Liste von 77 Lebensmittel auf 15 eindampfen, in dem er Lebensmittel, die bzgl. aller Nährstoffe schlechter als andere abschneiden, herausgenommen hat. Trotzdem blieben noch enorm viele Kombinationen übrig, so dass die Anforderung entstand, eine allgemeine algorithmische Lösung zu entwickeln.

Diese kam dann von George B. Dantzig, der den Simplex Algorithmus entwickelte und in Grundzügen bereits 1947 vorstellte.

Werbung: Wer sich für eine Darstellung vom Erfinder selbst interessiert, kann bei Amazon mal durch die Bücher bzw. Leseproben schmökern:
Linear Programming and Extensions
Linear Programming 1: Introduction
Linear Programming 2: Theory and Extensions

Die Mathematik hat sich weiterentwickelt, Computer sowieso, aber natürlich hat sich auch die Sicht in der Ernährung weiterentwickelt. Z.B. wurde natürlich eingesehen, dass die schiere Optimierung von Lebensmitteln unter Kostengesichtspunkten bei Einhaltung von Nährstoffrestriktionen nicht unbedingt etwas Essbares zustande bringt.

Hier wurden ein paar Stufen gezündet, zunächst mal wurde anstelle der einzelnen Lebensmittel die "Speise" betrachtet, als ein verzehrfertiges Lebensmittel. Nächste Stufe ist das "Gericht", eine Kombination verschiedener Speisen. Dann gibt's noch die "Mahlzeit", schließlich den "Speiseplan".

Das leitet über zu der heutigen Anwendung von Optimierungsproblemen in der Ernährung, nämlich zu der Kostenreduktion bei der sogenannten Gemeinschaftsverpflegung, also z.B. bei Kantinen. Darüber hinaus kommen heute auch andere Optimierungsparameter ins Spiel, z.B. eine Optimierung hinsichtlich des ökologischen Fußabdrucks. Hierzu wird es zukünftig weitere Beiträge in diesem Blog geben.

Weil er bei der Länge dieses Artikels schnell mal übersehen worden sein kann, hier nochmals der Downloadlink für die besprochene Excel-Datei mit dem Solver Beispiel sowie dem SciPy/Linprog Python-Beispiel.