Използване на Xpress Optimizer за решаване на проблеми със симулацията и оптимизацията.

optimizer

Статията предоставя преглед на пакета Xpress Optimizer, предназначен за решаване на проблеми при математическо моделиране и оптимизация. Този софтуерен продукт е разработен от Dash Optimization от няколко години. Съкратената му версия е достъпна за безплатно изтегляне на уебсайта на компанията.

С помощта на Xpress Optimizer можете да внедрите математически модели с различна сложност и да ги оптимизирате за всякакви параметри. Гъвкавият език за описване на математически модели ви позволява да вземете предвид широк спектър от ограничения, а елементите на функционалното програмиране, въведени в него, ви позволяват да избегнете много трудности при формализирането на модела.

Пакетът се основава на ядрото от математически функции, внедрени в C ++. В същото време Xpress IVE се доставя към математическото ядро ​​- графична среда за разработка в специализирания език за програмиране Mosel.

Програмата на Mosel се нарича модел. Той се компилира в междинен формат и след това се изпълнява в ядрото на оптимизатора, което е набор от внедрени методи за числена оптимизация. В този случай компилираният модел може да се изпълни на конзолната версия на оптимизатора, инсталиран, например, на клъстер или суперкомпютър. Трябва да се отбележи, че конзолната версия на Optimizer поддържа компилация на модели от езика Mosel от командния ред.

Езикът за програмиране Mosel е процедурен език, който поддържа условни, както и циклични изрази. Графичната среда за разработка IVE поддържа няколко съветника за генериране на код, с които можете да внедрите и оптимизирате математически модел, който не съдържа сложни условия в асистентския режим. Също така езикът за програмиране поддържа изпълнението на функции. Като цяло, както ще се види в следващите примери, синтаксисът на mosel е много подобен на синтаксиса на езика за програмиране Pascal.

След това помислете за проста програма на Mosel, която демонстрира как да работите с набори:

След това ще разгледаме използването на Xpress Optimizer за решаване на най-простия проблем с оптимизацията.

Тази задача е модел за управление на доставката. Като входни данни програмата се предоставя с набора от производители и потребители, производствения капацитет на доставчиците и търсенето на потребителите, както и разходите за доставка на единица продукция от производител до потребител. Целта на оптимизацията е да се сведат до минимум транспортните разходи, при условие че се удовлетвори търсенето на всички потребители. Обемите на доставка от производителя до потребителя се приемат като променливи на задачата. Всички изходни данни се зареждат от файлове. Резултатът от програмата се извежда в конзолата на оптимизатора и във файл. Програмата също така изгражда стълбовидна диаграма, показваща товара на производителите. Диаграмата е изчертана в съответния прозорец на Xpress Optimizer.

По-долу е даден списък на разработената програма за Mosel.

За разлика от предишната програма, в този пример бяха свързани два модула: линейна оптимизация и модул, отговорен за чертане на графики (mmive). В раздела за декларации в допълнение към наборите от низове се декларират масиви, които се индексират от тези набори, както и скаларни променливи. Трябва да се отбележи, че типът mpvar е типът "променливи на задачата". Ядрото за оптимизация ще работи върху тях. Данните се инициализират от файлове с помощта на инициализациите от команда, последвани от името на файла. Данните във файла трябва да бъдат точно в реда, в който се появяват в командата за инициализации. Пример за такъв файл за първата инициализация е даден по-долу:

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

Функцията exisits проверява за съществуването на обект в паметта. Променливите на задачите се инициализират в цикъл, който итерира над подмножество от декартовия продукт на наборите Клиенти и разработчици, за всеки от които условието, написано след |.

След това се декларира целевата функция TotalCost - функция за линейно програмиране. Тогава се определят ограниченията върху производствения капацитет и задоволяването на търсенето.

След задаване на ограничения, използвайте командата minimize, за да разрешите проблема с линейното програмиране.

Следният код анализира резултатите от решаването на проблем:

Функцията getprobstat получава състоянието на проблема (разрешен, неограничен или несъвместим). Константа 2 означава, че проблемът е решен. В този случай стойностите на променливите се получават с помощта на командата getol. Необходима е проверка getol (x (c, d))> 0, тъй като проблемът се решава числено и някои нулеви стойности на променливите се определят с малка грешка.

След това се изгражда стълбовидна диаграма, показваща товара на производителите.

След това, използвайки инициализациите за командване, резултатите се записват в текстов файл.

В този пример се разглежда проблем с линейното програмиране. Ядрото на Xpress Optimizer обаче предоставя функции за решаване на проблеми с квадратично програмиране (включително цяло число и смесено). В същото време езикът mosel позволява на разработчика да посочи метода на решение - симплекс или евристични алгоритми като параметър на функцията минимизиране.

В допълнение към минимизирането се предлага и максимизиране (функция за максимизиране).

Като цяло, mosel е подобен по синтаксис на Pascal. Той осигурява изпълнение на процедури, функции, допълнителни модули, включително в C++.

В заключение може да се отбележи, че използването на Mosel и Xpress Optimizer позволява на разработчика да не се фокусира върху техническото изпълнение на методите за оптимизация, а да отдели повече време за изграждане на модел и формализиране на проблема.