第三天 c 中的cplex設計(初級)

2021-07-30 19:36:52 字數 2896 閱讀 7413

cplex 物件對於 c++ 應用程式為必需。

清楚地了解 c++ 物件是結合使用 concert technology 和 cplex 對優化模型進行構建和求解的基礎。 這些物件可分為兩個類別:

建模物件用於對優化問題進行定義。 一般情況下,應用程式建立多個建模物件來指定乙個優化問題。 這些物件分組在乙個表示完整優化問題的 ilomodel

物件中。

ilocplex

物件用於對已通過建模物件建立的問題進行求解。 ilocplex 物件讀取模型並將其資料抽取到 cplex 優化器的相應表示法中。 這樣,ilocplex 物件便準備就緒,可以對其所抽取的模型求解並接受查詢以獲取解法資訊。

一、構造環境:iloenv

類iloenv用於構造cplex環境,通常是建立的第乙個物件

iloenv env;

iloenv是控制代碼類,只是建立了乙個指標,可以:

iloenv env2=env;

程式結束時需要銷毀:

env.end();

二、建立模型

建立環境後,concert應用程式便準備好建立乙個或多個優化模型;

建模物件也稱為可抽取物件,因為在您將優化模型抽取到 ilocplex . 因此,通過被抽取到 ilocplex 之類的演算法的可能性來描述可抽取物件。 實際上,它們全部都是從類 iloextractable 繼承而來。 換言之,iloextractable 是可抽取物件或建模物件的所有類的基類。

最基本的可抽取物件類為 ilomodel。 該類的物件用於定義可在稍後抽取到 ilocplex 物件的完整優化模型。 您通過構造型別為 ilomodel 的物件來建立模型。 例如,為了在名為 env 的現有環境內構造名為 model 的建模物件,可編寫以下行:

ilomodel model(env);

構造 ilomodel 物件後,將使用用於定義優化模型的可抽取物件來對其進行填充。 此處最重要的類包括:

ilonumvar x1(env, 0.0, 40.0, ilofloat);

該定義建立下限為 0.0、上限為 40.0 且型別為 ilofloat(指示此變數為連續變數)的建模變數 x1。 其他可能的變數型別包括 iloint(針對整數變數)和 ilobool(針對布林型變數)。

對於優化模型中的每個變數,必須建立類 ilonumvar 的乙個對應物件。 concert technology 提供豐富的方法來幫助您構造所有 ilonumvar 物件。

構造所有建模變數之後,它們可用於構建表示式,這些表示式進而用於定義類 iloobjective 和 ilorange 的物件。

iloobjective obj = ilominimize(env, x1 + 2*x2 + 3*x3);

model.add(obj);

通過以下語句可一樣輕鬆地建立約束並將其新增到模型:

model.add(-x1 + x2 + x3 <= 20);
三、對模型求解

在 ilomodel 物件中建立了優化問題後,便應該建立 ilocplex 物件,以通過建立類 ilocplex 的例項來對問題求解。 例如,要建立名為 cplex 的物件,請編寫以下行:

ilocplex cplex(env);
再次使用環境 env 作為引數。 然後,可以使用 cplex 物件抽取要求解的模型。 抽取模型的一種方法是呼叫 cplex.extract(model)。 但是,有經驗的 concert 使用者採用一種快捷方法,此方法在一行中執行 cplex 物件的構造以及模型的抽取:

ilocplex cplex(model);
此快捷方法有用的原因是,建模物件 model 在其內部包含對名為 env 的環境的引用。

在該行之後,物件 cplex 便準備好對 model 所定義的優化問題進行求解。 要對模型求解,請呼叫:

cplex.solve ();
該方法會返回 ilobool 值,其中 ilotrue 指示 cplex 已成功找到可行(但不一定最優)的解法,而 ilofalse 指示未找到任何解法。 有關最後一次呼叫方法 ilocplex::solve 的結果的更準確資訊可通過呼叫以下內容來獲取:

cplex.getstatus ();
返回值告訴您 cplex 找到的有關模型的資訊:它找到最優解法還是僅找到可行解法;它證明模型無邊界還是不可行;或者此時是否尚未證明任何內容。 有關求解呼叫的終止的更詳細資訊可通過方法 ilocplex::getcplexstatus 獲取。

四、查詢結果

在成功對優化問題求解後,您可能對訪問解法感興趣。 以下方法用於查詢乙個變數或一組變數的解法值:

ilonum ilocplex::getvalue (ilonumvar var) const;

void ilocplex::getvalues (ilonumarray val,

const ilonumvararray var) const;

例如:

ilonum val1 = cplex.getvalue(x1);
將建模變數 x1 的解法值儲存到 val1 中。 提供了其他方法以用於查詢其他解法資訊。 例如,可使用以下示例來訪問解法的目標函式值:

ilonum objval = cplex.getobjvalue ();
五、處理錯誤

要在 concert technology 應用程式中從容地處理異常,可在乙個 try/catch 子句中包含所有**,如以下所示:

iloenv env;

try catch (iloexception& e) catch (...)

env.end();

C 學習第三天

一些基礎就可以略過了,看書不能太呆板。如果把一本書看完了,剩下的就是在實際專案中進行整合,訓練,然後整理成筆記。每天敲點程式,記點筆記。變數作用域 include include include std string s1 hello 全域性int main 結果 hello world 42 wo...

第三天 c 學習

1 void my function const a 常引用 目的是為了使得實參不可以被修改 2 函式過載 函式引數預定義值會產生二義性 3 public 類的內外部都可以被訪問 porivate 只能在類的內部被訪問 protected 用在類的內部 繼承 4 析構 先建立的物件後析構,遵循堆疊原...

C 學習第三天

今天是學習的第三天,主要學習內容如下 1.c 字符集 2.識別符號構成規則 3.c 資料型別 4.轉義字元 5.符號常量 6.基本算數運算子 7.符合算數運算子 寫 抄 了個程式 include 讓程式包含iostream類 using namespace std 開啟命名空間,使用iostream...