Scopul problemei dietetice este de a selecta alimentele care satisfac cerințele nutriționale zilnice la un cost minim. Această problemă poate fi formulată ca un program liniar, pentru care constrângerile limitează numărul de calorii și cantitatea de vitamine, minerale, grăsimi, sodiu și colesterol din dietă. Danzig (1990) remarcă faptul că problema dietei a fost motivată de dorința armatei SUA de a reduce la minimum costul hrănirii cu Gls în câmp, în timp ce oferă în continuare o dietă sănătoasă.

Declarație problemă

Problema dietei poate fi formulată matematic ca o problemă de programare liniară utilizând următorul model din Pyomo:

Seturi

Setați datele care sunt utilizate pentru a defini o instanță de model.

Parametri (Param)

Date despre parametri care sunt utilizate pentru a defini o instanță de model.

Variabile (Var)

Variabile de decizie într-un model.

Obiectiv

Expresii care sunt minimizate sau maximizate într-un model.

Constrângeri

Expresii de constrângere care impun restricții asupra valorilor variabile într-un model.

Notă: Toate pachetele sunt deja în Qusandbox, nu trebuie să instalați niciun pachet dacă rulați proiectul în Qusandbox. Dacă rulați proiectul în notebook-ul local Jupyter, asigurați-vă că ați instalat toate pachetele de mai sus.

În primul rând, trebuie să declarați un model abstract prin crearea unui obiect model. Model abstract clasa oferă un context pentru definirea și inițializarea modelelor de optimizare abstractă în Pyomo atunci când valorile datelor vor fi furnizate în momentul obținerii unei soluții.

Apoi, utilizați A stabilit componentă pentru a declara mulțimile F și N abstract. Când lucrați cu Pyomo, este convenabil să scrieți modele abstracte într-un mod oarecum mai abstract, utilizând seturi de indexuri care conțin șiruri, mai degrabă decât seturi de indexuri care sunt implicate de 1,. m sau însumarea de la 1 la n.

În mod similar, parametrii modelului sunt definiți abstract folosind Param componentă. în opțiunea este utilizată în aceste declarații de parametri pentru a defini proprietățile așteptate ale parametrilor. Aceste informații sunt utilizate pentru a efectua verificări de eroare la datele utilizate pentru inițializarea componentelor parametrilor.

De exemplu, declarați parametrul „costul fiecărui aliment”:

Folosește Var componentă pentru definirea variabilelor de decizie, care în acest caz este numărul de porții consumate din fiecare aliment. Opțiunea din interior este utilizată pentru a restricționa domeniul variabilelor de decizie la realele non-negative. Aceasta elimină necesitatea constrângerilor explicite legate de variabile.

Obiectiv componenta este utilizată pentru a defini obiectivul de cost. Această componentă utilizează un regulă funcția de a construi expresia obiectivă

În mod similar, funcțiile de regulă sunt utilizate pentru a defini expresiile de constrângere în Constrângere componentă.

În cele din urmă, puneți toate aceste declarații împreună și veți obține modelul Pyomo.

Deoarece acesta este un model abstract Pyomo, setul și valorile parametrilor trebuie furnizate pentru a inițializa modelul. Puteți arunca o privire asupra acestui set de date sintetice:

problema

Datele setate sunt definite cu a stabilit comanda, iar datele parametrilor sunt definite cu param comanda.

Acest set de date are în vedere problema proiectării unei diete zilnice numai cu alimente dintr-un lanț de fast-food.

Pyomo include o comandă pyomo care automatizează construcția și optimizarea modelelor. Solverul GLPK poate fi utilizat în acest exemplu simplu:

Aceasta produce următoarea ieșire pe ecran:

Numerele între paranteze pătrate indică cât timp a fost necesar pentru fiecare pas. Rezultatele sunt scrise în fișierul denumit results.yml, care, ca o structură specială, îl face util pentru post-procesare.

Această soluție arată că, pentru aproximativ 15 USD pe zi, o persoană poate trece cu 4 cheeseburgeri, 5 cartofi prăjiți, 1 sandviș de pește și 4 lapte.