VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE FAKULTA INFORMATIKY A STATISTIKY
BAKALÁŘSKÁ PRÁCE
2014
Filip Havel
VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE FAKULTA INFORMATIKY A STATISTIKY
Název bakalářské práce:
Sestavení jídelníčku jako úloha lineárního programování
Autor:
Filip Havel
Katedra:
Katedra ekonometrie
Obor:
Matematické metody v ekonomii
Vedoucí práce:
Ing. Adam Borovička
Prohlášení: Prohlašuji, že jsem bakalářskou práci na téma „Sestavení jídelníčku jako úloha lineárního programování“ zpracoval samostatně. Veškerou použitou literaturu a další podkladové materiály uvádím v seznamu použité literatury.
V Praze dne 2. června 2014
................................ Filip Havel
Poděkování: Rád bych na tomto místě poděkoval Ing. Adamu Borovičkovi za vedení mé bakalářské práce, především za trpělivost a benevolenci, kterou mi při jejím zdlouhavém vypracovávání věnoval. Jsem přesvědčen o tom, že jakýkoliv jiný vedoucí by na mě již dávno zanevřel a vedení práce mi odřekl, pokud by se mu dostávalo stejné odezvy.
Abstrakt Název práce: Autor: Katedra: Vedoucí práce:
Sestavení jídelníčku jako úloha lineárního programování Filip Havel Katedra ekonometrie Ing. Adam Borovička
Předmětem zájmu bakalářské práce je sestavit kompletní jídelníček pro lidského jedince různého pohlaví, věku, úrovně fyzické aktivity a hmotnosti na 1 až 7 dní se stálým rozložením jídel v jednotlivých dnech. Tento záměr je naformulován jako matematický model, coby základní stavební kámen pro každou úlohu lineárního programování. Jeho konstrukce zaručí, že člověk přijme v každém denním jídle optimální množství celkem 29 základních živin. Hlavním cílem bude plné uspokojení výživových požadavků lidského organismu minimálním počtem vhodně kombinovaných potravin. Vedlejším cílem se stane zjistit, kolik je nutné přijmout tekutin vedle vybraných potravin. Jejich naplnění technicky zajistí optimalizační software LINGO a aplikace s grafickým uživatelským rozhraním vystavěná v tabulkovém procesoru Microsoft Excel za pomoci programovacího jazyka Visual Basic for Applications. Klíčová slova: jídelníček, nutriční problém, doporučená denní dávka, potravina, živiny
Abstract Title: Author: Department: Supervisor:
The Creation of Menus as a Task of Linear Programming Filip Havel Department of Econometrics Ing. Adam Borovička
The focus of this bachelor thesis is to create a dietary regimen (menu) for people of different gender, age, level of physical activity and weight for 1-7 days with a steady distribution of meals in a day. This plan is formulated with a mathematical model as the basic building block for each task of linear programming. Its design guarantees that a person will receive the optimal amount of a total of 29 essential nutrients in each meal of the day. The primary objective will be to fully satisfy the nutritional requirements of the human organism with a minimal quantity of properly combined foods. The secondary objective is to determine the necessary fluid intake in connection with the selected foods. The technical realization of these objectives is guaranteed by the optimization software LINGO and applications with a graphical user interface built in Microsoft Excel spreadsheet by using the programming language Visual Basic for Applications. Keywords: menu, diet problem, reference daily intake, food, nutrients
Úvod Jak už samotný název napovídá, počáteční záměr této práce je více než zřejmý – sestavení jídelníčku. Ovšem i velmi prosté zadání úkolu se může stát opravdu komplikovanou otázkou, obzvlášť pokud v něm člověk spatří problém a přistoupí k němu „vědecky“. A právě pojem problém je zde nanejvýš vhodný. Pokud chápeme jídelníček jako vhodné uskupení potravin, vzniká tady právě problém, jak dané potraviny seskupit. To samozřejmě zvládne každý racionálně uvažující jedinec již třeba na základě svých chuťových preferencí. Pak by ale tato práce postrádala veškerý smysl a kvůli tomu rozhodně nevznikla. Co když se začneme opravdu zajímat o složení potravin, které populace naprosto běžně konzumuje? Že víme, co potraviny obsahují z informací na jejich obalech, je adekvátní argument, ale pro hlubší analýzu ne úplně postačující. S potravinou nepřijímáme pouze energii, sacharidy (více známé jako cukry), bílkoviny a tuky. Byť se na složení podílejí mnohdy daleko menší měrou, nedílnou součástí je také řada minerálních látek, vitaminů a jiných chemických látek, které lidské tělo potřebuje ke své správné funkci. I laika by v tu chvíli nejspíš napadlo, že to základní vyčte z informací na obalu, minerální látky zajístí pitím minerální vody a vitaminy přijme v ovoci a zelenině. Ano, v podstatě bude mít s takovou reakcí pravdu a rozhodně nelze tvrdit opak. Kde by ale byl onen avizovaný „vědecký“ přístup? Objevil se nám tu problém a požadavky v podobě živin, které lidský organismus potřebuje pro svou existenci. Tyto termíny rozhodně nejsou nahodilé. Jejich vhodné uspořádání směřuje k úloze, která se odborně označuje jako směšovací problém, ve své konkrétnější podobě pak jako nutriční problém. [3, str. 48] V čem tyto úlohy spočívají a jak se řeší, si ukážeme hned v první kapitole. V tuto chvíli je podstatné, že se stanou klíčovým prvkem k naplnění cíle této práce, tj. k sestavení jídelníčku. Nastínili jsme si, že problém vzniká ve výběru potravin. Vzniká proto, že výběr nemůže být nahodný, protože potraviny obsahují živiny, životně důležité látky pro lidský organismus. Vzhledem k opravdu velkému množství živin, které každá potraviny obsahuje, se ukáže, že s informacemi na obalech potravin by si tato práce opravdu nevystačila. Tím vyvstala další a tentokrát opravdu zásadní otázka, jak a kde takové údaje získat. Přijatelnou odpověď poskytlo Centrum pro databázi složení potravin1. Potraviny v jejich databázi jsou velmi příhodně rozděleny do skupin podle klasifikace mezinárodní sítě pro databáze složení potravin EuroFIR2. Ke každé potravině v těchto skupinách se uvádí záznam formou tabulky o množství příslušného nutrientu (pouze jiné označení pro živinu) v dané potravině. Jelikož se ale databáze stále vyvíjí, pouze v ojedinělých případech je tento záznam kompletní. Problému výběru a zpracování dat z této databáze je věnována samostatná kapitola. 1 2
©On-line databáze složení potravin ČR, verze 4.13. http://www.czfcdb.cz (cit. 29.5.2014) [7] http://www.eurofir.org/ (cit. 29.5.2014) [9]
6
Poslední neznámou už tvoří jen rovněž zmíněné požadavky. Již bylo zmíněno, že prostý přístup k sestavení jídelníčku na základě toho, čemu dává jedince podle chuti přednost, zde nenajde své uplatnění. Dalším vybízejícím hlediskem, zejména v dnešním světě, by mohla být cena. Ani s ní se však v této práci nepočítá. Jídelníček, sestavený v souladu s cílem této práce, by měl plně pokrýt výživové požadavky lidského organismu. Potom zde ale figuruje několik faktorů, které tyto požadavky činí rozdílnými pro každého z nás. Mladý sportovec zajisté musí denně přijmout jiné množství živin než malé dítě, starší člověk s omezeným pohybem nebo podsaditý člověk středního věku se sedavým zaměstnáním. Při tomto příhodném výběru referenčních osob by měly být ony sledované faktory jasnější. Jsou jimi věk, pohlaví, úroveň fyzické aktivity a hmotnost. A stejně jako tomu bylo u zjišťování živin v potravinách, i tady svou důležitou roli hraje zdroj informací. Až trochu překvapivě nám část těchto údajů poskytl prostřednictvím svých dílčích webových stránek McDonald’s3, společnost, která se zdravou výživou nemá zas až tolik společného. Více o dalších zdrojích dat a požadavcích rozdílných lidských organismů si povíme ve druhé kapitole. Nyní by mohlo být zřejmé, že v práci nepůjde o obsah restauračního jídelního lístku, ani o stanovení prodejních cen vybraných jídel. Skutečný cíl této bakalářské práce je sestavit jednoi vícedenní jídelníček (při pravidelném stravování třikrát nebo pětkrát denně) pro každého individuálního jedince tak, aby plně pokryl jeho výživové požadavky a jeho organismus se normálně vyvíjel, tzn., aby nezvyšoval svou hmotnost či neměl jiné problémy kvůli přemíře živin, ale aby ani na hmotnosti neztrácel a některé důležité látky mu nechyběly. Technickou oporou nám po pochopení již zmíněných úloh budou tabulkový kalkulátor Microsoft Office Excel 20134 (MS Excel) a optimalizační software LINGO verze 9.0, od společnosti LINDO SYSTEMS Inc5. Na závěr nutno podotknout, že cíl práce nespočívá v objevování něčeho zcela nového, pouze v aplikaci známých i uměle vytvořených postupů na reálná data, která nebývá zvykem tímto způsobem zpracovávat.
3
http://www.mcdonaldsmenu.info/nutrition/ (cit. 30.5.2014) [13] http://office.microsoft.com/cs-cz/excel/ (cit. 30.5.2014) [14] 5 http://www.lindo.com/ (cit. 30.5.2014) [11] 4
7
1 Nutriční problém a jeho formulace 1.1 Teoretické vymezení a obecná formulace6 Nutriční problém spadá svou podstatou a principem řešení mezi úlohy, které označujeme jako směšovací problémy. A ani ty nespadly s čistého nebe. Tím nejnadřazenějším oborem, který lze v souvislosti s těmito úlohami definovat, je matematické programování. Každá taková úloha má obecnou matematickou formulaci obsahující účelovou funkci a systém omezujících podmínek. Účelovou funkci si lze představit jako výslednou hodnotu celé úlohy, u níž usilujeme o to, aby nabyla co nejvyšší nebo nejnižší možné hodnoty. Možné proto, že zde figuruje právě systém omezení, který účelové funkci nedovolí, aby byla maximální (nekonečno) či minimální (rozumíme rovna nule). Celý tento aparát lze přitom modelovat pomocí rovnic a nerovnic, které zde zastupují jednotlivé funkce. Řešení tak není ničím jiným než řešením soustavy rovnic a nerovnic (označovaných jako matematický model). V závislosti na podobě jednotlivých funkcí, rozlišujeme úlohy lineárního programování (LP), celý systém formulován pomocí lineárních funkcí, a úlohy nelineárního programování, v systému se vyskytuje alespoň jedna nelineární funkce. Naše směšovací problémy se řadí k úlohám LP. Jejich cílem je navrhnout směs splňující určité požadavky a zároveň optimalizovat zvolené kritérium, které může mít v závislosti na konkrétní úloze různou povahu. V případě úlohy, kdy sestavujeme finanční směs (úloha optimalizace portfolia), je tímto kritériem očekávaný výnos a ten chceme vždy jedině maximalizovat. Bavíme-li se ovšem o typičtější směšovací úloze, jakou je beze sporu právě nutriční problém, v roli optimalizovaného kritéria zpravidla vystupuje cena. Jelikož v nutričním problému nejde o prodej potravin či výsledných směsí, ale o nákup a míchání surovin ve směsi, usilujeme o minimální cenu. Požadavky mohou být různého charakteru, zůstaneme-li už jen u nutričního problému, rozumíme jimi nějaké dílčí látky, zpravidla živiny. Zastoupení živin ve výsledné směsi může být žádoucí i nežádoucí, od čehož se odvíjí požadavek na jejich množství. Buď chceme, aby jich v cílené směsi bylo obsaženo aspoň určité množství, přesně stanovené množství (nemusí vést k řešitelnosti úlohy) nebo maximálně určité množství. Úloha dále požaduje nezáporné hodnoty pro množství složek ve směsi. To zaručí podmínky nezápornosti. Matematicky zapíšeme tyto skutečnosti pomocí rovnic a nerovnic. Nejjednodušší forma obecné matematické formulace nutričního problému tak vypadá třeba následovně: minimalizovat n
z c j x j , j 1
Většina této podkapitoly je převzata z učebního textu Programy pro matematické modelování [2, str. 7-9] a skript Lineární modely [3, str. 48-51], některá fakt pocházejí z Algoritmy.net – článek Směšovací problém [5]. 6
8
za podmínek n
a j 1
ij
x j bi ,
i 1, 2, ..., k ,
ij
x j bi ,
i k 1, k 2, ..., l ,
ij
x j bi ,
i l 1, l 2, ..., m ,
n
a j 1
n
a j 1
j 1, 2, ..., n ,
xj 0,
kde xj
je množství složky j ve výsledné směsi,
cj
je cena za 1 jednotku složky j,
aij
je obsah živiny i v 1 jednotce složky j,
bi
je požadavek na celkové množství živiny i ve výsledné směsi,
k
je počet živin požadovaných maximálně v množství bi,
l k je počet živin požadovaných v přesném množství bi, m l je počet živin požadovaných alespoň v množství bi, n
je celkový počet složek j ve výsledné směsi.
Podmínkou formulace modelu tímto způsobem je faktické roztřídění živin do skupin podle toho, jakou měrou musejí být ve výsledné směsi zastoupeny. V opačném případě by u každé podmínky sčítané přes počet živin musely být vyjmenovány konkrétní živiny nebo být uvedeny jejich číselné indexy určující pořadí, v jakém se ve vstupním souboru dat nacházejí.
1.2 Ekonomická formulace problému a způsob řešení V úlohách LP bývá zvykem, že obecné formulace matematických modelů jsou pro reálné příklady naprosto nepostačující. Ani zde si s obecnou formulací nutričního problému v předchozí kapitole nevystačíme. Jádro zůstane stejné, avšak v závislosti na ekonomickém modelu, jak se v matematickém programování označuje vysvětlení řešeného problému běžnou řečí, musíme upravit znění podmínek a pár jich přidat. Pomyslnou výslednou směsí, kterou chceme vytvořit, není nic jiného než sestavený jídelníček, a to až na jeden týden. Složky směsi představují jednotlivé potraviny, ze kterých má být jídelníček poskládán. Živin máme vzhledem ke zdroji dat opravdu velké množství, a sice od základních nutrientů jako energie, sacharidy, tuky a bílkoviny, přes téměř všechny známé vitaminy důležité pro lidskou výživu po širokou škálu minerálních látek. Celkem se v modelu sleduje 29 různých živin. Požadavky na jejich množství stanovuje doporučená denní dávka (DDD)7, se kterou budeme v modelu nakládat jako s minimálním množstvím, které musí být Dnes globálně označována jako GDA (Guideline Daily Amounts) nebo RDI (Reference Daily Intake), dříve také jako RDA (Recommended Dietary Allowance). [16] 7
9
ve vybraných potravinách obsaženo (1.2). I když žádná ze sledovaných živin není pro zdraví člověka škodlivá, pro některé vitaminy a minerální látky existují maximální denní dávky (anglicky Upper Level of Intake, zkratka UL), jejichž pravidelné překročování by mohlo lidskému organismu přivodit zdravotní komplikace. Z toho důvodu přidáme omezující podmínku i pro tyto případy (1.3). Vzhledem k tomu, že některé potraviny jsou na v nich zastoupené živiny bohatší, stanovíme pro každou potravinu její maximální porci (1.5). Kdybychom tak neučinili, později by se to ukázalo vysloveně jako nutnost, zejména kvůli účelové funkci, ke které se dostaneme za chvíli. Má to však i své logické opodstatnění, asi nikdo by nechtěl pozřít nadměrné množství potraviny běžně konzumované v řádu desítek gramů, např. hořčice či másla. Stejně tak důležité je vymezit si podmínku pro to, aby se nám potraviny v jednotlivých dnech neopakovaly (1.6). Přeci jenom pracujeme s reálnými údaji, což by u potravin s „lepšími“ výživovými hodnotami mohlo snadno vést k jejich opakování v jednotlivých dnech. Dále musíme zohlednit fakt, že ačkoliv sestavený jídelníček může být svým obsahem živin naprosto dokonalý, jeho poživatelnost s ohledem na vybrané potraviny bude nemožná. Této skutečnosti se nelze vyhnout jedinou souhrnně aplikovatelnou podmínkou, jako jsme tomu učinili v případě maximální porce. Navíc nesmíme opomíjet to, že v rámci sestaveného jídelníčku budou figurovat buď 3 (snídaně, oběd, večeře) nebo 5 (snídaně, svačina, oběd, svačina, večeře) jídel denně a rozhodně nepůjde pracovat se stejným souborem potravin při sestavení snídaně jako při sestavení oběda či večeře. Předejít této nevhodné kombinaci potravin pouze úpravou formulace matematického modelu by bylo zbytečně pracné a vzniknul by tak stejně jen nepřehledný model. Upravíme si proto již samotná data. Z potravin v databázi vytvoříme 3 samostatné soubory, potraviny v prvním z nich budou sloužit výhradně k sestavení snídaně, z druhého souboru se bude čerpat na uspořádání potravin pro svačinu a poslední poslouží jako zdroj pro vytvoření oběda a večeře. Potraviny v jednotlivých souborech navíc pro snazší orientaci opatříme indexy. To povede mj. i k tomu, že formulace matematického modelu nebude tak jednoznačná jako v případě toho obecného pro nutriční problém, avšak pořád bude takový model vykazovat vyšší přehlednost, než kdyby k utřídění potravin vůbec nedošlo. K individuálním podmínkám, které postihují kombinování potravin, se dostaneme až u vlastního modelu. Podstatné je také zmínit to, že budeme formulovat celkem 3 matematické modely, které se od sebe budou vzájemně odlišovat právě pouze těmito speciálními „kombinačními“ podmínkami. Dostaneme jeden model pro snídani, jeden pro svačinu a jeden společný pro oběd a večeři. Jádro všech modelů zůstane neměnné. Objasníme-li si konkrétní podmínky pro kombinaci potravin až při vlastní formulace modelu, zbývá nám už jen zásadní položka každé úlohy LP, účelová funkce. Ta se dočká oproti obecnému nutričnímu problému největší změny, na první pohled určitě nelogické. Zatímco obecný nutriční problém stojí na minimalizaci ceny vynaložené na nákup jednotlivých složek směsi, při sestavení jídelníčku v této práci hraje cena pouze zcela vedlejší roli. Nepočítá se s neomezenými finančními prostředky, ale skutečně hlavním cílem je zvolit takové potraviny, které z hlediska DDD živin pokryjí požadavky lidského oraganismu. Předmětem minimalizace 10
zde je počet vybraných potravin (1.1). Představíme-li si tu situaci, právě v tuto chvíli se ukáží být údernými podmínky na maximální porci, které například nedovolí vybírat pravidelně pouze jednu potravinu a ještě v nepřirozeném množství. Především však tato minimalizace způsobí to, že se vždy vybere co nejméně potravin (nevybrání žádné potraviny není vzhledem k přísným podmínkám na množství živin možné) a výsledný jídelníček se tak automaticky stane schůdný cenově i časově, bavíme-li se o době strávené jeho přípravou. Skutečnost, že sledujeme i to, zda se daná potravina do jídelníčku vybere či nikoliv, pro model představuje zavedení tzv. binárních proměnných (1.7), které se v obecném nutričním problému nevyskytují. Tyto proměnné nám navíc značně ulehčí práci při vytváření „kombinačních“ podmínek. Vedle nich ovšem potřebujeme znát i množství, v jakém bude potravina v jídelníčku zastoupena, tudíž i to se stane důležitou proměnnou modelu. Jejich vzájemnou provázanost pak zajistíme pomocí speciální podmínky (1.4). Množství vybraných potravin sledujeme v celých gramech, a tak pro tuto proměnnou stanovíme tzv. podmínky celočíselnosti (1.8), čímž se z našeho nutričního problému stane úloha celočíselného (lineárního) programování. Obecně platí, že jsou tyto úlohy výpočetně velmi náročné, neboť není možné uplatnit tzv. simplexovou metodu, efektivní algoritmus pro řešení neceločíselných úloh LP. Pro tento typ úloh byly vyvinuty speciální metody se specifickým postupem, na základě kterého se řadí do několika skupin. Jednou z nich jsou např. metody sečných nadrovin (anglicky cutting planes), kdy zanedbáme podmínky celočíselnosti a řešíme úlohu simplexovou metodou. Nesplňuje-li získané optimální řešení8 podmínky celočíselnosti, přidáváme do úlohy postupně lineární omezení, což zužuje množinu přípustných řešení9 úlohy. To provádíme tak dlouho, dokud nedospějeme k optimálnímu celočíselnému řešení. Nejznámějším zástupcem těchto metod je Gomoryho metoda. Další skupinou metod jsou kombinatorické metody, vyznačující se svou efektivitou, avšak sloužící pouze k řešení konkrétních typů úloh. Typickým příkladem z této skupiny je metoda větvění a mezí (anglicky branch and bound). Dále existuje řada speciálních a heuristických metod. Podrobnějším líčením těchto, ani předešlých metod se v této práci nebudeme zabývat.10 V tuto chvíli zbývá zmínit již jen to, že veškerou dynamičnost, která se v nastíněném ekonomickém modelu nachází, vyřešíme s přispěním tabulkového procesoru MS Excel a v něm implementovaném programovacím jazyku VBA (Visual Basic for Applications). O vytvoření celé aplikace s jednoduchým uživatelským rozhraním si povíme více ve třetí kapitole.
1.3 Aplikovaný matematický model Nyní přejdeme již k vytvoření matematického modelu. Nejprve zformulujeme obecné jádro všech 3 modelů, poté se budeme věnovat jedinečným podmínkám každého z nich a přesně Takové přípustné řešení, jehož účelová funkce nabývá nejlepší hodnoty, tj. nejvyšší v případě její maximalizace či nejnižší v případě její minimalizace. [3, str. 20] 9 Takové řešení, kdy jsou hodnoty všech proměnných v matematickém modelu v souladu s celým sestémem omezujících podmínek. [3, str. 20] 10 Celý odstavec o celočíselném programování vychází ze skript Lineární modely ze 7. kapitoly. [3] 8
11
stanovíme rozsahy indexů. Mějme na paměti, že některé podmínky jsou pro každý model stejné, avšak v závislosti na jídle dne, kterému přísluší, čerpají z odlišného datového souboru. Minimalizovat n
z xj ,
(1.1)
j 1
za podmínek n
a
ij
mij ri ,
i 1, 2, ..., m ,
(1.2)
ij
mij u i ,
i 1, 2, ..., m ,
(1.3)
m j Kx j ,
j 1, 2, ..., n ,
(1.4)
mj M j ,
j 1, 2, ..., n ,
(1.5)
xj pj ,
j 1, 2, ..., n ,
(1.6)
x j 0 (1) ,
j 1, 2, ..., n ,
(1.7)
m j 0 , celé,
j 1, 2, ..., n ,
(1.8)
j 1
n
a j 1
kde xj
udává, zda potravina j byla do jídělníčku vybrána (1) nebo nikoliv (0),
mj je množství vybrané potraviny j, aij je obsah nutrientu i v 1 gramu potraviny j, ri
je požadavek na minimální denní dávku (RDI) živiny i,
ui
je požadavek na maximální denní dávku (UL) živiny i,
Mj je maximální porce potraviny j, pj
určuje, zda potravina j může být do jídelníčku vybrána (1) či nikoliv (0)11,
m
je celkový počet živin,
n
je celkový počet potravin,
K
je dostatečně velká konstanta (zpravidla 108).
Nutno také poznamenat, že jedinými proměnnými v modelu jsou xj a mj, vše ostatní považujme za konstanty, jejichž hodnoty čerpáme ze zdrojových dat (aij, ri a ui), byly uměle vytvořeny (Mj a pj) nebo slouží jako pomocné pro potřeby modelu (K). Nyní přejdeme již k podmínkám pro vhodné seskupení potravin, které jsou pro každé jídlo dne specifické. Abychom je však mohli zformulovat v konkrétní podobě, bude nutné si představit skupiny potravin, z nichž se vybírají dílčí potraviny do jednotlivých denních jídel. V podstatě půjde o různé použití celkem 3 omezení, která se budou lišit pouze potravinami,
11
Více o této specifické „proměnné“ si povíme v podkapitole 3.2.
12
s nimiž pracují. Nejprve si tyto podmínky vyjádříme v jejich obecné podobě a v následujících oddílech této podkapitoly si ukážeme jejich konkrétní znění pro jednotlivá denní jídla. Obecná formulace 3 podmínek sdružující potraviny vypadá následovně: 1. Z daných skupin a určitých potravin bude vždy vybrána nejvýše 1 potravina (P1):
x jJ a
j
J 1, 2, ..., n, J a J .
1,
Množina indexů (dále jen množina) J obsahuje všechny potraviny určené k sestavení konkrétního denního jídla. Podmnožina indexů (dále jen podmnožina) Ja zahrnuje skupinu či výběr potravin, ze kterých může být v rámci daného jídla dne zvolena nejvýše 1 potravina. Teoreticky by mohlo být až 2n takových výběrů12, v práci však vzhledem k rozsahu dat budeme pro každé denní jídlo uvažovat nejvýše 1 takový výběr, i proto rozsah indexu a neuvádíme. 2. K potravinám z daných skupin mohou být vybrány pouze určité potraviny (P2):
x x jJ b
j
jJ c
j
J 1, 2, ..., n, J b , J c J J b J c ,
,
b c.
Množina J opět zahrnuje všechny potraviny určené k sestavení příslušného jídla dne. Podmnožiny Jb a Jc obsahují vzájemně rozdílné potraviny a platí, že z obou podmnožin musí být vybrán stejný počet potravin. (Minimalizační účelová funkce zajistí, že bude zpravidla vybrána z každé podmnožiny 1 potravina.) Teoretické vymezení maximálního počtu podmnožin zde nemá své opodstatnění, v každém modelu si vystačíme nejvýše se 4 takovými dvojicemi podmnožin. Rozsah indexů b a c obecně nelze jednoznačně určit. 3. Pokud bude vybrán určitý druh potravin, bude muset být zvolena i alespoň 1 potravina z jiné konkrétní skupiny, tzv. podmínka typu IF – THEN13 (P3):
x jJ d
x jJ e
j
j
J 1, 2, ..., n, J d , J e J J d J e ,
1 Kyd ,
d e,
J 1, 2, ..., n, J d , J e J J d J e ,
1 K 1 yd ,
d e,
kde
je dostatečně malá konstanta (zde postačuje 10-3),
K
je dostatečně velká konstanta (zpravidla 108),
yd
je pomocná binární proměnná, která ovlivňuje výsledek druhé nerovnice.
Pro množinu J a podmnožiny Jd a Je platí obdobná pravidla jako v předchozí podmínce a jejich počet se shoduje s počtem výskytů binární proměnné yd. Teoretické maximální množství Vyplívá to z teorie množin a binomické věty. Vynecháme-li případy žádné a všech potravin, maximální počet podmnožin by byl 2n 2, avšak i to je v tomto případě zcela vyloučené. [4, str. 51] 13 Její formulace a úprava vysvětlena v učebnici Programy pro matematické modelování. [2, str. 100-103] 12
13
těchto sdružených podmínek opět nemá smysl uvažovat. V praxi by to muselo představovat velké množství potravin, aby matematický model mohl správně fungovat. V našem případě budou v každém modelu obsaženy právě 2 takové podmínky. Rozsah indexů d a e obecně opět nelze jednoznačně vymezit. Nutno upozornit na vzájemné vztahy všech definovaných podmnožin. Jednoznačně lze totiž vymezit jen vztah podmnožin v dílčích podmínkách, není možné ale stanovit vzájemné postavení podmnožin napříč jednotlivými podmínkami. Jistý je pouze tento vztah:
J a , J b , J c , J d , J e J . [12] Není ani vhodné přesněji vymezovat indexy rozsahů. Jednotlivé podmnožiny se totiž můžou ve speciálních podmínkách modelu opakovat. Kompletní obecný matematický model pro problém sestavení jídelníčku vypadá takto: minimalizovat n
z xj , j 1
za podmínek n
a
ij
mij ri ,
i 1, 2, ..., m ,
ij
mij u i ,
i 1, 2, ..., m ,
m j Kx j ,
j 1, 2, ..., n ,
mj M j ,
j 1, 2, ..., n ,
j 1 n
a j 1
x jJ a
j
,
J 1, 2, ..., n, J b , J c J J b J c ,
1 Kyd ,
b c, J 1, 2, ..., n, J d , J e J J d J e ,
1 K 1 yd ,
d e, J 1, 2, ..., n, J d , J e J J d J e ,
x x jJ b
x jJ d
x jJ e
j
J 1, 2, ..., n, J a J ,
1,
j
j
jJ c
j
d e,
xj pj ,
j 1, 2, ..., n ,
x j 0 (1) ,
j 1, 2, ..., n ,
yd 0 (1) , m j 0 , celé,
j 1, 2, ..., n .
14
A teď se konečně dostaneme ke konkrétní podobě modelu pro každé denní jídlo, ten bude značně přehlednějším. Zprvu bude potřeba si ukázat rozdělení potravin do skupin, poté přistoupíme ke konkretizaci 3 speciálních podmínek každého modelu.
1.3.1 Snídaně Do nabídky pro snídani vstupuje dohromady 51 různých potravin (n = 51). Jejich přehled znázorňuje Tab. 1.1. Index 1-8 9-28 29-36 37 38-44 45 46 47 48-51
Skupina nebo jednotlivé potraviny Pečivo Tuky, sýry a saláty Maso nebo masné výrobky Piškoty Ovoce a zelenina Vejce Palačinka Ovesné vločky Jogurty a mléko
Tab. 1.1: Rozdělení potravin pro snídani
Jádrem modelu se nemusíme zabývat, protože tam se jedná pouze o dosazení dat potravin a požadavků. Nadefinujeme si tedy rovnou podmnožiny, se kterými budeme pracovat v rámci speciálních podmínek
J1 1, 2, ..., 8, J 2 9, 10, ..., 36, J3 47, J 4 48, 49, 50, 51 a rovnou tyto podmínky sestavíme:
x x
j J 2
x j J 1
j
x
j J 4
j
j
j
1,
1 Ky2 ,
j
J1 1, 2, ..., 8,
(P1)
J 2 9, 10, ..., 36 ,
(P3)
J1 1, 2, ..., 8,
1 K 1 y2 ,
x
j J 3
jJ1
J 3 47 ,
1 Ky3 ,
1 K 1 y3 ,
(P3)
J 4 48, 49, 50, 51.
Pro matemematický model snídaně tak získáváme 1 speciální podmínku typu P1 a 2 dvojice omezení typu P3. Uvádět zbylá omezení v konkrétní podobě je zbytečné, když víme, že m = 29 a n = 51. Více o samotných vstupních datech a způsobech jejich zpracování a vyhodnocení k nalezení v následujících kapitolách. Celý matematický model zformulovaný pro LINGO je obsažen v přílohách a opatřen komentáři.
15
1.3.2 Svačina Pro svačinu máme k dispozici celkem 104 potravin. Jejich výčet zachycuje Tab. 1.2. Index Skupina nebo jednotlivé potraviny 1-8 Pečivo 9-30 Tuky, sýry a saláty 31-41 Maso nebo masné výrobky 42-71 Ovoce a zelenina 72-80 Ořechy a semena 81-85 Čokoláda 86 Piškoty 87 Vejce 88-99 Hotová jídla 100 Ovesné vločky 101-104 Jogurty a mléko Tab 1.2: Rozdělení potravin pro svačinu
Stejně jako u snídaně, i zde stanovíme podmnožiny pro „kombinační“ podmínky J1 1, 2, ..., 8, 88, 89, ..., 99, J 2 9, 10, ..., 41, J 3 1, 2, ..., 8, J 4 100,
J 5 101, 102, 103, 104
a naformulujeme systém speciálních podmínek:
x
x
j J 2
x jJ 3
j
x jJ 5
j
j
j
1,
1 Ky2 ,
j
J1 1, 2, ..., 8, 88, 89, ..., 99,
(P1)
J 2 9, 10, ..., 41,
(P3)
J 3 1, 2, ..., 8,
1 K 1 y2 ,
x jJ 4
jJ1
J 4 100 ,
1 Ky4 ,
(P3)
J 5 101, 102, 103, 104.
1 K 1 y3 ,
Typově ani počtem se tyto podmínky nijak neliší od těch sestavených pro snídani. Rozsahy indexů m a n jsou opět známy, a tak zbylá omezení svačinového modelu netřeba uvádět. Kompletní matematický model ve formulaci pro LINGO (včetně komentářů) je vložen jako příloha.
1.3.3 Oběd a večeře Pro oběd a večeři použijeme stejný model, tudíž i počet potravin a jejich rozdělení bude shodné. Tato jídla dne budou utvářena ze 116 potravin, jejichž roztřídění zobrazuje Tab. 1.3.
16
Index Skupina nebo jednotlivé potraviny 1-4 Pečivo 5-16 Přílohy 5-6 Rýže 7-9 Těstoviny 10-11 Brambory 12-15 Knedlíky 16 Bramborový salát 17-38 Zelenina a zeleninové saláty 18-19 Fazole 20 Hrách 21, 35 Houby 39-41 Hořčice a kečup 42 Hranolky 43-68 Maso 69-74 Masné výrobky 75-87 Ryby 88-92 Omáčky 93-95 Sója a tofu 96 Čočka 97-108 Hotová jídla 109-116 Alkoholické nápoje Tab 1.3: Rozdělení potravin pro oběd a večeři
Vymezení podmnožin pro 3 speciální podmínky zde vypadá následovně:
J1 43, 44, ..., 95, 97, 98, ..., 108, J 2 43, 44, ..., 68, J 3 12, 13, 15, 18, 19,
J 4 69, 70, ..., 74, J 5 1, 2, 3, 4, 20, 96, J 6 75, 76, ..., 87, J 7 10, 11, 16, J8 88, 89, ..., 92, J 9 5, 6, ..., 9, 14, J10 39, 40, 41, J11 21, 35, J12 43, 44, ..., 68, 97, 98, 99. Nyní můžeme dát podmínkám pro kombinaci potravin konkrétní podobu:
x jJ1
j
,
J 2 43, 44, ..., 68, J 3 12, 13, 15, 18, 19,
x
j
x
j
,
J 4 69, 70, ..., 74, J 5 1, 2, 3, 4, 20, 96,
x
j
x
j
,
J 6 75, 76, ..., 87, J 7 10, 11, 16,
x
j
x
j
,
J 8 88, 89, ..., 92, J 9 5, 6, ..., 9, 14 ,
j J 4
j J 6
x
j J 8 j
J1 43, 44, ..., 95, 97, 98, ..., 108,
1,
x x
j J 2
jJ 10
j
j
j J 3
j J 5
j J 7
j J 9
J10 39, 40, 41,
1 Ky10 ,
17
x
j J 4
j
1 K 1 y10 ,
x
jJ 11
x
jJ 12
j
j
J 4 69, 70, ..., 74, J11 21, 35,
1 Ky11 ,
1 K 1 y11 ,
J12 43, 44, ..., 68, 97, 98, 99 .
U oběda i večeře se těchto podmínek využije nejvíce. Snadno by se rozšířily o podmínky kalkulující jen přes počet potravin a počet živin. Formulace celého modelu pro LINGO i s komentáři je součástí příloh.
18
2 Zpracování dat Nemůže být pochyb o tom, že většina výpovědní schopnosti výsledku práce stojí právě na vstupních datech. Ostatně už důležitost jen jejich vhodného uspořádání byla předvedena v závěru předchozí kapitoly. V této kapitole si představíme všechny údaje vstupující do každého matematického modelu, včetně jejich zdrojů, zpracování a problémů s ním spjatých.
2.1 Databáze potravin Množství, rozdílnost a bohaté informace, to byly nároky na zdroj potravin. Jejich splnění se nejvíce přiblížilo Centrum pro databázi složení potravin (CZFCDB). Jejich databáze ve verzi 4.13 nabízí úhrnem 512 potravin roztříděných do 13 skupin (Tab. 2.1), které jsou klasifikovány v souladu s mezinárodní sítí EuroFIR (European Food Information Resource). Ke každé potravině v takové skupině je uveden záznam o obsahu řádově desítek nutrientů rozdělených do 6 tříd – nutrienty základní; vitaminy; minerální látky; cukry, škrob, polyoly, organické kyseliny; mastné kyseliny a cholesterol; aminokyseliny. Jak samotné CZFCDB uvádí, sběr dat provádějí postupně s využitím existujících tabulek složení potravin dostupných v České republice a v zahraničí, výsledků vlastní analytické činnosti a dat vypočtených podle interních algoritmů databáze. Databáze je navíc aktualizována v několikách etapách s úmyslem rozšířit počet sledovaných potravin a nutrientů. [7] Č. skupiny Skupina potravin (klasifikace podle EuroFIR) 1 Mléko, mléčný výrobek nebo analog mléka 2 Maso nebo masný výrobek 3 Mořské nebo podobné potraviny 4 Vejce nebo vaječný výrobek 5 Tuky nebo oleje 6 Zrniny nebo výrobek ze zrnin 7 Ovoce nebo ovocný výrobek 8 Zelenina nebo zeleninový výrobek 9 Ořechy, semena nebo jádra 10 Cukr nebo výrobek z cukru 11 Ostatní potravinářské výrobky včetně pokrmů, dezertů 12 Nápoje nemléčné 13 Výrobek pro zvláštní výživové účely nebo doplněk stravy Tab. 2.1: Skupiny potravin na Centru pro databázi složení potravin
Hned se zmíněnou aktualizací se objevil první problém, který spočíval v nekompletnosti údajů u jednotlivých potravin. Úmysl vyhodnocovat všech 6 tříd nutrientů u každé potraviny musel tak být omezen na pouhou polovinu, první 3 jmenované. To způsobilo absenci velmi zajímavých a pro lidské tělo nepostradatelných, ale i nevhodných látek jako např. cholesterol, mastné kyseliny a aminokyseliny. Ani po této redukci však nemohla být řeč o ideálu, neboť se 19
objevily zcela běžně konzumované potraviny, které měly kompletně vyplněné údaje pouze v třídě základních nutrientů. Takové potraviny rovněž nebylo možné do vyhodnocovaných dat zařadit. Ve skutečnosti neexistovala jediná potravina, která by byla napříč 3 zvolenými třídami informačně ucelená. Jako nejméně škodlivé řešení tohoto nedostatku se ukázalo nahrazení chybějících hodnot nulou, což ve skutečnosti rozhodně neznamenalo pravdu. Z celkem dostupného počtu 512 potravin tak byla do zpracovávaného souboru vybrána ani ne polovina, přesně pouze 239 potravin. Další úskalí přišlo na řadu při samotném přesunu informací o daných potravinách do MS Excel. Formátování externí databáze totiž jako oddělovač desetinných míst volilo desetinnou tečku, což při převodu do tabulkového procesoru s nastaveným oddělovačem desetinnou čárkou způsobovalo transformaci některých hodnot do nevyhodnotitelného formátu datum. Jako nejrychlejší metoda převodu se ukázala změna oddělovače desetinných míst v MS Excel, bohužel až po té, co byly dotčené hodnoty přepsány ručně. Následovala překážka v podobě vymezení potravin pro dílčí soubory, určené pro snídani, svačinu, oběd a večeři. Při této akci se již předem ukázalo, že některé poraviny by sestavení matematického modelu značně ztěžovaly, obvykle šlo o původní suroviny (např. mouka, droždí) či o potraviny běžně individuálně nekonzumované (např. smetana, olej, kopr). Vyplynulo i jedno příhodné zjednodušení spočívající v totožném souboru potravin pro oběd i večeři. Po této úpravě tedy úhrnný soubor čítal už jen 201 potravin a bylo jich z něj vytyčeno 56 pro snídani, 104 pro svačinu a 116 společně pro oběd s večeří. Jednou z posledních obtíží se stala skutečnost, že některé potraviny z databáze byly ve své syrové podobě, jiné vařené, pečené či smažené. Jakákoliv tepelná úprava však výrazně ovlivňuje obsah nutrientů (zpravidla snižuje14) sledovaný pro stejnou hmotnost dané potraviny jako před úpravou. Ačkoliv je evidentní, že se tím určité potraviny stanou znevýhodněny, toto model zanedbává. Na závěr bylo zapotřebí se vypořádat s řazením potravin, které výrazně zpřehlednilo formulaci matematického modelu, a také převést obsah všech nutrientů, který je od CZFCDB určen na 100 g jedlého podílu potraviny, na 1 g jedlého podílu v jednotlivých potravinách.
2.2 Požadavky lidského organismu Zjistit výživové požadavky individuálního lidského organismu se projevilo jako klíčová záležitost. Jak je již uvedeno v úvodu práce, vyjadřují je tzv. hodnoty GDA. Ty ovšem bývá ve zvyku průměrovat a uvádět jednotné pro každé dítě či dospělého bez rozdílu věku, úrovně fyzické aktivity, váhy a často i pohlaví15. Tuto rozdílnost však zohledňuje kalkulátor hodnot GDA společnosti McDonald’s. [13] Při jeho použití se volí pohlaví a 1 ze 4 úrovní fyzické Tento jev byl vypozorován porovnáváním potravin, které jsou v databázi zastoupeny jak v syrové, tak v tepelně upravené formě. 15 Více informací o průměrných hodnotách GDA a reprezentativních osobách, k nimž se vztahují, dostupných z: http://www.mcdonaldsmenu.info/nutrition/needtoknow.jsp?page=2 (cit. 1.6.2006) [13] 14
20
aktivity (velmi nízká, nízká, střední a vysoká), vybírá se věkové rozmezí a udává přesná hmotnost. Na výstupu čekají konkrétní hodnoty GDA pro takto specifikovanou osobu. Tento výstup bylo nějak nutné převzít a jeho proměnlivost zakomponovat do MS Excel. Procesem stanovení hodnot GDA tak bylo nutné projít pro obě pohlaví z každého věkového rozmezí každé úrovně fyzické aktivity. Proměnlivost v podobě udané hmotnosti byla podchycena stavem hodnot GDA při váze 0 kg a 1000 kg a následným výpočtem „koeficientu změny“16 v tabulkovém procesoru. Tento zdlouhavý postup ovšem vedl pouze k získání hodnot GDA pro příjem 5 nutrientů (energie, bílkovin, tuků, sacharidů a soli). Valná většina nutrientních požadavků (vitaminy a minerální látky) pochází ze stanov australského a novozélandského ministerstva zdravotnictví. [16] Jejich systém krom hodnot RDI17 (ekvivalent ke GDA) vymezuje v mnoha případech i hodnoty UL (maximální denní dávky), ovšem rozlišuje jen pohlaví a věk jedinců, tudíž pro přiblížení se reálné situaci bylo potřeba odhadnout koeficienty, které by požadavky upravovaly dále v závislosti na úrovni fyzické aktivity (Tab. 2.2) a hmotnosti jedince (Tab. 2.3). Úprava úrovně fyzické aktivity se navíc odvíjí od věku jedince. Korekce podle hmotnosti je dále podmíněna referenční váhou podle věku18. [6] [15] Úroveň fyzické aktivity Velmi nízká Nízká Střední Vysoká
Koeficienty podle věku < 18 18+ 0,875 0,75 0,925 0,9 1 1 1,075 1,1
Tab. 2.2: Koeficienty úrovně fyzické aktivity podle věku
Koeficient relativního ↑ či ↓ s kadým 1 kg 0,01 < 100 0,0075 101-150 0,005 > 150
Hmotnost
Tab. 2.3: Koeficienty relativního snížení či zvýšení s každým 1 kg podle hmotnosti
Jediným nutrientem, který nepodchycují přechozí zdroje, zůstal ethanol. I když se o jeho pozitivních účincích spekuluje, nakonec jeho RDI byla pro každou osobu stanovena nulová. I názor na jeho maximální dávku je napříč zeměmi světa různý, pro dospělé muže byla vybrána prostřední hodnota z intervalu doporučeného příjmu, pro dospělou ženu ta nejnižší. [18]
Vzaly se hodnoty GDA při nereálných hmotnostech 0 kg a 1000 kg, vydělením jejich rozdílu 1000 se pak dospělo ke zmíněnému „koeficientu změny“. 17 Tyto hodnoty sice znamenají doporučenou denní dávku, avšak model s nimi pracuje jako s minimální. 18 Rozdíl udané a referenční hmotnosti je přenásoben koeficient relativního snížení či zvýšení na 1 kg. Výsledek se pak přičítá k 1, čímž vzniká koeficient, který se násobí s příslušným nutrientním požadavkem. 16
21
Problematickou živinou se ukázala být sůl. Naše populace je zatížena nadměrným příjmem soli (až více než trojnásobným), což jednak souvisí s častým přisolováním pokrmů, ale jednak taky s už tak vysokým obsahem soli v jednotlivých potravinách. [19] Dospělý člověk by přitom za den neměl přijmout více než 5 g soli. [8] Dodržet tuto zásadu se však s ohledem na rozmezí příjmů ostatních nutrientů projevilo jako nemožné, zejména u dětí. RDI soli tedy byla stanovena tak, aby alespoň někteří jedinci s velmi nízkou pohybovou aktivitou během dne tuto dávku příliš nepřekračovali, UL byla pro funkčnost modelu zvolena jako 2 a půl násobek RDI. Vedle dávek soli bylo nevyhnutelné změnit i RDI a UL sodíku, kterého je v každém gramu soli zastoupeno 390 mg19. V obou případech je tak jeho poživatelné rozmezí odvislé od obsahu v soli, čímž požadavky na tyto dva nutrienty splývají v jeden, pokud sodík nebude sám přijímán v jiné formě. Posledním nutrientem, kterému se muselo dostat změny, byla voda. Krom mléčných a alkoholických nápojů nefigurují v souboru potravin žádné nápoje a voda obsažená v potravinách nemůže jejich absenci vynahradit. Z toho důvodu byla RDI vynulována a UL dostatečně zvětšena, aby nehrozilo její překročení. To je ostatně postup, který bylo nutné uplatnit u všech nutrientů bez určené UL. Avšak vzhledem k zvláštní důležitosti dostatečného příjmu tekutin pro člověka, byla taková dostatečná míra zjištěna a ve třetí kapitole si předvedeme, jak se s ní nakládá.
2.3 Nedostatky a jejich řešení Problém chybějících údajů u jednotlivých potravin i řešení tohoto nedostatku bylo probráno v podkapitole 2.1, avšak objevil se i důsledek této nedokonalosti. Bylo-li v souboru příliš mnoho potravin s chybějícím (nulovým) záznamem u příslušného nutrientu, vedlo to k neřešitelnosti matematického modelu, protože dané minimální dávky nutrientu se nikdy nepodařilo dosáhnout. Z toho důvodu bylo v MS Excel nutné zavést opatření, které v případě, že u daného nutrientu chyběla více než polovina záznamů (polovina všech potravin v souboru), zrušilo požadavek na jeho RDI (požadavek na UL beze změny). Bohužel takto došlo k vynulování minimální dávky 8 nutrientů v případě snídaně a dokonce 10 nutrientů v případě svačiny, oběda a večeře. Tato operace sice dosti narušila hlavní cíl této práce, avšak ponechala matematický model plně řešitelným. Některé další nutné úpravy ještě probereme na závěr třetí kapitoly v podkapitole speciálně věnované práci s aplikací.
19
http://www.nrv.gov.au/nutrients/sodium (cit. 1.6.2006) [16]
22
3 Funkčnost aplikace Nyní konečně přistoupíme k vlastní aplikaci, která po všech stránkách zajišťuje sestavení jídelníčku.
3.1 Technické informace Celá aplikace je zasazena do prostředí MS Excel, odkud se také výhradně ovládá. Vhodně volené ovládací prvky ActiveX z ní činí program s velmi intuitivním grafickým uživatelským rozhraním a propracovanou kolekcí nápověd. Veškerou automatizaci obstarávají především excelovské funkce a inteligentní procedury a makra konstruované s využitím programovacího jazyka Visual Basic for Applications. [1, str. 44-47]
3.2 Způsob provedení V této podkapitole se seznámíme s některými umělými kroky nezbytnými k tomu, aby matematický model ve své současné formulaci opakovaně pracoval. Vůbec první otazník visí nad propojením MS Excel a LINGO, jelikož v jeho prostředí člověk při sestavě jídelníčku vůbec nepracuje. Dále si ukážeme, v čem spočívá možnost získat jídelníček na více dní neboli jak opakovaně přimět model k jeho vyhodnocování. Doposud by ani nemělo být zřejmé, jak si model poradí s neopakováním potravin v následujích dnech (v případě svačin i ve stejném dni). Vytvořili jsme sice podmínku, která to zajistí (1.6), ale „proměnlivost proměnné“ pj nezajišťuje model samotný, nýbrž procedura ve VBA. I to je důvod, proč pro ni nejsou v modelu stanoveny podmínky binarity, ačkoliv nabývá pouze bivalentních hodnot. Předmětem posledního oddílu pak bude zjištění množství tekutin, které se musí dodatečně vypít.
3.2.1 Propojení MS Excel a LINGO20 Běžná praxe pro importování zdrojových a exportování výsledných dat do MS Excel je použití příkazu @ole a i v našem modelu má své místo pro obě tyto operace. Ovšem spouštět model v prostředí LINGO a následně kontrolovat přehledně uspořádané výsledky v MS Excel není ani trochu praktické. Řešení nabízí speciální procedura, která v excelovském sešitu vytvoří objekt LINGO, do kterého následně vloží lingový model (viz přílohy). Podmínkou je mít tento model přesně v podobě, v jaké jej jsme zvyklý mít v LINGO, vložený v souvislé oblasti buněk v MS Excel a v našem případě přidat do první buňky příkaz SET ECHO 1 a do posledních 3 buněk postupně příkazy TERSE, GO a QUIT. Pro snazší identifikaci celou tuto oblast pojmenujeme (snídaňový model např. S_MODEL). (Pozor, v manuálu končí pojmenovaná oblast v buňce s příkazem GO. To způsobí, že se „přivolané“ LINGO neukončí.) Vyhodnocení modelu provede příkaz RunScriptRange, jehož neúspěch představuje vrácení hodnoty větší než
Celý oddíl vychází z uživatelského manuálu pro LINGO 14.0 (str. 454-457, resp. 468-471), on-line dostupný z: http://www.lindo.com/downloads/PDF/LINGO14.PDF (cit. 1.6.2014) [11] 20
23
0. To ošetříme vhodnou podmínkou a chybovým hlášením pro uživatele. Jak vypadá procedura pro vyhodnocení snídaňového modelu, znázorňuje Obr. 3.1.
Obr. 3.1: Procedura spouštěcí lingový model pro snídani v prostředí MS Excel
3.2.2 Opakované vyhodnocování V případě, kdy chceme sestavit jídelníček na celý týden a každý den přijmout přesně 5 jídel, potřebujeme, aby LINGO vyhodnotilo náš model 35 krát. To se zcela přirozeně jeví jako obtěžující i tehdy, kdy již vše spouštíme z prostředí MS Excel. Situaci nám usnadní šikovně zkonstruovaný for cyklus [1, str. 108-112], který bude fungovat pro libovolný počet dní a bez ohledu na to, jestli přijímáme denně 3 nebo 5 jídel. Tentokrát si neukážeme celou proceduru, protože ta by nutně pro opakovaně správné fungování modelu musela zahrnovat navíc několik dalších operací. Pokud si představíme, že každý řádek v MS Excel bude obsahovat jedno jídlo dne a žádný nebude vynechán, můžeme si alespoň uvést základ takového for cyklu (Obr.3.2).
Obr. 3.2: For cyklus pro opakované vyhodnocování lingového modelu pro snídani
Do proměnné radek se ukládá pozice řádku, kam se vkládají vybrané potraviny pro snídani. V proměnné krok je uložen počet jídel v jednotlivých dnech a pocetdni představuje počet dní, na kolik sestavujeme jídelníček21. Začneme-li na řádku 1, pro 7 dní a 5 jídel v jeden den bude poslední (v pořadí sedmá) snídaně umístěna v řádku 31.
3.2.3 Bez opakování potravin Proběhne-li vyhodnocení modelu úspěšně, výsledek (množství vybraných potravin) se uloží do pojmenované oblasti v MS Excel. Vedle toho existuje jiná pojmenovaná oblast stejného 21
Všechny tyto 3 proměnné by v úplném znění procedury musely být deklarovány. [17]
24
rozsahu (naše pj, v lingovém modelu pro snídani S_priste), která se opět šikovným for cyklem [1, str. 108-112] modifikuje na základě předchozího výsledku (Obr. 3.3).
Obr. 3.3: For cyklus pro snídani bez opakujících se potravin
For cyklus zde prochází oblast exportovaných dat po jednotlivých buňkách. Pokaždé, když je hodnota v buňce větší než 0 (množství vybrané potraviny), „skočí“ o 2 řádky níže a hodnotu v právě aktivní buňce zvýší o 1 (pokud potravina nebyla doposud vybrána, přechozí hodnota byla 0). Poté cyklus pokračuje další buňkou v oblasti. Je zřejmé, že oblast buněk, kde se stávající hodnota zvyšovala 1, je svým rozsahem totožná s pojmenovanou oblastí pj, do které jen propojením buněk stačí tyto navýšené hodnoty přenést. Ukázka for cyklu opět neobsahuje deklaraci použitých porměnných bunka a oblast.
3.2.4 Výpočet vody Řekli jsme si, že požadavky na vodu jsou v našem modelu kvůli velmi omezenému počtu nápojů v souboru potravin zcela uvolněny. Ke každé potravině ovšem máme údaj o obsahu vody v mililitrech a dostačující objem tekutin pro člověka na 1 den známe též22. Proto ještě ke každému kompletnímu jídelníčku na 1 a více dní pomocí excelovských funkcí a VBA dopočítáme, kolik bude muset člověk ještě aspoň vypít tekutin 23. Technicky to bude představovat opět nějaký for cyklus, který by pro každé jídlo dne zjistil, kolik vody obsahují potraviny v něm vybrané. Je zbytečné konstruovat extra for cyklus, pouze 2 klíčové příkazy pro neopakování se potravin v předchozím oddílu (Obr. 3.3) nahradíme příkazy z Obr. 3.4.
Obr. 3.4: Pomocné příkazy do for cyklu pro výpočet vody
Uvědomíme-li si, že pokud byla potravina vybrána, v dané buňce procházené oblasti bude její množství. Nejprve si ale připravíme oblast buněk stejného rozsahu jako procházená oblast, pouze o 2 řádky níž. Tato oblast bude obsahovat množství vody v 1 gramu příslušné potraviny vynásobené množstvím této potraviny, ať už byla vybrána či nikoliv. Bude-li ovšem potravina vybrána, v odpovídající buňce dostaneme celkem přijaté množství vody touto potravinou. Nyní 22 23
http://www.nrv.gov.au/nutrients/water (cit. 1.6.2006) [16] Tentokrát nebudeme zohledňovat hmotnost a úroveň fyzické aktivity, ale pouze pohlaví a věk.
25
už by mohl být význam příkazů jasnější. V proměnné voda (opět bez předchozí deklarace, která je jinak povinná) bude na počátku uložena 0. For cyklus, když „narazí“ na vybranou potravinu, přejde o 2 řádky níž, kde najde množství vody v této potravině a přičte jej ke stávající hodnotě uložené v proměnné voda. Takto bude na konci cyklu v proměnné voda celkový objem vody, který bude přijat daným jídlem dne. Obsah proměnné pak vložíme do buňky sousedící s vybranými potravinami pro dané denní jídlo24. Tento postup aplikujeme na každé jídlo dne, až získáme oblast o rozsahu 3 krát 1 (3 denní jídla) nebo 5 krát 1 (5 denních jídel). Součet této oblasti buňek odečteme od dostačujícího denního příjmu tekutin pro danou osobu a zjistíme, kolik tekutin je ještě třeba vypít.
3.3 Práce s aplikací V předchozích kapitolách jsme si objasnili vše ohledně vstupních datových souborů potravin a zásadní postupy při jejich zpracování. Konečně je tedy na čase se podívat na vlastní aplikaci pohledem osoby, která si chce sestavit jídelníček. Otevřeme-li přiložený soubor BP_model.xlsm, zobrazí se nám úvodní stránka25, kde máme na výběr 4 možnosti: SPUSTIT APLIKACI, ÚPRAVA VZHLEDU, INFORMACE a KONEC. Vezmeme-li to odzadu, tak KONEC zavře spuštěný soubor. Základní přehled informací o aplikaci obsahují INFORMACE. Volba ÚPRAVA VZHLEDU by zde měla sloužit především pro autora aplikace, neboť zpřístupní veškerý obsah. Jedince, který má v úmyslu si sestavit jídelníček, by měla nejvíce zajímat možnost SPUSTIT APLIKACI.
Obr. 3.5: Hlavní menu aplikace - Osobní údaje
24 25
Toto se technicky provede opět v rámci jednoho z cyklů, zde již není uvedeno. Podoba úvodní stránky není v této práci ukázána.
26
Učiníme-li tak, dostaneme se do první části Hlavního menu, které vypadá podle Obr. 3.5. Zde je prostor pro přesné vymezení osoby. Pohlaví a Úroveň fyzické aktivity se určí jednoznačnou volbou. Věk a Hmotnost musejí být zadány ve formě čísla, případné chybné vstupy jsou ošetřeny. Jak vyplnit jednotlivá pole a co znamenají jednotlivé stupně fyzické aktivity, v sobě skrývá Nápověda. K přesunu do souboru všech potravin, které byly vybrány z CZFCDB, slouží tlačítko Potraviny. Po zvolení a vyplnění všech údajů se přesuneme dál pomocí Pokračovat.
Obr. 3.6: Hlavní menu aplikace - Sestavení jídelníčku
Přejdeme tak do druhé části Hlavního menu (Obr 3.6). Právě tady probíhá definice našich požadavků na sestavený jídelníček. V Rozsahu jídelníčku můžeme vybrat, zda chceme sestavit celý jídelníček nebo jen 1 jídlo a následně vybrat, které to bude (zviditelní se nabídka, která není na Obr. 3.6 zachycena). Nezávisle na předchozí volbě vybíráme Počet dní a Rozložení jídel v jednotlivých dnech. Volba Rozložení jídel v jednotlivých dnech má zcela zásadní vliv na korekci požadavků všech živin (RDI i UL). Doposud byly požadavky stanoveny, jako kdyby člověk denně přijímal jen 1 jídlo, např. pro případ 3 denních jídel by to znamenalo možné až trojnásobné naplnění požadavků, což by zaručeně vedlo k překročení maximálních dávek. Proto se musí všechny dávky v závislosti na této volbě přenásobit koeficienty26, které určují podíl živin daného denního jídla na celkovém denním příjmu živin (Tab. 2.4).
Koeficienty pro 5 jídel denně jsou určeny na základě rozložený energetického příjmu uvedeného v dokumentu Základy výživy, on-line dostupného z: http://fittrend.cz/pdf/vyziva.pdf (cit. 2.6.2014) [10], koeficienty pro 3 jídla denně byly stanoveny analogií. 26
27
Jídlo dne Snídaně Svačina (2x) Oběd Večeře
Koeficienty rozložení energie 3 jídla denně 5 jídel denně 0,3 0,375 0,1 0 0,3 0,375 0,2 0,25
Tab. 3.1: Koeficienty rozložení energetického příjmu podle počtu denních jídel
Nejdůležitější možností v druhé části Hlavního menu je zaškrtávací volba uvolnit požadavky (vitaminy a minerální látky). V druhé kapitole jsme mluvili o tom, že např. potraviny s kompletnějším záznamem jsou oproti ostatním zvýhodněny. Takové potraviny budou modelem přirozeně vybrány přednostně, a pokud bychom nestanovili podmínku (1.6), upřednostňoval by je pořád. Podmínka toto zakáže, a jestliže se nenajde žádná jiná potravina, která by sama či v kombinaci s jinou plně uspokojila dané požadavky, model se stane neřešitelným. Při testování k takové situaci docházalo zpravidla už při třetí sestavě stejného denního jídla. Proto zde má své místo tato volba, která zcela odstraní (uvolní) denní požadavky na minimální a maximální dávky vitaminů a minerálních látek, které činí největší problém. Aplikace má v sobě zabudováno ošetření, které nedovolí bez uvolnění požadavků sestavit jídelníček na 3 a více dní. Vynechání požadavků resolutně narušuje cíl této práce, avšak skýtá to i jednu výhodu. Již před uvolněním požadavků musela být kvůli řešitelnosti modelu kladena velká benevolence na maximální dávky energie, bílkovin, tuků a sacharidů (byly stanoveny jako dvojnásobek jejich RDI), hlavně kvůli obtíži dosáhnout na RDI vitaminů a minerálních látek bez výrazného překročení jejich UL. Zdánlivé splnění všech požadavků, tak ve skutečnosti mohlo znamenat nadměrný příjem základních nutrientů27. Výhoda uvolnění požadavků zaručí maximální relativní odchylku od RDI základních nutrientů 10 % (v opačném případě pro ně hrozilo až 100 %). Tata proměnlivost opět představovala vystavění jistých koeficientů (Tab. 3.2), které v závisloti na volbách v druhé části Hlavního menu modifikovaly znění požadavků. Uvolnění požadavků NE ANO
Přenásobovací koeficienty RDI UL 0,9 2 0,9 1,1
Tab. 3.2: Přenásobovací koeficienty požadavků na RDI/UL energie, bílkovin, tuků a sacaharidů s ohledem na uvolnění požadavků
Pakliže jsme již dostatečně definovali své nároky na sestavený jídelníček a nehodláme měnit nic na osobních údajích (tlačítko Zpět), ani nemáme případné nejasnosti (tlačítko Nápověda), operaci vyhodnocování matematického modelu, na jehož konci by měl stát sestavený jídelníček, zahájíme tlačítek Sestavit.
27
Tento fakt hrozí pokaždé, kdy zvolíme pouze 1 jídlo, nebo sestavujeme-li jídelníček pouze na 1 den.
28
Závěr Tato bakalářská práce si vzala za cíl sestavit kompletní jídelníček pro lidského jedince rozdíleného pohlaví, věku, úrovně fyzické aktivity a hmotnosti, a to až na 7 dní ve dvou variantách rozdělení denních jídel, buď snídaně, oběd, večeře (3 jídla denně), nebo snídaně, svačina, oběd, svačina, večeře (5 jídel denně). Podmínkou takového jídelníčku bylo splňovat požadavky na minimální a maximální denní dávky nejrůznějších živin, životně důležitých pro lidský organismus. K tomuto účelu byl zformulován obecný matematický model, který se speciálními podmínkami pro vhodné kombinace potravin lišil pro jednotlivá denní jídla. To ze záměru udělalo úlohu lineárního programování, k jejímuž řešení byl využit optimalizační software LINGO ve verzi 9.0 za výrazného přispění tabulkového procesoru Microsoft Office Excel 2013. Celý proces měl být zastřešen aplikací s grafickým uživatelským rozhraním formovaným z ovládacích prvků ActiveX, jejichž funkčnost by zajišťoval programovací jazyk Visual Basic Applications. Už před vlastním řešením úlohy vyvstala řada problémů, která vyřešení úlohy při nejmenším značně stěžovala. Tím největším z nich se ukázaly být nekompletnost zdrojových dat o potravinách a nepostačující specifika výživových požadavků. V obou případech šlo o klíčový vliv na vyhodnocování zfomulovaného modelu. Většinu vzniklých problémů se podařilo nějakým „trikem“ obejít, některé však bylo nutné akceptovat včetně jejich dopadů na sestavený jídelníček. Hlavní cíl se tedy s drobnými nedostatky podařilo naplnit. Povedlo se sestavit jídelníček pro několik různých osob různého pohlaví, věku, úrovně fyzické aktivity i hmotnosti až na 7 dní (ukázka jednoho takové je v přílohách), který by vždy splňoval alespoň některé požadavky na doporučené denní dávky živin. S tím souviselo i úspěšné vystavění kýžené aplikace, která z úlohy sestavení jídelníčku učinila zajímavý testovací nástroj. Je ale k zamyšlení, kde stojí pomyslná hranice mezi problémem, který stojí za to naformulovat jako ekonomický, posléze matematický model a řešit jako úlohu LP, a problémem, jenž má daleko přímočařejší a jasnější řešení bez jakéhokoliv hlubšího zamyšlení a využití optimalizačních nástrojů. Případ sestavení jídelníčku se i s ohledem na komplikace, které při jeho řešení jako optimalizační úlohy snadno mohou nastat, řadí spíše k druhému typu vymezených problémů.
29
Seznam použité literatury [1]
BENÁČANOVÁ H.: Tvorba aplikací v Microsoft Office Excel 2. část. Možnosti VBA, Oeconomica, Praha, 2009, ISBN 978-80-245-1602-8 (str. 44-47, 108-112)
[2]
JABLONSKÝ J.: Programy pro matematické modelování, Oeconomica, Praha, 2011, ISBN 978-80-245-1810-7 (str. 7-9, 100-103, 251-255)
[3]
LAGOVÁ M., JABLONSKÝ J.: Lineární modely, Oeconomica, Praha, 2009, ISBN 978-80-245-1511-3 (str. 20, 48-51, 257-259)
[4]
MIKULČÁK J. a kol.: Matematické, fyzikální a chemické tabulky a vzorce pro střední školy, Prometheus, Praha, 2006, ISBN 80-7196-264-3 (str. 51)
Internetové zdroje: [5]
Algoritmy.net – Směšovací problém, on-line dostupné z: http://www.algoritmy.net/article/1411/Smesovaci-problem (cit. 30.5.2014)
[6]
Center for Disease Control and Prevention – Vital and Health Statistics: Weight by Height and Age of Adults (str. 11, odpovída str. 16/44), on-line dokument dostupný z: http://www.cdc.gov/nchs/data/series/sr_11/sr11_014acc.pdf (cit. 30.5.2014)
[7]
Centrum pro databázi složení potravin (2013): On-line databáze složení potravin ČR, verze 4.13. Centrum pro databázi složení potravin. Ústav zemědělské ekonomiky a informací a Výzkumný ústav potravinářský Praha. Web: http://www.czfcdb.cz
[8]
Deník E15 – WHO snížila doporučenou dávku soli, článek on-line dostupný z: http://zdravi.e15.cz/denni-zpravy/profesni-aktuality/who-snizila-doporucenou-dennidavku-soli-468898 (cit. 1.6.2014)
[9]
EuroFIR, dostupné z: http://www.eurofir.org/ (cit. 30.5.2014)
[10] Fittrend – Základy výživy, dokument dostupný z: http://fittrend.cz/pdf/vyziva.pdf (cit. 2.6.2014) [11] LINDO SYSTEMS Inc. – software LINGO v aktuální verzi 14.0 dostupný z: http://www.lindo.com/ (cit. 30.5.2014) [12] Matematika – množiny, dostupné z: http://www.matematika.cz/mnoziny (cit. 31.5.2014) [13] McDonaldsMenu.info, dostupné z: http://www.mcdonaldsmenu.info/nutrition/ (cit. 30.5.2014) [14] Microsoft Office Excel 2013, dostupný z: http://office.microsoft.com/cs-cz/excel/ (cit. 30.5.2014)
30
[15] NašeInfo – Průměrná hmotnost dětí podle věku, on-line dostupné z: http://www.naseinfo.cz/clanky/tehotenstvi-a-deti/obezita-u-deti/prumerna-hmotnostdeti-podle-veku (cit. 30.5.2014) [16] Nutrient Reference Values for Australia and New Zealand, dostupné z: http://www.nrv.gov.au/nutrients (cit. 30.5.2014) [17] Pavel Lasák – kurz MS Excelu a VBA, dostupné z: http://office.lasakovi.com/excel/ (cit. 30.5.2014) [18] Vína z Moravy, vína z Čech – Co je malá dávka alkoholu, článek on-line dostupný z: http://www.wineofczechrepublic.cz/vino-a-zdravi/vino-a-stridmost/6-co-je-mala-davkaalkoholu.html (cit. 30.5.2014) [19] Vitalia – Sůl a její vliv na lidské zdraví, tisková zpráva on-line dostupná z: http://www.vitalia.cz/tiskove-zpravy/sul-a-jeji-vliv-na-lidske-zdravi/ (cit. 30.5.2014)
31
Seznam tabulek a obrázků Tab. 1.1: Rozdělení potravin pro snídani Tab. 1.2: Rozdělení potravin pro svačinu Tab. 1.3: Rozdělení potravin pro oběd a večeři Tab. 2.1: Skupiny potravin na Centru pro databázi složení potravin Tab. 2.2: Koeficienty úrovně fyzické aktivity podle věku Tab. 2.3: Koeficienty relativního snížení či zvýšení s každým 1 kg podle hmotnosti Obr. 3.1: Procedura spouštěcí lingový model pro snídani v prostředí MS Excel Obr. 3.2: For cyklus pro opakované vyhodnocování lingového modelu pro snídani Obr. 3.3: For cyklus pro snídani bez opakujících se potravin Obr. 3.4: Pomocné příkazy do for cyklu pro výpočet vody Obr. 3.5: Hlavní menu aplikace - Osobní údaje Obr. 3.6: Hlavní menu aplikace - Sestavení jídelníčku Tab. 3.1: Koeficienty rozložení energetického příjmu podle počtu denních jídel Tab. 3.2: Přenásobovací koeficienty požadavků na RDI/UL energie, bílkovin, tuků a sacharidů s ohledem na uvolnění požadavků
32
Přílohy Příloha č. 1: Formulace matematického modelu pro sestavení snídaně v LINGO MODEL: !snídaně; SETS: ! stanovení množin potravin, nutrientů a obsahu nutrientů v potravinách; snidane_potraviny / @ole('BP_model.xlsm','S_potraviny') /: x, m, S_max, S_priste; snidane_nutrienty / @ole('BP_model.xlsm','nutrienty') /: RDI, UL; matice (snidane_nutrienty, snidane_potraviny): S_data; ENDSETS ! minimalizujeme počet potravin k snídani, aby bylo možné sestavit nenáročný denní jídelníček a příprava nezabrala moc času; min=@sum(snidane_potraviny(j): x(j)); ! podmínky na maximální (UL) a minimální/optimální (RDI) dávky nutrientů; @for(snidane_nutrienty(i): @sum(snidane_potraviny(j): S_data(i,j)*m(j))>=RDI(i)); @for(snidane_nutrienty(i): @sum(snidane_potraviny(j): S_data(i,j)*m(j))<=UL(i)); ! výběr potravin -> nebude-li vybrána, nebude jí přidělena hmotnost; @for(snidane_potraviny(j): m(j)<=K*x(j)); ! podmínka maximální hmotnost (porce) potraviny; @for(snidane_potraviny(j): m(j)<=S_max(j)); ! j j j j j j j
= = = = = = =
1-8 pečivo 9-28 tuky, sýry a saláty 29-36 maso nebo masné výrobky 37 piškoty 38-44 ovoce a zelenina 45, 46, 47 vejce, palačinka, ovesné vločky 48-51 jogurty a mléko;
! bude vybrán vždy maximálně jeden druh pečiva; @sum(snidane_potraviny(j)| j#GE#1 #AND# j#LE#8: x(j))<=1; ! k tukům, sýrům, salátům a masu nebo masným výrobkům bude vždy vybráno pečivo; @sum(snidane_potraviny(j)| j#GE#9 #AND# j#LE#36: x(j))<=1-eps+K*y; @sum(snidane_potraviny(j)| j#GE#1 #AND# j#LE#8: x(j))>=1-K*(1-y); ! k ovesným vločkám bude vždy mléko nebo jogurt; x(47)<=1-eps+K*z; @sum(snidane_potraviny(j)| j#GE#48 #AND# j#LE#51: x(j))>=1-K*(1-z); ! potraviny se nebudou v příští snídani opakovat; @for(snidane_potraviny(j): x(j)<=S_priste(j)); ! potravina bude (1) nebo nebude (0) vybrána; @for(snidane_potraviny(j): @bin(x(j))); ! množství vybrané potraviny bude udáno v celých gramech; @for(snidane_potraviny(j): @gin(m(j))); ! pomocné binarní proměnné pro podmínky typu IF - THEN; @bin(y); @bin(z); DATA: ! import a export dat do excelu; RDI, UL, S_data, S_max, S_priste = @ole('BP_model.xlsm'); K = 10000000; ! dostatečně velká konstanta; eps = 0.001; ! dostatečně malá konstanta; @ole('BP_model.xlsm','S_reseni') = m; ENDDATA END
33
Příloha č. 2: Formulace matematického modelu pro sestavení svačiny v LINGO MODEL: !svačina (zkratka P jako přesnídávka); SETS: ! stanovení množin potravin, nutrientů a obsahu nutrientů v potravinách; svacina_potraviny / @ole('BP_model.xlsm','P_potraviny') /: x, m, P_max, P_priste; svacina_nutrienty / @ole('BP_model.xlsm','nutrienty') /: RDI, UL; matice (svacina_nutrienty, svacina_potraviny): P_data; ENDSETS ! minimalizujeme počet potravin k svačině, aby bylo možné sestavit nenáročný denní jídelníček a příprava nezabrala moc času; min=@sum(svacina_potraviny(j): x(j)); ! podmínky na maximální (UL) a minimální/optimální (RDI) dávky nutrientů; @for(svacina_nutrienty(i): @sum(svacina_potraviny(j): P_data(i,j)*m(j))>=RDI(i)); @for(svacina_nutrienty(i): @sum(svacina_potraviny(j): P_data(i,j)*m(j))<=UL(i)); ! výběr potravin -> nebude-li vybrána, nebude jí přidělena hmotnost; @for(svacina_potraviny(j): m(j)<=K*x(j)); ! podmínka pro maximální hmotnost (porce) potraviny; @for(svacina_potraviny(j): m(j)<=P_max(j)); ! j j j j j j j j
= = = = = = = =
1-8 pečivo 9-30 tuky, sýry a saláty 31-41 maso nebo masné výrobky 42-71 ovoce a zelenina 72-80 ořechy a semena 81-85, 86 čokoláda, piškoty 87, 88-99 vejce, hotová jídla (nevyžadují přílohu) 100, 101-104 ovesné vločky, jogurty a mléko;
! bude vybrán vždy maximálně jeden druh pečiva nebo hotové jídlo; @sum(svacina_potraviny(j)| (j#GE#1 #AND# j#LE#8) #OR# (j#GE#88 #AND# j#LE#99): x(j))<=1; ! k tukům, sýrům, salátům a masu nebo masným výrobkům bude vždy pečivo; @sum(svacina_potraviny(j)| j#GE#9 #AND# j#LE#41: x(j))<=1-eps+K*y; @sum(svacina_potraviny(j)| j#GE#1 #AND# j#LE#8: x(j))>=1-K*(1-y); ! k ovesným vločkám bude vždy mléko nebo jogurt; x(100)<=1-eps+K*z; @sum(svacina_potraviny(j)| j#GE#101 #AND# j#LE#104: x(j))>=1-K*(1-z); ! potraviny se nebudou v příští svačině opakovat; @for(svacina_potraviny(j): x(j)<=P_priste(j)); ! potravina bude (1) nebo nebude (0) vybrána; @for(svacina_potraviny(j): @bin(x(j))); ! množství vybrané potraviny bude udáno v celých gramech; @for(svacina_potraviny(j): @gin(m(j))); ! pomocné binarní proměnné pro podmínky typu IF - THEN; @bin(y); @bin(z); ! import a export dat do excelu; DATA: RDI, UL, P_data, P_max, P_priste = @ole('BP_model.xlsm'); K = 10000000; ! dostatečně velká konstanta; eps = 0.001; ! dostatečně malá konstanta; @ole('BP_model.xlsm','P_reseni') = m; ENDDATA END
34
Příloha č. 3: Formulace matematického modelu pro sestavení oběda a večeře v LINGO MODEL: !oběd a večeře; SETS: ! stanovení množin potravin, nutrientů a obsahu nutrientů v potravinách; OV_potraviny / @ole('BP_model.xlsm','OV_potraviny') /: x, m, OV_max, OV_priste; OV_nutrienty / @ole('BP_model.xlsm','nutrienty') /: RDI, UL; matice (OV_nutrienty, OV_potraviny): OV_data; ENDSETS ! minimalizujeme počet potravin k obědu a večeři, aby bylo možné sestavit nenáročný denní jídelníček a příprava nezabrala moc času; min=@sum(OV_potraviny(j): x(j)); ! podmínky na maximální (UL) a minimální/optimální (RDI) dávky nutrientů; @for(OV_nutrienty(i): @sum(OV_potraviny(j): OV_data(i,j)*m(j))>=RDI(i)); @for(OV_nutrienty(i): @sum(OV_potraviny(j): OV_data(i,j)*m(j))<=UL(i)); ! výběr potravin -> nebude-li vybrána, nebude jí přidělena hmotnost; @for(OV_potraviny(j): m(j)<=K*x(j)); ! podmínka pro maximální hmotnost (porce) potraviny; @for(OV_potraviny(j): m(j)<=OV_max(j)); ! j = 1-16 přílohy (1-4 pečivo, 5-6 rýže, 7-9 těstoviny, 10-11 brambory, 12-15 knedlíky, 16 bramborový salát) j = 17-38 zelenina a zeleninové saláty, (18-19, 20 fazole, hrách, 21, 35 houby) j = 39-41, 42 hořčice a kečup, hranolky j = 43-68 maso j = 69-74 párky, špekáčky, jitrnice (masné výrobky) j = 75-87 ryby j = 88-92 omáčky j = 93-96 sója, tofu, čočka j = 97-108 hotová jídla (nevyžadují přílohu) j = 109-116 alkoholické nápoje; ! k masu bude vždy vybrán bramborový nebo chlubatý knedlík nebo fazole a naopak; @sum(OV_potraviny(j)| j#GE#43 #AND# j#LE#68: x(j)) = @sum(OV_potraviny(j)| (j#GE#12 #AND# j#LE#13) #OR# j#EQ#15 #OR# (j#GE#18 #AND# j#LE#19): x(j)); ! k párkům, špekáčkům a jitrnicím bude vždy vybráno pečivo, hrách nebo čočka a naopak; @sum(OV_potraviny(j)| j#GE#69 #AND# j#LE#74: x(j)) = @sum(OV_potraviny(j)| (j#GE#1 #AND# j#LE#4) #OR# j#EQ#20 #OR# j#EQ#96: x(j)); ! k rybám budou vždy vybrány brambory nebo bramborový salát a naopak; @sum(OV_potraviny(j)| j#GE#75 #AND# j#LE#87: x(j)) = x(10) + x(11) + x(16); ! k omáčkám bude vždy vybrána rýže, těstoviny nebo houskový knedlík a naopak; @sum(OV_potraviny(j)| j#GE#88 #AND# j#LE#92: x(j)) = @sum(OV_potraviny(j)| (j#GE#5 #AND# j#LE#9) #OR# j#EQ#14: x(j)); ! bude vybráno vždy maximálně jedno maso, masný výrobek, ryba, omáčka, sója či tofu nebo hotové jídlo; @sum(OV_potraviny(j)| (j#GE#43 #AND# j#LE#95) #OR# (j#GE#97 #AND# j#LE#108): x(j))<=1; ! pokud bude vybrána hořčice nebo kečup, budou vybrány i masné výrobky; @sum(OV_potraviny(j)| j#GE#39 #AND# j#LE#41: x(j))<=1-eps+K*y; @sum(OV_potraviny(j)| j#GE#69 #AND# j#LE#74: x(j))>=1-K*(1-y); ! pokud budou vybrány houby, bude vybráno i maso nebo vybraná hotová jídla; x(21) + x(35)<=1-eps+K*z; @sum(OV_potraviny(j)| (j#GE#43 #AND# j#LE#68) #OR# (j#GE#97 #AND# j#LE#99): x(j))>=1-K*(1-z); ! potraviny se nebudou v příštím obědě či večeři opakovat; @for(OV_potraviny(j): x(j)<=OV_priste(j));
35
! potravina bude (1) nebo nebude (0) vybrána; @for(OV_potraviny(j): @bin(x(j))); ! množství vybrané potraviny bude udáno v celých gramech; @for(OV_potraviny(j): @gin(m(j))); ! pomocné binarní proměnné pro podmínky typu IF - THEN; @bin(y); @bin(z); DATA: ! import a export dat do excelu; RDI, UL, OV_data, OV_max, OV_priste = @ole('BP_model.xlsm'); K = 10000000; ! dostatečně velká konstanta; eps = 0.001; ! dostatečně malá konstanta; @ole('BP_model.xlsm','OV_reseni') = m; ENDDATA END
Příloha č. 4: Kompletní jídelníček na 7 dní (5 jídel denně) včetně výpočtu vody
36