Напред: Допълнителни елементи за моделиране Нагоре: Примерна обиколка Предишна: Зареждане и решаване

Java това


Изградете модел

Няколко от примерите за Gurobi изграждат модели от нулата. Започваме с фокусиране върху две: mip1 и sos. И двамата изграждат много прости модели, за да илюстрират основния процес.

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

В C ++, C # и Java създавате нов модел с помощта на конструктора GRBModel. В Java това изглежда така: В Python класът се нарича Model и неговият конструктор е подобен на GRBModel конструктора за C ++ и Java.

След като моделът е създаден, типичната следваща стъпка е добавяне на променливи. В C използвате функцията GRBaddvars, за да добавите една или повече променливи: В C ++, Java и Python използвате метода addVar за обекта Model (AddVar в C #). В Java това изглежда така: Долната граница на новата променлива, горната граница, целевият коефициент, тип и име са посочени като аргументи. В C ++ и Python можете да пропуснете тези аргументи и да използвате стойности по подразбиране; вижте Справочното ръководство на Gurobi за подробности.

Следващата стъпка е да добавите ограничения към модела. Линейните ограничения се добавят чрез функцията GRBaddconstr в C: За да добавите линейно ограничение в C, трябва да посочите списък с променливи индекси и коефициенти за лявата страна, смисъл за ограничението (например GRB_LESS_EQUAL) и десен -константа на ръката. Можете също така да дадете име на ограничението; ако пропуснете името, Gurobi ще присвои име по подразбиране за ограничението.

В C ++, C #, Java и Python изграждате линейно ограничение, като първо изграждате линейни изрази за лявата и дясната страна. В Java, която не поддържа претоварване от оператор, изграждате израз, както следва: След това използвате метода addConstr за обекта GRBModel, за да добавите ограничение, като използвате тези линейни изрази за лявата и дясната страна:

За C ++, C # и Python стандартните математически оператори като +, *, GRBoptimize в C, model.optimize в C ++, Java и Python или model.Optimize в C #). След това можете да заявите атрибута X на променливите, за да извлечете решението (и атрибута VarName, за да извлечете името на променливата за всяка променлива). В C атрибутът X се извлича по следния начин:

Когато отправяте заявки или модифицирате стойности на атрибути за масив от ограничения или променливи, обикновено е по-ефективно да изпълнявате действието върху целия масив наведнъж. Това е съвсем естествено в интерфейса C, където повечето атрибутни процедури вземат аргументи от масив. В интерфейсите C ++, C #, Java и Python можете да използвате методите get и set на обекта GRBModel, за да работите директно с масиви от стойности на атрибутите (getAttr/setAttr в Python). В примера за судоку Java това се прави по следния начин:

Трябва да посочим една важна тънкост в нашия интерфейс. Използваме подход за мързелива актуализация за изграждане и модифициране на модел. Когато правите промени, те се добавят към опашката. Опашката се изчиства само когато оптимизирате модела (или го запишете във файл). В необичайната ситуация, в която искате да поискате информация за вашия модел, преди да го оптимизирате, трябва да извикате метода за актуализация, преди да направите заявката си.