您當前的位置:首頁 > 歷史

使用Lingo求解最最佳化問題

作者:由 江風引雨 發表于 歷史時間:2020-09-15

介紹

Lingo是一款求解最最佳化問題的軟體,可以用於求解非線性規劃,也可以用於一些線性和非線性方程組的求解等,功能十分強大,是求解最佳化模型的最佳選擇。

使用Lingo求解最最佳化問題

最最佳化問題

首先介紹一下什麼是最最佳化問題。

最最佳化問題,即在所有可行的方案中選出使得目標最優的方案的實際問題。

最佳化問題的三要素是:

決策變數

約束條件

目標函式

數學規劃/函式最佳化問題的標準形式

\min/ \max f(x)\\ s.t. g_i(x)\leq0,i=1,\dots,m_1\\  h_j(x)=0,j=1,\dots,m_2\\  f:D \rightarrow R,D \subseteq R^n

使用Lingo求解最最佳化問題

最佳化問題分類

根據決策變數取值情況不同,分為

連續型

離散型

根據有無約束條件分為

無約束最佳化

帶約束最佳化

根據處理思想方法不同,分為

數學規劃

(函式最佳化問題)、組合最佳化、圖論與網路流、動態規劃、目標最佳化、模糊最佳化、隨機最佳化、對策與決策……

Lingo教程

求解LP問題

\min=2x_1+3x_2\\ s.t. x_1+x_2 \geq 350\ x_1 \geq 100\\ 2*x_1+x_2 \leq 600

求解這樣一個問題,只需直接輸入如下程式碼,寫法基本與數學公式一直,不用改寫成標準形式

min

=

2

*

x1

+

3

*

x2

x1

+

x2

>

=

350

x1

>

=

100

2

*

x1

+

x2

<

=

600

點選 圖示執行:

使用Lingo求解最最佳化問題

可以看到直接識別出了問題型別,並找到了全域性最優解。

求解MILP問題

使用Lingo求解最最佳化問題

@free: 可正可負(預設大於等於0)

@gin:整數

求解IQP問題

一定

要在Lingo

選項

->

求解非線性

選單中勾選

二次規劃識別

!!否則會按照INLP問題求解,只能得出區域性最優解。

使用Lingo求解最最佳化問題

max

=

98

*

x1

+

277

*

x2

-

x1

^

2

-

0。3

*

x1

*

x2

-

2

*

x2

^

2

x1

+

x2

<

=

100

x1

<

2

*

x2

@

gin

x1

);@

gin

x2

);

使用Lingo求解最最佳化問題

運算子

算數運算子 + - * / ^

關係運算符 <(=) = >(=)

邏輯運算子

否定 #NOT#

相等 #EQ#

不等 #NE#

與 #AND#

或 #OR#

大於 #GT#

大於等於 #GE#

小於等於 #LE#

小於 #LT#

數學函式

@ABS(x) 絕對值

@SIN(x),@COS(x) 。。。 三角函式

@EXP(x) 返回

e^x

@LOG(x) 自然對數

@SIGN(x) x<0返回-1;否則返回1

@FLOOR(x) 返回x靠近0的整數部分,如@FLOOR(1。2)=1,@FLOOR(-2。3)=-2

金融函式

@fpa(r,n)=\sum_{k=1}^n{\frac{1}{\left( 1+r \right) ^k}=}\frac{1-\left( 1+r \right) ^{-n}}{r}

@fpl(r,n)=\left( 1+r \right) ^{-n}

機率函式

@pbn(p,n,x) 二項分佈

@pcx(n,x) 卡方分佈

@pfd(n,d,x) F分佈

……

變數界定函式

Lingo變數預設是非負的

@bin(x) x=0或1

@bnd(L,x,U)

L \le x \le U

free(x) 實數

@gin(x) 整數

條件判斷函式

@IF(logical_condition,true_result,false_result)

例:分段函式

f\left( x \right) =\begin{cases} 100,x>0\ 2x, x\le 0\ \end{cases}

fx=@if(x #gt# 0,100,2*x)

集合操作函式

@in(set_name,index_1[,index_2]) 是否在集合中,返回0/1

@wrap(index,limit) 取模,返回 j=index-k*limit=index(mod limit) +1, k為整數,保證j在[1, limit]內

@size(set_name) 集合成員個數

集合迴圈函式

@FOR(set_name:constraint_expressions) 對每個元素生成約束

@MAX(set_name:expressions) 表示式的最大值

@MIN(set_name:expressions) 表示式的最小值

@SUM(set_name:expressions) 表示式的和

例:產生序列{1,4,9,16,25}

model: sets: number/1。。5/:x; endsets @for(number(i):x(i)=i^2); end

例:

matlab s=@sum(number(i)|i#le# 5: x); !前5個求和 m=@min(number(i)|i#ge# 5: x); !5個之後的最小值

使用Lingo求解最最佳化問題

輸入輸出函式

@OLE excel表格讀取

@file

@text

求解狀態

@status()

0 Global Optimum 全域性最優

1 Infeasible 不可行

2 Unbounded 無界

3 Undetermined 不確定

4 Feasible 可行

5 Infeasible or Unbounded

6 Local Optimum 區域性最優

7 Locally Infeasible 區域性不可行(可行解可能存在,但lingo沒找到)

8 Cutoff 目標函式的截斷值被達到

9 Numeric Error 算數錯誤

Lingo建模技巧

儘量使用實數最佳化,減少整數約束和整數變數

儘量使用光滑最佳化,少用絕對值、符號函式、多變數求最大/最小值、四捨五入、取整等

儘量使用線性模型,x/y<5改為x<5y

合理設定上下界,儘可能給出變數初始值

引數數量級適當,不同引數數量級差距一般要求小於3

原文地址:

ps。 知乎的markdown支援也太差了吧,公式識別不了,圖片屢屢上傳失敗,這點真該跟隔壁csdn學學

標簽: x1  x2  求解  函式  最佳化