日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

求解器用戶手冊

優(yōu)化求解器的用戶手冊,介紹求解器的調(diào)用方式、如何輸入問題和求解器的APIs清單。

說明

由于本軟件APIs比較多,且還在高頻增加功能中,因此APIs的介紹會較多地引導(dǎo)至另一個《MindOpt用戶使用手冊——完整版》上查看細(xì)節(jié),給您帶來的不連貫閱讀體驗(yàn)敬請諒解。該文庫可以在頁面切換文檔語言和文檔版本。

優(yōu)化求解器調(diào)用方式

在使用之前,請先下載和安裝求解器SDK,并獲取使用權(quán)限,見快速入門(開通和使用)求解器SDK下載和安裝

下面列出簡單的示例,求解器細(xì)節(jié)的調(diào)用方式和完整案例可查看更多

命令行調(diào)用示例:

Linux以及macOS下,假設(shè)用戶根據(jù)安裝文檔將MindOpt安裝到環(huán)境變量$MINDOPT_HOME指定目錄:

mindopt $MINDOPT_HOME/examples/data/afiro.mps

Windows下

mindopt %MINDOPT_HOME%\examples\data\afiro.mps

C/C++/C#/Java/Python/MATLAB語言調(diào)用示例:

說明

V1.x的API與V0.x的API大部分都不相同。請關(guān)注自己使用的版本。

V1.x.x

env = mindoptpy.Env()
env.start()
model = mindoptpy.read(filename, env)
model.optimize()
print(f"Optimal objective value is: {model.objval}")
for v in x:
    print(f"{v.VarName} = {v.X}")
MDOEnv env = new MDOEnv();
MDOModel model = new MDOModel(env, filename);
model.optimize();
System.out.println("Optimal objective value is: " + model.get(MDO.DoubleAttr.ObjVal));
MDOVar[] x = model.getVars();
for (int i = 0; i < x.length; ++i) {
    System.out.println(x[i].get(MDO.StringAttr.VarName) + " = " + x[i].get(MDO.DoubleAttr.X));
}
MDOEnv env = MDOEnv();
MDOModel model = MDOModel(env, filename);
model.optimize();
std::cout << "Optimal objective value is: " << model.get(MDO_DoubleAttr_ObjVal) << std::endl;
std::vector<MDOVar> vars = model.getVars();
for (auto v : vars) {
    std::cout << v.get(MDO_StringAttr_VarName) << " = " << v.get(MDO_DoubleAttr_X) << std::endl;
}
MDOenv* env;
MDOemptyenv(&env);
MDOstartenv(env);
MDOmodel* model;
double obj;

MDOreadmodel(env, argv[1], filename);
MDOoptimize(model);
MDOgetdblattr(model, MDO_DBL_ATTR_OBJ_VAL, &obj);
printf("Optimal objective value is: %f\n", obj);

/* Free the environment. */
MDOfreemodel(model);
MDOfreeenv(env);
MDOEnv env = new MDOEnv();
MDOModel model =new MDOModel(env, filename);
model.optimize();
Console.WriteLine($"Optimal objective value is: {model.Get(MDO.DoubleAttr.ObjVal)}");
MDOVar[] vars = model.GetVars();
for (int i = 0; i < vars.Length; i++)
{
    Console.WriteLine($"{vars[i].Get(MDO.StringAttr.VarName)} = {vars[i].Get(MDO.DoubleAttr.X)}");
}
model = mindopt_read(file);
result = mindopt(model);

for v=1:length(result.X)
    fprintf('%s %d\n', model.varnames{v}, result.X(v));
end
fprintf('Optimal objective value is: %e\n', result.ObjVal);

objval = result.ObjVal;

完整例子的代碼請查看更多


V0.x.x

# 方法1:從0.19.0版本開始引入新式的創(chuàng)建模型方式,云鑒權(quán)更快,消耗的并發(fā)度少
env = mindoptpy.MdoEnv()
model = mindoptpy.MdoModel(env)
model.read_prob(filename)
model.solve_prob()
model.display_results()

# 方法2:舊式的創(chuàng)建模型方式仍然支持
# model = mindoptpy.MdoModel()
# model.read_prob(filename)
# model.solve_prob()
# model.display_results()
//<dependency>
//    <groupId>com.alibaba.damo</groupId>
//    <artifactId>mindoptj</artifactId>
//    <version>[0.20.0,)</version>
//</dependency>
// load動態(tài)鏈接庫,如下:
Mdo.load("c:\\mindopt\\0.20.0\\win64_x86\\lib\\mindopt_0_20_0.dll");

// 方法1:從0.19.0版本開始引入新式的創(chuàng)建模型方式,云鑒權(quán)更快,消耗的并發(fā)度少
//Set up environment,放在程序初始化的時候進(jìn)行,例如MapReduce里的setup階段
MdoEnv env = new MdoEnv();
//create a model
MdoModel model = env.createModel();
model.readProb(filename)
model.solveProb();
model.displayResult();
model.free();
//JAVA SDK 需要手動釋放 env,放在程序結(jié)束的時候進(jìn)行,例如MapReduce里的cleanup階段
env.free();

// 方法2:舊式的創(chuàng)建模型方式仍然支持,但被標(biāo)記為過時,將在以后的版本中移除
/*
MdoModel model = new MdoModel();
model.readProb(filename)
model.solveProb();
model.displayResult();
*/
// 方法1:從0.19.0版本開始引入新式的創(chuàng)建模型方式,云鑒權(quán)更快,消耗的并發(fā)度少
using mindopt::MdoEnv;
MdoEnv env;
MdoModel model(env);
model.readProb(filename);
model.solveProb();
model.displayResults();

// 方法2:舊式的創(chuàng)建模型方式仍然支持
/*
MdoModel model;
model.readProb(filename);
model.solveProb();
model.displayResults();
*/
// 方法1:從0.19.0版本開始引入新式的創(chuàng)建模型方式,云鑒權(quán)更快,消耗的并發(fā)度少
MdoEnvPtr env;
MdoMdlPtr model;
Mdo_createEnv(&env);
Mdo_createMdlWithEnv(&model, env);
Mdo_readProb(model, filename);
Mdo_solveProb(model);
Mdo_displayResults(model);
Mdo_freeMdl(&model);
// C SDK 需要手動釋放 env
Mdo_freeEnv(&env);

// 方法2:舊式的創(chuàng)建模型方式仍然支持
/*
MdoMdlPtr model;
Mdo_createMdl(&model);
Mdo_readProb(model, filename);
Mdo_solveProb(model);
Mdo_displayResults(model);
Mdo_freeMdl(&model);
*/

完整例子的代碼請查看V0.x版本文檔

支持求解的優(yōu)化問題

當(dāng)前版本的求解器支持:

優(yōu)化問題的輸入方式

優(yōu)化問題支持3種輸入方式:文件輸入、數(shù)據(jù)建模APIs輸入、外部建模工具調(diào)用。

方式1:文件輸入

  • 支持 MPS 格式LP 格式,如 .mps.lp,以及對應(yīng)文件的壓縮文件如:.mps.gz.mps.bz2

  • 支持.dat-s格式, 如SDP問題示例。

  • 支持.qps格式,如QP問題數(shù)據(jù)。

  • mindoptampl模塊支持.nl格式文件輸入,如在命令行中輸入mindoptampl filename.nl

更詳細(xì)的介紹請查看更多

方式2:建模APIs輸入

說明

V1.x的API與V0.x的API大部分都不相同。請關(guān)注自己使用的版本。

V1.x.x

相關(guān)聯(lián)的APIs有多種,同一個數(shù)據(jù)也可以有多種輸入方式。

  • 按行輸入Python示例簡述:

    • mindoptpy.Model.modelsense = MDO.MINIMIZE 將目標(biāo)函數(shù)設(shè)置為最小化;

    • mindoptpy.Model.addVar() 來添加優(yōu)化變量,并分別定義其下界、上界、目標(biāo)系數(shù)、名稱和類型;

    • mindoptpy.Model.addConstrs() 來添加約束。

  • 按列輸入Python示例簡述:

    • mindoptpy.Model.modelsense = MDO.MAXIMIZE 將目標(biāo)函數(shù)設(shè)置為最小化;

    • 開始時調(diào)用 mindoptpy.Model.addConstrs() 來創(chuàng)建帶有指定的左側(cè)和右側(cè)值的約束(無非零元素);

    • 創(chuàng)建臨時的列對象 mindoptpy.Model.Column() 來按順序地保存約束和非零元素的值;

    • 最后調(diào)用 mindoptpy.Model.addVar() 來創(chuàng)建新的變量,及其相應(yīng)的目標(biāo)函數(shù)系數(shù)、列向量中的非零元、下界和上界、變量名以及變量類型。

更詳細(xì)的介紹請查看更多。其中,屬性描述(Attributes)列表見更多,且API章節(jié)有對應(yīng)語言的完整例子。


V0.x.x

相關(guān)聯(lián)的APIs有多種,同一個數(shù)據(jù)也可以有多種輸入方式。

  • 按行輸入Python示例簡述:

    • mindoptpy.MdoModel.set_int_attr() 將目標(biāo)函數(shù)設(shè)置為最小化;

    • mindoptpy.MdoModel.add_var() 來添加四個優(yōu)化變量,并分別定義其下界、上界、名稱和類型;

    • mindoptpy.MdoModel.add_cons() 來添加約束。

  • 按列輸入Python示例簡述:

    • mindoptpy.MdoModel.set_int_attr() 將目標(biāo)函數(shù)設(shè)置為最小化;

    • 開始時調(diào)用 mindoptpy.MdoModel.add_cons() 來創(chuàng)建帶有指定的左側(cè)和右側(cè)值的約束(無非零元素);

    • 創(chuàng)建臨時的列對象 mindoptpy.MdoCol() 來按順序地保存約束和非零元素的值;

    • 最后調(diào)用 mindoptpy.MdoModel.add_var() 來創(chuàng)建新的變量,及其相應(yīng)的目標(biāo)函數(shù)系數(shù)、列向量中的非零元、下界和上界、變量名以及變量類型。

更詳細(xì)的介紹請查看更多V0版文檔。其中,模型的屬性描述(Model Attributes)列表見更多V0版文檔

方式3:建模語言 MindOpt APL、 AMPL、Pyomo、PuLP、JuMP

說明

采用建模語言的好處是用建模語言的API來建模,可以方便切換不同版本求解器。

MindOpt支持一些常見的建模工具,當(dāng)前支持以下幾種:

1. MindOpt APL

2022年開始支持MindOpt APL建模語言,是MindOpt團(tuán)隊自研的一款建模語言。

  • 可免費(fèi)在MindOpt云上建模求解平臺通過瀏覽器使用建模語言和求解器,還包含案例,供快速入門。使用時,無需安裝任何軟件,打開瀏覽器即可使用。

  • 語法文檔見鏈接

2. AMPL

使用 AMPL 調(diào)用 MindOpt 之前需要先安裝 MindOpt 和 AMPL 。mindoptampl 應(yīng)用位于安裝包的\bin\mindoptampl。mindoptampl 提供了一些可配置的參數(shù),用戶可以通過 AMPL 的option命令設(shè)置 mindoptampl_options 參數(shù),如:

ampl: option mindoptampl_options 'numthreads=4 maxtime=1e+4';

更詳細(xì)的介紹和案例請查看更多

3. Pyomo

使用 Pyomo 調(diào)用 MindOpt 之前需要先安裝 MindOpt 和 Pyomo。調(diào)用 MindOpt 求解器的 Pyomo API 需要使用接口文件 mindopt_pyomo.py。 MindOpt 的 Pyomo 接口是繼承自 Pyomo 的 DirectSolver 類,實(shí)現(xiàn)代碼在安裝包的\lib\pyomo\mindopt_pyomo.py。在 Python 代碼中導(dǎo)入該文件:

from mindopt_pyomo import MindoDirect

更詳細(xì)的介紹和案例請查看更多

4. PuLP

使用 PuLP 調(diào)用 MindOpt 之前需要先安裝 MindOpt 和 PuLP。調(diào)用 MindOpt 求解器的 PuLP API 需要使用接口文件 mindopt_pulp.py。 MindOpt 的 PuLP 接口繼承自 PuLP 的 LpSolver 類,實(shí)現(xiàn)代碼在安裝包的\lib\pulp\mindopt_pulp.py。在 Python 代碼中導(dǎo)入該文件:

from mindopt_pulp import MINDOPT

更詳細(xì)的介紹和案例請查看更多

5. JuMP

JuMP 是一個基于 Julia 編程語言的開源建模工具。使用 JuMP 調(diào)用 MindOpt 之前需要先安裝 MindOpt、Julia、JuMP、AmplNLWriter。調(diào)用JuMP API來創(chuàng)建建模對象,并指定使用mindoptampl作為求解器。

model = Model(() -> AmplNLWriter.Optimizer(mindoptampl))

更詳細(xì)的介紹和案例請查看更多

求解時的參數(shù)設(shè)置

運(yùn)行求解器可以設(shè)置輸入?yún)?shù),V1版文檔請參考參數(shù)章節(jié)。如設(shè)置求解器的最大求解時間"MaxTime"。V0版本文檔請參考可選輸入?yún)?shù)章節(jié)。

計算設(shè)備配置參考:LP求解時不同算法特性

配置機(jī)器資源時候,不同問題結(jié)構(gòu)、算法選擇,耗費(fèi)的機(jī)器資源會有差異,請根據(jù)需要測試選擇。

關(guān)于LP求解,當(dāng)前我們線性規(guī)劃(LP)的求解提供了Simplex(單純形法)、IPM(Interior Point Method,內(nèi)點(diǎn)法)、Concurrent(并發(fā)優(yōu)化)算法。在求解時候,執(zhí)行流程如下文的“執(zhí)行流程”圖片所示,會默認(rèn)選Concurrent,您可以通過設(shè)置“Method”參數(shù)來選擇算法。

這3種算法的區(qū)別如下:

Simplex(單純形法)

IPM(Interior Point Method,內(nèi)點(diǎn)法)

Concurrent(同時優(yōu)化)

特性

- 通常情況下對數(shù)值敏感低

- 耗費(fèi)內(nèi)存更少

- 支持Warm-start

- 對數(shù)值更敏感

- 比Simplex方法要多2~10倍的內(nèi)存

- 不支持Warm-start

- 對大規(guī)模的問題可能更適用

- 同時進(jìn)行兩個方法的優(yōu)化,耗費(fèi)的內(nèi)存更多

- 更魯棒

- 在求解新類別問題的時候,建議先用本方法來嘗試求解,幫助分辨Simplex或IPM方法哪種更合適,輔助后續(xù)算法選取

計算設(shè)備需求

不同問題可能有明顯差異,請以實(shí)測為準(zhǔn)。以下實(shí)驗(yàn)室的測試值供參考:

當(dāng)問題約束量為43200,非零元素為1038761時

測試最大內(nèi)存占用為350 MB

測試最大內(nèi)存占用為620 MB

測試最大內(nèi)存占用為920 MB

當(dāng)問題約束量為986069,非零元素為4280320時

測試最大內(nèi)存占用為1250 MB

測試最大內(nèi)存占用為1500 MB

測試最大內(nèi)存占用為1650 MB

當(dāng)問題約束量為4284,非零元素為11279748時

測試最大內(nèi)存占用為2050 MB

測試最大內(nèi)存占用為5200 MB

測試最大內(nèi)存占用為5200 MB

當(dāng)問題約束量為22117,非零元素為20078717時

測試最大內(nèi)存占用為3400 MB

測試最大內(nèi)存占用為5600 MB

測試最大內(nèi)存占用為8300 MB

說明

- 內(nèi)存的消耗取決于問題的形式、規(guī)模以及稀疏程度,如需提前預(yù)估內(nèi)存資源時,建議先通過問題的規(guī)模和稀疏程度來推算內(nèi)存消耗,再乘以一定的倍數(shù)作為內(nèi)存資源預(yù)留的預(yù)估值。

求解結(jié)果獲取

命令行運(yùn)行

命令行運(yùn)行求解時,會打印輸出求解過程輸出和結(jié)果的summary,同時會在求解的文件處生成同名結(jié)果文檔.bas.sol

如下圖示意運(yùn)行mindopt afiro.mps后,文件夾中生成了afiro.basafiro.sol文件,.bas文件保存的是基,.sol文件保存的是求解的最優(yōu)目標(biāo)值和變量值的解。

lQLPJwEdbd-17pzNAR7NApqwz0O66RW2UCEExUKi1cC7AA_666_286.png

API求解和獲取結(jié)果

說明

V1.x的API與V0.x的API大部分都不相同。請關(guān)注自己使用的版本。

V1.x.x

待求解的問題輸入后,可以調(diào)用optimize()的API來求解,如python的求解指令model.optimize()

求解完后,可以調(diào)用API來獲取結(jié)果,以Python為例:

  • 可以調(diào)用model.status獲取求解的狀態(tài)。有UNKNOWN、OPTIMAL、INFEASIBLE、UNBOUNDED、INF_OR_UBD、SUB_OPTIMAL。如Python里的MDO.OPTIMAL

  • 可以用model.objval獲取目標(biāo)值。

    • 還可以調(diào)用model.getAttr(MDO.Attr.PrimalObjVal)來獲取其他的模型屬性值,類似地:

      • SolutionTime對應(yīng):總執(zhí)行時間(秒)

      • DualObjVal對應(yīng):對偶目標(biāo)值

      • ColBasis對應(yīng):原始解的基

  • 可以調(diào)用var.X來變量的解。

  • 更多解的屬性描述(Attributes)列表見更多

完整的代碼示例可參考安裝包的example文件夾,或文檔更多,和各個語言API文檔最后一章,如Python的examples


V0.x.x

待求解的問題輸入后,可以調(diào)用solveProb的API來求解,如python的求解指令model.solve_prob()

求解完后,可以調(diào)用API來獲取結(jié)果,以Python為例:

  • 可以調(diào)用model.display_results()來打印結(jié)果。

  • 可以調(diào)用model.get_status()獲取求解的狀態(tài)。

  • 可以調(diào)用model.get_real_attr("PrimalObjVal")來獲取原始目標(biāo)值,類似地:

    • "DualObjVal"對應(yīng):對偶目標(biāo)值

    • "PrimalSoln"對應(yīng):原始解

    • "ColBasis"對應(yīng):原始解的基

    • 更多解的屬性描述(Solution Attributes)列表在更多V0版本文檔

完整的代碼示例可參考安裝包的example文件夾或文檔。

求解輔助分析工具、高級建模技巧

約束不可行性分析

在建模求解過程中,會遇到由于某些約束互相沖突導(dǎo)致問題不可行(infeasible)的情況,分析不可行問題并識別出導(dǎo)致約束沖突的關(guān)鍵約束能有效幫助建模。這類導(dǎo)致問題不可行的最小約束子集被稱為不可約不可行系統(tǒng)(IIS, irreduciable infeasible system)。

MindOpt 設(shè)計了用來計算IIS的API,當(dāng)問題"INFEASIBLE"時,用戶可以通過 compute IIS 的API來對不可行問題進(jìn)行分析,如可依據(jù)此對IIS中的約束進(jìn)行修正或移除,使得優(yōu)化問題變得可行。

IIS的Python接口調(diào)用示例如下:

V1.x.x

if model.status == MDO.INFEASIBLE or model.status == MDO.INF_OR_UBD:
    idx_rows, idx_cols = model.compute_iis()

完整的 compute IIS 的說明請參閱更多


V0.x.x

status_code, status_msg = model.get_status()
if status_msg == "INFEASIBLE":
    idx_rows, idx_cols = model.compute_iis()

完整的 compute IIS 的說明請參閱更多V0版文檔

回調(diào)功能 (Callback)

MindOpt使用經(jīng)典的分支定界法來求解MIP問題。MindOpt為用戶提供回調(diào)功能,幫助用戶對MIP問題的求解過程進(jìn)行跟蹤與修改。利用回調(diào)功能,用戶可以提供一些決策以修改求解過程,包括:

  • 添加割平面,裁剪不會出現(xiàn)最優(yōu)解的分支;

  • 干預(yù)MindOpt的分支選擇策略,控制節(jié)點(diǎn)二分方法及遍歷順序;

  • 添加自定義可行解(比如通過某種啟發(fā)式算法得到的解),一個較好的可行解可以提高M(jìn)indOpt的求解效率。

可以如下方式建立回調(diào)函數(shù):

def callback(model, where):

完整的 Callback 說明請參閱更多

求解器調(diào)參

MindOpt Tuner也可以對求解器超參調(diào)優(yōu),提供業(yè)務(wù)場景的數(shù)據(jù),采用MindOpt Tuner,經(jīng)過調(diào)參后,可以得到一個業(yè)務(wù)場景定制的更快的求解器。目前部分功能在MindOpt云上平臺中可以使用。

AI工程師輔助建模

AI工程師是在LLM大模型的基礎(chǔ)上,結(jié)合特定領(lǐng)域軟件工具的知識,用于該領(lǐng)域基礎(chǔ)技術(shù)咨詢的一個AI機(jī)器人。MindOpt Copilot 是一款幫助用戶使用MindOpt技術(shù)解決“數(shù)學(xué)優(yōu)化”問題的AI工程師。可用于“數(shù)學(xué)優(yōu)化”領(lǐng)域的技術(shù)咨詢。

當(dāng)前,MindOpt Copilot AI工程師支持使用MindOpt Solver優(yōu)化求解器、MindOpt APL建模語言等工具,通過自然語言和表格數(shù)據(jù)溝通,自動根據(jù)用戶的業(yè)務(wù)問題進(jìn)行數(shù)學(xué)建模、列數(shù)學(xué)公式、碼代碼、調(diào)用MindOpt軟件來求解等工序。并且可以將機(jī)器人生成的文字、數(shù)學(xué)公式、代碼等,生成項目,快捷地導(dǎo)入開發(fā)項目進(jìn)行開發(fā)。

2023年9月首次上線,可在MindOpt云上平臺中可以使用。

其他功能

數(shù)據(jù)脫敏

MindOpt的命令行功能里有--sanitize 可進(jìn)行數(shù)據(jù)脫敏,方便外發(fā)數(shù)據(jù)用于技術(shù)交流或求解器調(diào)參改進(jìn)。其脫敏原理可以參考博客

求解器的執(zhí)行流程

MindOpt的執(zhí)行流程:

不同的優(yōu)化問題會有不同的求解方法,整體流程大致相同。以下是線性規(guī)劃LP問題的調(diào)用示例,過程中有參數(shù)可以由用戶選擇設(shè)定。

求解器執(zhí)行流程

完整APIs和調(diào)用方式

完整的說明請查閱《MindOpt用戶使用手冊——完整版》

目錄示意如下: