Lingo解決優化問題
@
前言
前面,我們已經對Lingo有了一定的了解,但是要想真正的熟悉Lingo在解決優化問題中的強大之處,還需要不斷加強相關訓練,本文主要是使用Lingo來解決優化問題,該文的主要目的有以下三點:
- 希望能夠提升自己對Lingo的相關操作並加強對優化問題的思維模式
- 方便日后對Lingo核心操作的回顧
- 希望每一位到來的朋友能夠有所收獲
一、優化模型介紹
優化模型主要有三個基本要素:決策變量、目標函數、約束條件。其一般形式如下:
$$
opt \ \ \ \ f(x) \
s.t \ \ \ \ h_i(x)=0,\ i=1,2,\cdots,m \
g_j(x)\leq0,\ j=1,2,\cdots,l
$$
$opt$ 是“optimize”的縮寫,表示“最優化”,一般為 $min$ 或 $max$,$f(x)$ 表示目標函數,$s.t.$ 是“subject to”的縮寫“受約束於”,$h_i(x), g_i(x)$ 則表示約束條件,其中 $x$ 表示優化模型的決策變量。
二、運輸問題
2.1 問題描述
Question:有三個生產地和四個銷售地,其生產量、銷售量及單位運費如表所示,求總運費最少的運輸方案以及總運費。
2.2 問題分析
由題意,我們不難看出優化模型的決策變量是每個生產地向各個銷售地運輸的貨量,即 $s_{ij}$。運輸的總費用由各個產地向各個銷售地運輸所需費用之和,一個產地可以向多個銷售地運輸貨物,一個銷售地亦可接受多個產地的貨物,所以可知優化模型中的目標函數是運輸的總費用,即 $W=\sum3_{i=1}\sum4_{j=1}s_{ij}x_{ij}$。除此之外,該目標函數受到兩個限制,即優化模型的約束條件:
- 生產地限制:每個生產地的運輸量理應小於產生量,$\sum_{j=1}^4s_{ij}\leq a_i$
- 銷售地限制:每個銷售地接受的貨物理應等於銷售量,$\sum_{i=1}^3x_{ij}=b_j$
2.2 優化模型構建
有以上問題分析,為求出總運費最小的方案,我們可以構建該問題的優化模型如下:
$$
min \ \ \ \ \sum3_{i=1}\sum4_{j=1}s_{ij}x_{ij} \
s.t. \ \ \ \ \sum_{j=1}^4s_{ij}\leq a_i ;;\ \sum_{i=1}^3x_{ij}=b_j \ ;\ s_{ij}\geq0 \ ;
$$
2.3 模型求解
求解的Lingo代碼如下:
sets:
supply/1..3/: s; !定義運輸集,集中的每個元素都有對應的屬性,即運輸量s;
demand/1..4/: d; !定義需求集,集中的每個元素都有對應的屬性,即需求量d;
link(supply, demand): p, x; !定義link衍生集,每個元素中都有兩個屬性,運費p,運輸量x;
endsets
data:
s = 30 25 21; !定義數據集s,表示生產量;
d = 15 17 22 12; !定義數據集d,表示銷售量;
p = 6 2 6 7 !定義數據集p,表示生產地向銷售地所對應的運費;
4 9 5 3
8 8 1 5;
enddata
min = @sum(link(i,j): p(i,j)*x(i,j)); !目標函數;
@for(supply(i): @sum(demand(j): x(i,j)) <= s(i)); !生產地限制約束條件;
@for(demand(j): @sum(supply(i): x(i,j)) = d(j)); !銷售地限制約束條件;
2.4 求解結果
運行如上所示Lingo程序,我們可以得到如下結果:
通過上圖展示,我們可以得到運輸的最佳方案以及最小運費161個單位。運輸方案圖示如下:
