lingo变量无限制版本_【运筹学】用Lingo求解运输问题,兼谈Lingo语法
一. 運(yùn)輸模型
設(shè)有
個(gè)產(chǎn)地 其產(chǎn)量(供應(yīng)量)分別為 ; 個(gè)銷地 , 其銷量(需求量)分別為 ;從產(chǎn)地 運(yùn)往銷地 的運(yùn)費(fèi)為 . 假設(shè)產(chǎn)銷平衡,問如何安排運(yùn)輸方案能使總運(yùn)費(fèi)最小?這就是經(jīng)典的運(yùn)輸問題,設(shè)從
運(yùn)往 的運(yùn)量為 (決策變量),則建立產(chǎn)銷平衡的運(yùn)輸模型:其中,約束條件 (1) 表示從
地運(yùn)出量等于地的供應(yīng)量;約束條件 (2) 表示運(yùn)往地的運(yùn)量等于地的需求量。若約束 (1) 若改為
, 約束 (2) 仍為 ,則為產(chǎn)大于銷的運(yùn)輸模型;若約束 (2) 若改為
, 約束 (1) 仍為 ,則為銷大于產(chǎn)的運(yùn)輸模型。二. Lingo求解
用Lingo求解,只需要將上述模型按照Lingo語法表示出來,而不用操心任何求解細(xì)節(jié)。
例 1
建立運(yùn)輸模型(產(chǎn)銷平衡):
其中,運(yùn)價(jià)
供應(yīng)
,需求 .Lingo代碼:
sets運(yùn)行結(jié)果(部分):
結(jié)果解釋:最優(yōu)運(yùn)費(fèi)是85,運(yùn)輸方案是:S1往D3、D4分別運(yùn)送5和2;S2往D1、D4分別運(yùn)送3和1;S3往D2、D4分別運(yùn)送6和3.
三. 程序說明
授人予魚不如授人與漁,所以再講解一下上面代碼涉及到的Lingo語法。
1. Lingo代碼段
Lingo代碼分為若干片段,比如上面代碼包含了:
集合段:sets: ...... endsets ——用來聲明和定義數(shù)組變量;
數(shù)據(jù)段:data: ...... enddata ——用數(shù)據(jù)對(duì)變量賦值;
目標(biāo)與約束段: 即具體模型表述部分(不需起止標(biāo)志)。
注:另外還可以有初始段和計(jì)算段(暫且不談)。
例 1 涉及到兩個(gè)一維數(shù)據(jù):供應(yīng)
、需求 ; 以及一個(gè)二維數(shù)據(jù) . 所以要存儲(chǔ)和使用它們,必須要用到集合段和數(shù)據(jù)段,當(dāng)然還必須有模型段。2. 集合段部分
(1) 集合段第一句:supplys /1 .. 3/: S;
聲明一個(gè)長(zhǎng)度為 3 的一維數(shù)組 supplys, 并用它定義一個(gè)這樣的一維數(shù)組變量 S.
先是數(shù)組名(隨便起),再是用兩個(gè) / 夾在中間的是數(shù)組的下標(biāo)范圍,中間 .. 是省略表示法,接著用 : 定義數(shù)組變量 S。
(2) 同理,第二句 demands/1..4/: D; 聲明一個(gè)長(zhǎng)度為 4 的一維數(shù)組 demands,并定義一個(gè)這樣的一維數(shù)組變量 D。
(3) 第三句 links(supplys, demands): c, x; 聲明一個(gè)
的二維數(shù)組 links,并用它定義兩個(gè)這樣的二維數(shù)組變量 c, x.把兩個(gè)一維數(shù)組放一起,起個(gè)名字叫 links,得到二維數(shù)組 links,第1個(gè)一維數(shù)組的維數(shù)就是二維數(shù)組的行數(shù)維度,第2個(gè)一維數(shù)組的維數(shù)就是二維數(shù)組的列數(shù)維度。
注意:這里 links 不是Lingo關(guān)鍵字,可以隨便起名。
3. 數(shù)據(jù)段部分
前面定義好的數(shù)組變量
,就是為了存放已知數(shù)據(jù)的,把已知數(shù)據(jù)賦值給它們,以便目標(biāo)與約束段使用。數(shù)據(jù)中間用 逗號(hào)/空格 隔開都可以,二維數(shù)據(jù)寫成一行也行,我這樣寫比較易讀而已。
4. 目標(biāo)與約束段部分
為什么不叫模型段呢,是因?yàn)長(zhǎng)ingo一般是把全部代碼放在 model: ....... end 中間(就解決一個(gè)問題,省略也行),整個(gè)叫做模型段。
該部分就是把模型公式“原樣”表述出來,咱們對(duì)照著來看:
min目標(biāo)函數(shù)是求最小,所以用 “min=”
有
,所以需要用到 @sum() 函數(shù), 這是Lingo里的求和函數(shù),首先得告訴它求和的范圍, 從1到3, 從1到4,這不正好是前面聲明的(對(duì)應(yīng)的)二維數(shù)組 links 的大小嗎,所以就用 links(i, j)來告訴(也只能用聲明的數(shù)組來告訴),并用 表示行索引, 表列索引。然后,冒號(hào),求和里面的表達(dá)式。
@for注意到隨著
變化,這實(shí)際上是 3 個(gè)式子。要表示這種多個(gè)重復(fù)式子,就用到Lingo里的 @for() 函數(shù),首先得告訴它有多少重復(fù)的式子,同樣只能用聲明的(對(duì)應(yīng)的)數(shù)組來告訴,這里是 supplys(i), 并用 表示重復(fù)的索引。關(guān)于這種“對(duì)應(yīng)”,有信息提示,比如維數(shù)得相同,比如
是從1到3,表示的供應(yīng)(產(chǎn)地)的下標(biāo)。處理完式子的重復(fù),就剩下表示每次的式子了,有
按前面講到的 @sum() 函數(shù)規(guī)則來寫就行了。@for注:上例是產(chǎn)銷平衡運(yùn)輸問題,若不是產(chǎn)銷平衡,把模型表示部分的代碼對(duì)應(yīng)位置的“=”換成“<" 即可(Lingo中 ”<“就是“<=”)。
————————————————————
原創(chuàng)作品,轉(zhuǎn)載請(qǐng)注明,禁止出版盜用。
總結(jié)
以上是生活随笔為你收集整理的lingo变量无限制版本_【运筹学】用Lingo求解运输问题,兼谈Lingo语法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 事务里面捕获异常_三问Spring事务:
- 下一篇: c语言如何判断数据是否符合正态分布_如何