Проблемът с оптимизацията, решен в този пример, е да се състави диета от набор от храни, така че хранителните изисквания да бъдат удовлетворени и общите разходи да бъдат сведени до минимум. Пример diet.cpp илюстрира тези процедури:

диетичния

Представяне на проблем

Проблемът съдържа набор от храни, които са променливите за моделиране; набор от хранителни изисквания, които трябва да бъдат изпълнени, какви са ограниченията; и цел за минимизиране на общите разходи за храната. Има два начина за разглеждане на този проблем:

Концертната технология е еднакво подходяща и за двата вида моделиране; всъщност можете дори да комбинирате двата подхода в една и съща програма. Ако е създаден нов хранителен продукт, можете да създадете нова променлива за него, независимо от това как първоначално е построен моделът. По същия начин, ако бъде открито ново хранително вещество, можете да добавите ново ограничение за него.

Създаване на модел ред по ред

Влизате в магазина и съставяте списък с храни, които се предлагат. За всяка храна съхранявате цената за единица и количеството на склад. За някои храни, които особено харесвате, вие също така определяте минимално количество, което искате да използвате във вашата диета. След това за всяка от храните създавате променлива за моделиране, която да представя количеството, което трябва да бъде закупено за вашата диета.

Сега получавате медицинска книга и разглеждате кои хранителни вещества са известни и подходящи за вас. За всяко хранително вещество отбелязвате минималните и максималните количества, които трябва да бъдат намерени във вашата диета. Също така, вие преглеждате списъка с храни и определяте колко храна ще допринесе за всяко хранително вещество. Това ви дава едно ограничение на хранително вещество, което естествено може да бъде представено като ограничение на обхвата:

Този начин на създаване на модела е показан във функцията buildModelByRow, в пример ilodiet.cpp .

Създаване на модел колона по колона

Започвате с медицинската книга, където съставяте списъка с хранителни вещества, за които искате да сте сигурни, че са правилно представени във вашата диета. За всяко от хранителните вещества създавате празно ограничение:

nutrMin [i]. nutrMax [i]

където . остава да се напълни, след като влезете в магазина. Освен това настройвате целевата функция, за да минимизирате разходите. Ограничението i се нарича обхват [i], а целта - цена .

Сега влизате в магазина и за всяка храна проверявате цената и хранителното съдържание. С тези данни създавате променлива, представляваща сумата, която искате да купите за вида храна, и я инсталирате в целевата функция и ограничения. Тоест създавате следната колона:

където нотацията + и сумата показват, че добавяте новата променлива j към обхвата на обективните разходи и ограничения [i]. Стойността в скоби е линейният коефициент, който се използва за новата променлива. Тази нотация е подобна на синтаксиса, действително използван в Concert Technology, както е показано във функцията buildModelByColumn, в пример ilodiet.cpp .

Създаване на многомерни масиви с IloArray

Всички данни, определящи проблема, се четат от файл. Хранителните вещества на храна се съхраняват в двуизмерен масив. Concert Technology не предоставя предварително дефиниран клас масив; обаче, като използвате шаблона клас IloArray, можете да създадете свой собствен двумерен клас масив. Този клас се дефинира с дефиницията на типа:

typedef IloArray IloNumArray2;

и след това е готов за използване, точно както всеки предварително дефиниран клас на Concert Technology, например IloNumArray, едномерният клас масив за числови данни.