国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MindOpt APL:一款適合優(yōu)化問題數(shù)學(xué)建模的編程語言

這篇具有很好參考價值的文章主要介紹了MindOpt APL:一款適合優(yōu)化問題數(shù)學(xué)建模的編程語言。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

什么是建模語言

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

代數(shù)建模語言工作原理

在數(shù)學(xué)規(guī)劃領(lǐng)域,遇到一個實際問題時候,我們需要數(shù)學(xué)建模成優(yōu)化問題模型、然后編程、然后計算優(yōu)化結(jié)果,得到這個實際問題的解決方案。
在這個編程過程中,可以根據(jù)選用的計算工具——優(yōu)化求解器提供的通用編程語言的API來編寫代碼,也可以采用建模語言來編寫代碼。如下示例,就是一個利用MAPL建模語言來進(jìn)行一個優(yōu)化問題碼的代碼。
MindOpt APL:一款適合優(yōu)化問題數(shù)學(xué)建模的編程語言,數(shù)學(xué)建模

  • 左邊是數(shù)學(xué)模型,三要素:兩個變量xa和xb,目標(biāo)函數(shù)是最大化一個公式,約束是最下面兩行,限定取值關(guān)系。
  • 中間是用MAPL建模語言編的代碼??梢钥吹角懊?行就表達(dá)清楚了左邊的數(shù)學(xué)公式。最后“option solver mindopt;”是設(shè)置計算這個問題的求解器為mindopt求解器,“solve;”是執(zhí)行求解。
  • 右邊就是求解器的計算結(jié)果,xa = 3,xb=5,此時目標(biāo)函數(shù)最大,是1050。

為什么要用建模語言

語法更簡單(代碼對比)

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

| 線性規(guī)劃模型:
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,分別對上面的線性規(guī)劃模型建模,并求解模型。

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;  # 聲明目標(biāo)函數(shù)
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;     # (可選)指定求解用的求解器,默認(rèn)是MindOpt
solve;         # 求解

print "-----------------Display---------------";
display;        # 展示結(jié)果
print "目標(biāo)函數(shù)值 = ",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運行這么多復(fù)雜的創(chuàng)建、添加、異常捕捉和釋放的過程,就聚焦在編個模型去求解計算,更易于理解和添加。上面的例子還只是線性規(guī)劃,對于非線性規(guī)劃的問題,Python的API會更復(fù)雜。而采用MAPL建模語言只需要表達(dá)清楚數(shù)學(xué)公式,對于調(diào)試模型修改更方便。

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

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

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

option solver highs;     # 更換求解器

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

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

有很多同學(xué)喜歡Python語言,更希望用Python編程。MAPL建模語言支持Python來調(diào)用,import maplpy后就用Python的方式來編代碼,能繼續(xù)享受一行代碼換求解器的優(yōu)良屬性??梢豢磸V告流量分配:曝光和轉(zhuǎn)化均衡案例中的代碼對比。

常見的建模語言

市面上的建模語言有很多個,需要看各家求解器支持的建模語言,比如MindOpt求解器支持如下4種建模語言:MAPL(MindOpt APL)、AMPL、Pyomo、PuLP。
MindOpt APL:一款適合優(yōu)化問題數(shù)學(xué)建模的編程語言,數(shù)學(xué)建模
其中MindOpt APL(MAPL)就是阿里達(dá)摩院自研的建模語言,是目前中國唯一一款代數(shù)建模語言。其他建模語言的描述大家可以點擊上面的鏈接查看:https://opt.aliyun.com/platform/docs/htmldoc/solver

MAPL的優(yōu)點

MAPL國內(nèi)第一款擁有自主知識產(chǎn)權(quán),完全自研的國產(chǎn)建模語言,提供了豐富文檔學(xué)習(xí)以及案例參考。并且在電力SCUC等領(lǐng)域問題上建模性能優(yōu)秀,對標(biāo)或超越已有產(chǎn)品。對比AMPL等建模語言,部分語法上更靈活簡單,后續(xù)也會支持向量化建模等特色能力,提升建模易用性等。

靈活性:

MAPL具有非常高的靈活性,可以用來建模和求解各種類型的優(yōu)化問題,包括線性規(guī)劃、整數(shù)規(guī)劃、非線性規(guī)劃等。它支持多種數(shù)學(xué)表達(dá)式和運算符,可以方便地表示復(fù)雜的數(shù)學(xué)關(guān)系和約束條件。如下是它支持?jǐn)?shù)值計算。
MindOpt APL:一款適合優(yōu)化問題數(shù)學(xué)建模的編程語言,數(shù)學(xué)建模

易用性

MAPL建模語言采用了類似于自然語言的語法和結(jié)構(gòu),使得用戶可以很容易地理解和編寫優(yōu)化模型。并且支持讀寫csv文件,使得數(shù)據(jù)的讀取和寫入變得容易,數(shù)據(jù)儲存也很方便。
如下將結(jié)果print輸出為csv表格:
MindOpt APL:一款適合優(yōu)化問題數(shù)學(xué)建模的編程語言,數(shù)學(xué)建模

更多選擇

MAPL與MindOpt Studio平臺集成,可以在線上環(huán)境使用,無需下載,并且支持調(diào)用多種求解器,可直接對比結(jié)果。還支持將輸出mps文件,可以在不同的計算環(huán)境和操作系統(tǒng)之間進(jìn)行導(dǎo)入和導(dǎo)出。文章來源地址http://www.zghlxwxcb.cn/news/detail-792098.html

到了這里,關(guān)于MindOpt APL:一款適合優(yōu)化問題數(shù)學(xué)建模的編程語言的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包