使用Lingo求解最最佳化問題
介紹
Lingo是一款求解最最佳化問題的軟體,可以用於求解非線性規劃,也可以用於一些線性和非線性方程組的求解等,功能十分強大,是求解最佳化模型的最佳選擇。
最最佳化問題
首先介紹一下什麼是最最佳化問題。
最最佳化問題,即在所有可行的方案中選出使得目標最優的方案的實際問題。
最佳化問題的三要素是:
決策變數
約束條件
目標函式
數學規劃/函式最佳化問題的標準形式
最佳化問題分類
根據決策變數取值情況不同,分為
連續型
和
離散型
。
根據有無約束條件分為
無約束最佳化
和
帶約束最佳化
。
根據處理思想方法不同,分為
數學規劃
(函式最佳化問題)、組合最佳化、圖論與網路流、動態規劃、目標最佳化、模糊最佳化、隨機最佳化、對策與決策……
Lingo教程
求解LP問題
求解這樣一個問題,只需直接輸入如下程式碼,寫法基本與數學公式一直,不用改寫成標準形式
min
=
2
*
x1
+
3
*
x2
;
x1
+
x2
>
=
350
;
x1
>
=
100
;
2
*
x1
+
x2
<
=
600
;
點選 圖示執行:
可以看到直接識別出了問題型別,並找到了全域性最優解。
求解MILP問題
@free: 可正可負(預設大於等於0)
@gin:整數
求解IQP問題
⚠
一定
要在Lingo
選項
->
求解非線性
選單中勾選
二次規劃識別
!!否則會按照INLP問題求解,只能得出區域性最優解。
max
=
98
*
x1
+
277
*
x2
-
x1
^
2
-
0。3
*
x1
*
x2
-
2
*
x2
^
2
;
x1
+
x2
<
=
100
;
x1
<
2
*
x2
;
@
gin
(
x1
);@
gin
(
x2
);
運算子
算數運算子 + - * / ^
關係運算符 <(=) = >(=)
邏輯運算子
否定 #NOT#
相等 #EQ#
不等 #NE#
與 #AND#
或 #OR#
大於 #GT#
大於等於 #GE#
小於等於 #LE#
小於 #LT#
數學函式
@ABS(x) 絕對值
@SIN(x),@COS(x) 。。。 三角函式
@EXP(x) 返回
@LOG(x) 自然對數
@SIGN(x) x<0返回-1;否則返回1
@FLOOR(x) 返回x靠近0的整數部分,如@FLOOR(1。2)=1,@FLOOR(-2。3)=-2
金融函式
機率函式
@pbn(p,n,x) 二項分佈
@pcx(n,x) 卡方分佈
@pfd(n,d,x) F分佈
……
變數界定函式
Lingo變數預設是非負的
@bin(x) x=0或1
@bnd(L,x,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個之後的最小值
輸入輸出函式
@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學學
上一篇:魯棒線性規劃問題的建模及求解
下一篇:史上最簡單的二分查詢講解