Példa a diéta probléma optimalizálására a C-ben

Az ebben a példában megoldott optimalizálási probléma az, hogy egy étrendet össze kell állítani egy élelmiszerekből, így a tápanyagigény kielégül és a teljes költség minimálisra csökken. A diet.cpp példa bemutatja ezeket az eljárásokat:

diéta

A probléma ábrázolása

A probléma egy sor élelmiszert tartalmaz, amelyek a modellező változók; teljesítendő táplálkozási követelmények összessége, amelyek korlátok; és az élelmiszer teljes költségének minimalizálása. Kétféleképpen lehet megvizsgálni ezt a problémát:

A Concert Technology egyformán alkalmas mindkét típusú modellezésre; valójában akár mindkét megközelítést összekeverheti ugyanabban a programban. Ha új élelmiszertermék jön létre, akkor létrehozhat hozzá egy új változót, függetlenül attól, hogy a modell eredetileg hogyan épült fel. Hasonlóképpen, ha új tápanyagot fedeznek fel, új korlátozást adhat hozzá.

Modellsor létrehozása soronként

Belép az üzletbe, és összeállítja a felajánlott ételek listáját. Minden ételnél tárolja az egységenkénti árat és a készleten lévő mennyiséget. Néhány olyan ételhez, amelyet különösen szeret, beállít egy minimális mennyiséget, amelyet az étrendben szeretne használni. Ezután az egyes élelmiszerekhez létrehoz egy modellező változót, amely az étrendhez vásárolni kívánt mennyiséget ábrázolja.

Most kap egy orvosi könyvet, és utánanéz, mely tápanyagok ismertek és relevánsak az Ön számára. Minden tápanyagnál meg kell jegyeznie az étrendben megtalálható minimális és maximális mennyiséget. Ezenkívül átnézi az élelmiszerek listáját, és meghatározza, hogy egy élelmiszer mennyit fog hozzáadni az egyes tápanyagokhoz. Ez tápanyagonként egy korlátozást ad, amelyet természetesen tartományi korlátként is ábrázolhatunk:

A modell létrehozásának ezt a módját a buildModelByRow függvény mutatja be, például az ilodiet.cpp .

Modelloszlop létrehozása oszloponként

Az orvosi könyvvel kezdi, ahol összeállítja azon tápanyagok listáját, amelyekről meg szeretné győződni, hogy megfelelően szerepelnek-e az étrendben. Minden tápanyaghoz létrehoz egy üres korlátozást:

nutrMin [i]. nutrMax [i]

hol . meg kell tölteni, ha belép az üzletbe. Ezenkívül beállítja a célfüggvényt a költségek minimalizálása érdekében. Az i korlátozást [i] tartománynak, az objektumot pedig költségnek nevezzük .

Most belép az üzletbe, és minden egyes ételnél megnézi az árat és a tápértéket. Ezekkel az adatokkal létrehoz egy változót, amely reprezentálja az élelmiszertípus vásárolni kívánt mennyiségét, és telepíti azt a célfüggvénybe és a korlátokba. Vagyis létrehozza a következő oszlopot:

ahol a + és az összeg jelölés azt jelzi, hogy az új j változót hozzáadja az objektív költség és korlátok tartományához [i]. A zárójelben szereplő érték az új változóhoz használt lineáris együttható. Ez a jelölés hasonló a Concert Technology-ban ténylegesen használt szintaxishoz, amint azt a buildModelByColumn függvény bemutatja, például az ilodiet.cpp .

Többdimenziós tömbök létrehozása az IloArray segítségével

A problémát meghatározó összes adat fájlból olvasható le. Az ételenként található tápanyagokat kétdimenziós tömbben tárolják. A Concert Technology nem nyújt előre meghatározott tömbosztályt; az IloArray sablon osztály használatával azonban létrehozhat saját kétdimenziós tömb osztályt. Ezt az osztályt a típusdefinícióval határozzuk meg:

typedef IloArray IloNumArray2;

és ezután használatra kész, mint minden előre definiált Concert Technology osztály, például az IloNumArray, a numerikus adatok egydimenziós tömb osztálya.