MindOpt APL:一款適合優化問題數學建模的編程語言

什么是建模語言

建模語言是一種描述信息或模型的編程語言,在運籌優化領域,一般是指代數建模語言。
比如要寫一個線性規劃問題的建模和求解,可以采用C、Python、Java等通用編程語言來實現計算機編程(碼代碼),也可以換采用建模語言。
本文將以阿里達摩院研發的MindOpt建模語言(MindOpt Algebra Programming Language, MindOptAPL,簡稱為MAPL)來講解。MAPL是一種高效且通用的代數建模語言,當前主要用于數學規劃問題的建模,并支持調用多種求解器求解。

代數建模語言工作原理

在數學規劃領域,遇到一個實際問題時候,我們需要數學建模成優化問題模型、然后編程、然后計算優化結果,得到這個實際問題的解決方案。
在這個編程過程中,可以根據選用的計算工具——優化求解器提供的通用編程語言的API來編寫代碼,也可以采用建模語言來編寫代碼。如下示例,就是一個利用MAPL建模語言來進行一個優化問題碼的代碼。
image.png

  • 左邊是數學模型,三要素:兩個變量xa和xb,目標函數是最大化一個公式,約束是最下面兩行,限定取值關系。
  • 中間是用MAPL建模語言編的代碼。可以看到前面4行就表達清楚了左邊的數學公式。最后“option solver mindopt;”是設置計算這個問題的求解器為mindopt求解器,“solve;”是執行求解。
  • 右邊就是求解器的計算結果,xa = 3,xb=5,此時目標函數最大,是1050。

為什么要用建模語言

語法更簡單(代碼對比)

從上面我們可以看到建模語言可以方便地進行數學建模和求解的代碼。這里我們對比一下建模語言和通用的編程語言,來看看用建模語言優勢。
以下面這個問題為示例:

| 線性規劃模型:
max x0 + 2 * x1 + 3 * x2 + x3
s.t. (-1) * x0 + x1 + 3 * x2 + 10 * x3 <= 20
x0 - 3 * x1 + x2 = 30
x1 - 3.5 * x3 = 0
0 ≤ x0 ≤ 40
0 ≤ x1
0 ≤ x2
2 ≤ x3 ≤ 3

我們使用 MindOpt APL 建模語言 和 MindOpt 求解器的 Python APIs,分別對上面的線性規劃模型建模,并求解模型。

MAPL代碼:

clear model;  #清除model,多次run的時候使用
option modelname test; #運行完代碼之后會自動生成.nl和.sol文件  model是存放的地址,test是文件名#--------------------------
# twoTask.mapl
var x0 >= 0;   # 聲明決策變量xa |
var x1 >= 0;
var x2 >= 0;
var x3 >= 2;
maximize Reward: x0 + 2 * x1 + 3 * x2 + x3;  # 聲明目標函數
subto c1: (-1) * x0 + x1 + 3 * x2 + 10 * x3 <= 20;       # 聲明約束
subto c2: x0 - 3 * x1 + x2 <= 30;
subto c3: x1 - 3.5 * x3 == 0;
subto c4: x0 <= 40;
subto c5: x3 <= 3;
#--------------------------option solver mindopt;     # (可選)指定求解用的求解器,默認是MindOpt
solve;         # 求解print "-----------------Display---------------";
display;        # 展示結果
print "目標函數值 = ",x0 + 2 * x1 + 3 * x2 + x3;

Python代碼:

from mindoptpy import *if __name__ == "__main__":# Step 1. Create model.model = Model("test")try:# Step 2. Input model.# Change to minimization problem.model.ModelSense = MDO.MAXIMIZE# Add variables.x = []x.append(model.addVar(0.0,         40.0, 1.0, 'C', "x0"))x.append(model.addVar(0.0, float('inf'), 2.0, 'C', "x1"))x.append(model.addVar(0.0, float('inf'), 3.0, 'C', "x2"))x.append(model.addVar(2.0,          3.0, 1.0, 'C', "x3"))# Add constraints.model.addConstr(- 1.0 * x[0] + 1.0 * x[1] + 3.0 * x[2] + 10.0 * x[3] <= 20, "c1")model.addConstr(1.0 * x[0]              - 3.0 * x[1] + x[2] <= 30, "c2")model.addConstr(1.0 * x[1]              - 3.5 * x[3] == 0, "c3")# Step 3. Solve the problem and populate optimization result.model.optimize()if model.status == MDO.OPTIMAL:print(f"Optimal objective value is: {model.objval}")print("Decision variables: ")for v in x:print(f"x[{v.VarName}] = {v.X}")else:print("No feasible solution.")except MindoptError as e:print("Received Mindopt exception.")print(" - Code          : {}".format(e.errno))print(" - Reason        : {}".format(e.message))except Exception as e:print("Received other exception.")print(" - Reason        : {}".format(e))finally:# Step 4. Free the model.model.dispose()

從上面的例子可以看到,MAPL建模語言比較簡潔,沒有Python運行這么多復雜的創建、添加、異常捕捉和釋放的過程,就聚焦在編個模型去求解計算,更易于理解和添加。上面的例子還只是線性規劃,對于非線性規劃的問題,Python的API會更復雜。而采用MAPL建模語言只需要表達清楚數學公式,對于調試模型修改更方便。

支持多種求解器,換求解器的時候不用重復編程

很多人選擇建模語言,最大的原因是希望切換求解器方案。因為不同品牌的求解器的求解能力不一樣,遇到一個問題數學模型調整了一行公式,可能之前選擇的求解器就不支持了,需要更換求解器。
此時如果選擇用各家求解器的API來編程,換一個求解器,就需要重新學習對應的API,重新碼代碼,維護起來困難。雖然業界也有通用的 .mps 和 .nl 的優化問題數據格式,但是熟悉不同求解器的調用數據計算的方法也很耗時,或者裝對應的軟件也很麻煩。這個時候,建模語言的優勢就很大。

比如下面是MAPL代碼中,只需要換一行,就能換求解器進行計算:

option solver highs;     # 更換求解器

更多MAPL支持的求解器,可以參考上一個博客MindOpt APL,可以支持調用幾十種求解器的建模語言

建模語言也支持通用編程語言的API,如Python

有很多同學喜歡Python語言,更希望用Python編程。MAPL建模語言支持Python來調用,import maplpy后就用Python的方式來編代碼,能繼續享受一行代碼換求解器的優良屬性。可一看廣告流量分配:曝光和轉化均衡案例中的代碼對比。

常見的建模語言

市面上的建模語言有很多個,需要看各家求解器支持的建模語言,比如MindOpt求解器支持如下4種建模語言:MAPL(MindOpt APL)、AMPL、Pyomo、PuLP。
image.png
其中MindOpt APL(MAPL)就是阿里達摩院自研的建模語言,是目前中國唯一一款代數建模語言。其他建模語言的描述大家可以點擊上面的鏈接查看:https://opt.aliyun.com/platform/docs/htmldoc/solver

MAPL的優點

MAPL國內第一款擁有自主知識產權,完全自研的國產建模語言,提供了豐富文檔學習以及案例參考。并且在電力SCUC等領域問題上建模性能優秀,對標或超越已有產品。對比AMPL等建模語言,部分語法上更靈活簡單,后續也會支持向量化建模等特色能力,提升建模易用性等。

靈活性:

MAPL具有非常高的靈活性,可以用來建模和求解各種類型的優化問題,包括線性規劃、整數規劃、非線性規劃等。它支持多種數學表達式和運算符,可以方便地表示復雜的數學關系和約束條件。如下是它支持數值計算。
在這里插入圖片描述

易用性

MAPL建模語言采用了類似于自然語言的語法和結構,使得用戶可以很容易地理解和編寫優化模型。并且支持讀寫csv文件,使得數據的讀取和寫入變得容易,數據儲存也很方便。
如下將結果print輸出為csv表格:
image.png

更多選擇

MAPL與MindOpt Studio平臺集成,可以在線上環境使用,無需下載,并且支持調用多種求解器,可直接對比結果。還支持將輸出mps文件,可以在不同的計算環境和操作系統之間進行導入和導出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208422.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nodejs微信小程序+python+PHP的黃山旅游景點購票系統設計與實現-計算機畢業設計推薦

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

要求CHATGPT高質量回答的藝術:提示工程技術的完整指南—第 28 章:圣杯 = 專家 + ChatGPT 的協同作用

要求CHATGPT高質量回答的藝術&#xff1a;提示工程技術的完整指南—第 28 章&#xff1a;圣杯 專家 ChatGPT 的協同作用 ? 這就像是從 ChatGPT 或其他生成式人工智能中獲得高質量答案的圣杯。因為光知道怎么問&#xff08;提示工程技術&#xff09;還不夠&#xff0c;還要知…

harmonyOS開發技巧(二)——沉浸式以及狀態欄高

1. 設置沉浸式&#xff1a;win.setWindowLayoutFullScreen(true); 2. 獲取狀態欄的高&#xff1a;win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)以及win.on(avoidAreaChange, (data) > {})。 import UIAbility from ohos.app.ability.UIAbility; import wind…

聯邦多任務蒸餾助力多接入邊緣計算下的個性化服務 | TPDS 2023

聯邦多任務蒸餾助力多接入邊緣計算下的個性化服務 | TPDS 2023 隨著移動智能設備的普及和人工智能技術的發展,越來越多的分布式數據在終端被產生與收集&#xff0c;并以多接入邊緣計算(MEC)的形式進行處理和分析。但是由于用戶的行為模式與服務需求的多樣,不同設備上的數據分布…

復亞消防無人機 智能守護浙江安防

在黨中央高度重視防災減災救災工作的背景下&#xff0c;浙江省深化消防救援保障體系建設&#xff0c;借助智慧消防舉措&#xff0c;提高了城市的戰勤保障能力。特別是在古城區&#xff0c;復亞助力浙江打造智慧消防系統&#xff0c;通過消防無人機全自動飛行系統&#xff0c;成…

ALTERNET STUDIO 9.1 Crack

ALTERNET STUDIO 9.1 發布 宣布 AlterNET Studio 9.1 版本今天上線。AlterNET Studio 9.0 是一個中期更新&#xff0c;重點是改進我們所有的組件庫。 以下是 AlterNET Studio 9.1 的發布亮點&#xff1a; Roslyn C# 和 Visual Basic 解析器現在支持代碼修復/代碼重構。 代碼修復…

全景萬店通打造掌上智慧生活助手,助力店鋪全景引流

隨著網絡經濟的崛起&#xff0c;新一代的消費群體的消費習慣逐漸變得富有個性化&#xff0c;因此他們對于傳統的營銷方式具有視覺疲勞&#xff0c;傳統廣告的效果也越發微小&#xff0c;但是請明顯來代言&#xff0c;成本又十分高昂&#xff0c;那么還有什么引流好方法呢&#…

MySQL之數據庫的創建指令

創建數據庫 #創建數據庫指令&#xff1a; CREATE DATABASE hsp_db1 #創建名字為關鍵字的數據庫&#xff0c;為規避關鍵字&#xff0c;可以使用反引號 CREATE DATABASE CREATE#刪除數據庫指令&#xff1a; DROP DATABASE hsp_db1 DROP DATABASE CREATE如果不指定在這里插入代碼片…

Linux--學習記錄(2)

解壓命令&#xff1a; gzip命令&#xff1a; 參數&#xff1a; -k&#xff1a;待壓縮的文件會保留下來&#xff0c;生成一個新的壓縮文件-d&#xff1a;解壓壓縮文件語法&#xff1a; gzip -k pathname(待壓縮的文件夾名)gzip -kd name.gz&#xff08;待解壓的壓縮包名&#x…

Python中的深拷貝和淺拷貝的區別

目錄 一、深拷貝和淺拷貝的概念 二、Python中的深拷貝和淺拷貝實現 三、深拷貝和淺拷貝的區別及適用場景 四、如何選擇深拷貝和淺拷貝 五、總結 在Python中&#xff0c;深拷貝和淺拷貝是非常重要的概念&#xff0c;它們在處理對象和數據結構時有著截然不同的行為。理解深拷…

MySQL-DATE_FORMAT()函數

在 SQL 中&#xff0c;DATE_FORMAT() 函數是用于將日期時間值格式化為指定格式的函數。它允許你根據自己的需求將日期時間值轉換成各種不同的字符串表示形式。以下是 DATE_FORMAT() 函數的用法和示例&#xff1a; DATE_FORMAT() 函數的基本用法&#xff1a; DATE_FORMAT() 函…

概率測度理論方法(第 2 部分)

一、說明 歡迎回到這個三部曲的第二部分&#xff01;在第一部分中&#xff0c;我們為測度論概率奠定了基礎。我們探索了測量和可測量空間的概念&#xff0c;并使用這些概念定義了概率空間。在本文中&#xff0c;我們使用測度論來理解隨機變量。 作為一個小回顧&#xff0c;在第…

Azure云WAF服務的CRS規則和DRS規則區別

在Azure中&#xff0c;WAF&#xff08;Web Application Firewall&#xff09;是一種用于保護 Web 應用程序免受常見 Web 攻擊的服務。WAF 支持兩種類型的規則&#xff1a;CRS&#xff08;Core Rule Set&#xff09;規則和 DRS&#xff08;Default Rule Set&#xff09;規則。以…

Docker安裝Mysql數據庫

1. 前言 XXXXX 2. Docker中安裝MySQL服務 以下以mysql8.2版本為例&#xff0c;mysql5.7的步驟也是一樣的 2.1. 查看可用的MySQL版本 # 搜索鏡像 docker search mysql2.2. 拉取MySQL鏡像 # 拉取鏡像 docker pull mysql# 或者 docker pull mysql:latest2.3. 查看本地鏡像 …

淺談linux緩沖區的認識!

今天來為大家分享一波關于緩沖區的知識&#xff01;那么既然我們要談緩沖區&#xff0c;那么就得從是什么&#xff1f;為什么&#xff1f;有什么作用這幾個方面來談論一下緩沖區&#xff01;然后再通過一些代碼來更加深刻的理解緩沖區的知識&#xff01; 引言&#xff1a; 是…

【C++ Primer Plus學習記錄】邏輯表達式

一、邏輯OR運算符&#xff1a;|| 如果表達式中的任何一個或全部都為true&#xff08;或非零&#xff09;&#xff0c;則得到的表達式的值為true&#xff1b;否則&#xff0c;表達式的值為false。 ||的優先級比關系運算符低。 C規定&#xff0c;||運算符是個順序點。即&#…

Navicat 技術指引 | 適用于 GaussDB 分布式的日志查詢與配置設置

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

文獻計量學方法與應用、主題確定、檢索與數據采集、VOSviewer可視化繪圖、Citespace可視化繪圖、R語言文獻計量學繪圖分析

目錄 一、文獻計量學方法與應用簡介 二、主題確定、檢索與數據采集 三、VOSviewer可視化繪圖 四、Citespace可視化繪圖 五、R語言文獻計量學繪圖分析 六、論文寫作 七、論文投稿 更多應用 文獻計量學是指用數學和統計學的方法&#xff0c;定量地分析一切知識載體的交叉…

AWS攻略——使用中轉網關(Transit Gateway)連接不同區域(Region)VPC

文章目錄 Peering方案Transit Gateway方案環境準備創建Transit Gateway Peering Connection接受邀請修改中轉網關路由修改被邀請方中轉網關路由修改邀請方中轉網關路由 測試修改Public子網路由 知識點參考資料 區別于 《AWS攻略——使用中轉網關(Transit Gateway)連接同區域(R…

C++_函數重載

前言&#xff1a; 函數重載的意思就是可以有多個同名函數存在&#xff0c;但是這些同名函數的參數列表有著不同情形&#xff0c;以便區分。在C中&#xff0c;支持在同一作用域下可以聲明、定義多個同名函數&#xff0c;但是這些函數的形參類型&#xff0c;類型順序以及參數個數…