@函數
前面,咱們已經對Lingo有了必定的瞭解,可是要想真正的熟悉Lingo在解決優化問題中的強大之處,還須要不斷增強相關訓練,本文主要是使用Lingo來解決優化問題,該文的主要目的有如下三點:優化
優化模型主要有三個基本要素:決策變量、目標函數、約束條件。其通常形式以下:code
$$
opt \ \ \ \ f(x) \
s.t \ \ \ \ h_i(x)=0,\ i=1,2,\cdots,m \
g_j(x)\leq0,\ j=1,2,\cdots,l
$$blog
$opt$ 是「optimize」的縮寫,表示「最優化」,通常爲 $min$ 或 $max$,$f(x)$ 表示目標函數,$s.t.$ 是「subject to」的縮寫「受約束於」,$h_i(x), g_i(x)$ 則表示約束條件,其中 $x$ 表示優化模型的決策變量。get
Question:有三個生產地和四個銷售地,其生產量、銷售量及單位運費如表所示,求總運費最少的運輸方案以及總運費。it
由題意,咱們不難看出優化模型的決策變量是每一個生產地向各個銷售地運輸的貨量,即 $s_{ij}$。運輸的總費用由各個產地向各個銷售地運輸所需費用之和,一個產地能夠向多個銷售地運輸貨物,一個銷售地亦可接受多個產地的貨物,因此可知優化模型中的目標函數是運輸的總費用,即 $W=\sum3_{i=1}\sum4_{j=1}s_{ij}x_{ij}$。除此以外,該目標函數受到兩個限制,即優化模型的約束條件:io
有以上問題分析,爲求出總運費最小的方案,咱們能夠構建該問題的優化模型以下:class
$$
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 \ ;
$$變量
求解的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)); !銷售地限制約束條件;
運行如上所示Lingo程序,咱們能夠獲得以下結果:
經過上圖展現,咱們能夠獲得運輸的最佳方案以及最小運費161個單位。運輸方案圖示以下: