Készítsen egy modellt


Következő: További modellezési elemek Fel: Túra példa Előző: Betöltés és megoldás a

Java Python


Készítsen egy modellt

A gurobi példák közül többen a semmiből építenek modelleket. Kezdjük azzal, hogy kettőre koncentrálunk: mip1 és sos. Mindkettő nagyon egyszerű modellt épít az alapfolyamat szemléltetésére.

A modell felépítésének első lépése általában egy üres modell létrehozása. Ez a GRBnewmodel függvény használatával történik a C-ben: A modell létrehozásakor opcionálisan változókészletet is létrehozhat, valamint meghatározhatja ezeknek a változóknak a határokat, az objektív együtthatókat és a neveket. Ezek a példák külön-külön adnak hozzá új változókat.

A C ++, a C # és a Java alkalmazásban egy új modellt hoz létre a GRBModel konstruktor segítségével. A Java-ban ez így néz ki: A Pythonban az osztály neve Model, és a konstruktora hasonló a C ++ és a Java GRBModel konstruktorához.

A modell létrehozása után a következő lépés a változók hozzáadása. A C-ben a GRBaddvars függvényt használja egy vagy több változó hozzáadásához: A C ++, a Java és a Python esetében az addVar metódust használja a Model objektumon (AddVar a C # -ban). A Java-ban ez így néz ki: Az új változó alsó határa, felső határa, objektív együtthatója, típusa és neve argumentumként van megadva. A C ++ és a Python programokban elhagyhatja ezeket az argumentumokat, és használhatja az alapértelmezett értékeket; a részletekért lásd a Gurobi Reference Manual-t.

A következő lépés korlátozások hozzáadása a modellhez. A lineáris kényszereket a GRBaddconstr függvényen keresztül adjuk meg C-ben: Lineáris kényszer C-be történő hozzáadásához meg kell adnunk a változó indexek és együtthatók listáját a bal oldalon, a kényszer értelmét (pl. GRB_LESS_EQUAL) és jobb -oldali állandó. A korlátozásnak nevet is adhat; ha elhagyja a nevet, a Gurobi alapértelmezett nevet rendel a korlátozáshoz.

A C ++, a C #, a Java és a Python alatt lineáris kényszert hoz létre úgy, hogy először lineáris kifejezéseket épít a bal és a jobb oldalra. A Java-ban, amely nem támogatja az operátorok túlterhelését, a következőképpen állít össze egy kifejezést: Ezután az addConstr metódust használja a GRBModel objektumon, hogy a bal és a jobb oldali lineáris kifejezések segítségével korlátozást adjon hozzá:

C ++, C # és Python esetén a szokásos matematikai operátorok, például a +, *, GRBoptimize C, model.optimize C ++, Java és Python, vagy modell. Optimalizálás C #). Ezután lekérdezheti a változók X attribútumát a megoldás lekérésére (és a VarName attribútumot az egyes változók változónevének lekérésére). C-ben az X attribútumot a következőképpen kapjuk meg:

Amikor egy lekötéskor vagy egy korlátok vagy változók tömbjéhez tartozó attribútumértékeket lekérdezünk vagy módosítunk, általában hatékonyabb a műveletet egyszerre végrehajtani a teljes tömbön. Ez egészen természetes a C felületen, ahol az attribútum rutinok többsége tömb argumentumokat vesz fel. A C ++, C #, Java és Python interfészekben a get and set metódusokat használhatja a GRBModel objektumon az attribútumértékek tömbjeivel való közvetlen munkához (getAttr/setAttr in Python). A sudoku Java példában ez a következőképpen történik:

Ki kell emelnünk egy fontos finomságot a felületünkön. Lusta frissítési megközelítést alkalmazunk a modell felépítéséhez és módosításához. Amikor módosításokat hajt végre, azok hozzáadódnak egy sorhoz. A várakozási sor csak akkor kerül kiürülésre, ha optimalizálja a modellt (vagy fájlba írja). Abban a ritka helyzetben, amikor információkat szeretne keresni a modelljéről az optimalizálás előtt, a lekérdezés megkezdése előtt hívja meg a frissítési módszert.