今天我們將用幾個(gè)綜合實(shí)例來(lái)實(shí)踐Lingo。
例1 求解非線性方程組
規(guī)劃問(wèn)題本來(lái)就是給出優(yōu)化條件和限制條件嚎于,之后得出滿足條件的自變量的過(guò)程掘而。那么它自然可以解決非線性方程問(wèn)題挟冠,那么只需給出一個(gè)可以增加運(yùn)算速度定一個(gè)初始點(diǎn),再給出限制條件镣屹,就可以解出來(lái)了圃郊。
model:
INIT:
x=1;y=1;
ENDINIT
x^2+y^2=2;
2*x^2+x+y^2+y=4;
end
輸出結(jié)果
Variable Value
X 0.4543344
Y 1.339246
Row Slack or Surplus
1 -0.3647994E-06
2 -0.7985587E-06
例2 (裝配線平衡模型)一條裝配線含有一系列的工作站价涝,在最終產(chǎn)品的加工過(guò)程中每個(gè)工作站執(zhí)行一種或幾種特定的任務(wù)女蜈。裝配線周期是指所有工作站完成分配給它們各自的任務(wù)所花費(fèi)時(shí)間中的最大值。平衡裝配線的目標(biāo)是為每個(gè)工作站分配加工任務(wù)色瘩,盡可能使每個(gè)工作站執(zhí)行相同數(shù)量的任務(wù)伪窖,其最終標(biāo)準(zhǔn)是裝配線周期最短。不適當(dāng)
的平衡裝配線將會(huì)產(chǎn)生瓶頸——有較少任務(wù)的工作站將被迫等待其前面分配了較多任務(wù)的工作站居兆。
問(wèn)題會(huì)因?yàn)楸姸嗳蝿?wù)間存在優(yōu)先關(guān)系而變得更復(fù)雜覆山,任務(wù)的分配必須服從這種優(yōu)先關(guān)系。
這個(gè)模型的目標(biāo)是最小化裝配線周期泥栖。有 2 類(lèi)約束:
① 要保證每件任務(wù)只能也必須分配至一個(gè)工作站來(lái)加工簇宽;
② 要保證滿足任務(wù)間的所有優(yōu)先關(guān)系。
任務(wù) | A | B | C | D | E |
---|---|---|---|---|---|
時(shí)間 | 45 | 11 | 9 | 50 | 15 |
F | G | H | I | J | K |
12 | 12 | 12 | 12 | 8 | 9 |
下面是任務(wù)流程圖吧享。
編寫(xiě)Lingo程序:
MODEL:
!裝配線平衡模型;
SETS:
!任務(wù)集合魏割,有一個(gè)完成時(shí)間屬性T;
TASK/ A B C D E F G H I J K/:T;
!人物之間的有限關(guān)系集合(A必須完成才能開(kāi)始B,等等);
PRED(TASK,TASK)/A,B B,C C,F C,G F,J G,J
J,K D,E E,H E,I H,J I,J/;
!工作站集合;
STATION/1..4/;
TXS(TASK,STATION):X;
!X是派生集合TXS的一個(gè)屬性钢颂,如果(X(I,K)=1)钞它,則表示第I個(gè)任務(wù)
交給第K個(gè)工作站完成。;
ENDSETS
DATA:
!任務(wù)A,B,C,D,E,F,G,H,I,J,K完成的時(shí)間如下;
T=45 11 9 50 15 12 12 12 12 8 9;
ENDDATA
!每一個(gè)作業(yè)只能指派給一個(gè)工作站;
@FOR(TASK(I):@SUM(STATION(K):X(I,K))=1);
!對(duì)于每一個(gè)存在優(yōu)先關(guān)系的作業(yè)對(duì)來(lái)說(shuō)殊鞭,前者對(duì)應(yīng)的工作站I必須小于后者對(duì)應(yīng)的工作站J,保持先后分配關(guān)系;
@FOR(PRED(I,J):@SUM(STATION(K):X(I,K)-X(J,K))>=0);
!對(duì)于每一個(gè)工作站來(lái)說(shuō)遭垛,其花費(fèi)時(shí)間必須不大于裝配線周期;
@FOR(STATION(K): @SUM(TXS(I,K):T(I)*X(I,K))<=CYCTIME);
!目標(biāo)函數(shù)是最小化轉(zhuǎn)配線周期;
MIN = CYCTIME;
!指定 X(I,J) 為 0/1 變量;
例3 旅行售貨員問(wèn)題(又稱貨郎擔(dān)問(wèn)題,Traveling Salesman Problem)
有一個(gè)推銷(xiāo)員操灿,從城市 1 出發(fā)锯仪,要遍訪城市 2,3趾盐,…卵酪, n 各一次,最后返回城市 1谤碳。已知從城市到的旅費(fèi)為溃卡,問(wèn)他應(yīng)按怎樣的次序訪問(wèn)這些城市,使得總旅費(fèi)最少蜒简。
可以用多種方法把 TSP 表示成整數(shù)規(guī)劃模型瘸羡。這里介紹的一種建立模型的方法,是把該問(wèn)題的每個(gè)解(不一定是最優(yōu)的)看作是一次“巡回”搓茬。
引入0-1整數(shù)變量犹赖。
其目標(biāo)是為了讓最小
這里有兩個(gè)明顯的必須滿足的條件:
1.訪問(wèn)城市后必須要有一個(gè)即將訪問(wèn)的確切城市峻村;
2.訪問(wèn)城市前必須要有一個(gè)剛剛訪問(wèn)過(guò)的確切城市麸折。
用下面的兩組約束分別實(shí)現(xiàn)上面的兩個(gè)條件。
到此我們得到了一個(gè)模型粘昨,它是一個(gè)指派問(wèn)題的整數(shù)規(guī)劃模型垢啼。但以上兩個(gè)條件對(duì)于
TSP 來(lái)說(shuō)并不充分,僅僅是必要條件张肾。
例如對(duì)如下的情形芭析,它顯然不是TSP問(wèn)題的解。
于是我們可以在原模型上添加附加約束條件:
于是整個(gè)問(wèn)題變成一個(gè)混合型整數(shù)線性規(guī)劃問(wèn)題吞瞪。
代碼實(shí)現(xiàn)
model:
sets:
city / 1.. 5/: u;
link( city, city):
dist, ! 距離矩陣;
x;
endsets
n=@size(city);
data: !距離矩陣馁启,它并不需要是對(duì)稱的;
dist=@qrand(1); !隨機(jī)產(chǎn)生,這里可改為你要解決的問(wèn)題的數(shù)據(jù);
enddata
!目標(biāo)函數(shù);
min=@sum(link:dist*x);
@FOR(city(K):
!進(jìn)入城市 K;
@sum(city(I)| I #ne# K: x(I,K))=1;
!離開(kāi)城市 K;
@sum(city(J)| J #ne# K: x(K,J))=1);
!保證不出現(xiàn)子圈;
@for(city(I)|I #gt# 1:@for( city( J)| J#gt#1 #and# I #ne# J:
u(I)-u(J)+n*x(I,J)<=n-1));
!限制 u 的范圍以加速模型的求解芍秆,保證所加限制并不排除掉 TSP 問(wèn)題的最優(yōu)解;
@for(city(I) | I #gt# 1: u(I)<=n-2);
!定義 X 為 0-1 變量;
@for( link: @bin(x));
end
例4 露天礦生產(chǎn)的車(chē)輛安排(CMCM2003B)(國(guó)賽2003年真題)
鋼鐵工業(yè)是國(guó)家工業(yè)的基礎(chǔ)之一惯疙,鐵礦是鋼鐵工業(yè)的主要原料基地。許多現(xiàn)代化鐵礦是露天開(kāi)采的妖啥,它的生產(chǎn)主要是由電動(dòng)鏟車(chē)(以下簡(jiǎn)稱電鏟)裝車(chē)霉颠、電動(dòng)輪自卸卡車(chē)(以下簡(jiǎn)稱卡車(chē))運(yùn)輸來(lái)完成。提高這些大型設(shè)備的利用率是增加露天礦經(jīng)濟(jì)效益的首要任務(wù)迹栓。
露天礦里有若干個(gè)爆破生成的石料堆掉分,每堆稱為一個(gè)鏟位,每個(gè)鏟位已預(yù)先根據(jù)鐵含量將石料分成礦石和巖石克伊。一般來(lái)說(shuō)酥郭,平均鐵含量不低于 25%的為礦石,否則為巖石愿吹。每個(gè)鏟位的礦石不从、巖石數(shù)量,以及礦石的平均鐵含量(稱為品位)都是已知的犁跪。每個(gè)鏟位至多能安置一臺(tái)電鏟椿息,電鏟的平均裝車(chē)時(shí)間為5 分鐘。
石料兩種:礦石和巖石
裝車(chē)時(shí)間:5分鐘
卸貨地點(diǎn)(以下簡(jiǎn)稱卸點(diǎn))有卸礦石的礦石漏坷衍、2 個(gè)鐵路倒裝場(chǎng)(以下簡(jiǎn)稱倒裝場(chǎng))和卸巖石的巖石漏寝优、巖場(chǎng)等,每個(gè)卸點(diǎn)都有各自的產(chǎn)量要求枫耳。從保護(hù)國(guó)家資源的角度及礦山的經(jīng)濟(jì)效益考慮乏矾,應(yīng)該盡量把礦石按礦石卸點(diǎn)需要的鐵含量(假設(shè)要求都為29.5% ± 1%,稱為品位限制)搭配起來(lái)送到卸點(diǎn),搭配的量在一個(gè)班次(8 小時(shí))內(nèi)滿足品位限制即可钻心。從長(zhǎng)遠(yuǎn)看凄硼,卸點(diǎn)可以移動(dòng),但一個(gè)班次內(nèi)不變捷沸√粒卡車(chē)的平均卸車(chē)時(shí)間為3 分鐘。
卸點(diǎn)5個(gè):礦石漏痒给、2 個(gè)鐵路倒裝場(chǎng)说墨,巖石漏,巖場(chǎng)侈玄。
卸點(diǎn)需要的鐵含量限制:29.5% ± 1%
問(wèn)題分析范圍:8小時(shí)
卸車(chē)時(shí)間:3分鐘
裝車(chē)+卸車(chē):8分鐘
所用卡車(chē)載重量為 154 噸婉刀,平均時(shí)速 28 km/h吟温⌒蛳桑卡車(chē)的耗油量很大,每個(gè)班次每臺(tái)車(chē)消耗近 1 噸柴油鲁豪。發(fā)動(dòng)機(jī)點(diǎn)火時(shí)需要消耗相當(dāng)多的電瓶能量潘悼,故一個(gè)班次中只在開(kāi)始工作時(shí)點(diǎn)火一次∨老穑卡車(chē)在等待時(shí)所耗費(fèi)的能量也是相當(dāng)可觀的治唤,原則上在安排時(shí)不應(yīng)發(fā)生卡車(chē)等待的情況。電鏟和卸點(diǎn)都不能同時(shí)為兩輛及兩輛以上卡車(chē)服務(wù)糙申。卡車(chē)每次都是滿載運(yùn)輸宾添。
卡車(chē)信息:載重量154噸。
時(shí)速:28km/h
卡車(chē)的工作需連續(xù)柜裸,不能等待缕陕。
滿載運(yùn)輸。
每個(gè)鏟位到每個(gè)卸點(diǎn)的道路都是專用的寬 60 m 的雙向車(chē)道疙挺,不會(huì)出現(xiàn)堵車(chē)現(xiàn)象扛邑,每段道路的里程都是已知的。
一個(gè)班次的生產(chǎn)計(jì)劃應(yīng)該包含以下內(nèi)容:出動(dòng)幾臺(tái)電鏟铐然,分別在哪些鏟位上蔬崩;出動(dòng)幾輛卡車(chē),分別在哪些路線上各運(yùn)輸多少次(因?yàn)殡S機(jī)因素影響搀暑,裝卸時(shí)間與運(yùn)輸時(shí)間都不精確沥阳,所以排時(shí)計(jì)劃無(wú)效,只求出各條路線上的卡車(chē)數(shù)及安排即可)自点。一個(gè)合格的計(jì)劃要在卡車(chē)不等待條件下滿足產(chǎn)量和質(zhì)量(品位)要求桐罕,而一個(gè)好的計(jì)劃還應(yīng)該考下面兩條原則之一:
1.總運(yùn)量(噸公里)最小,同時(shí)出動(dòng)最少的卡車(chē),從而運(yùn)輸成本最懈园怼侠鳄;
2.利用現(xiàn)有車(chē)輛運(yùn)輸,獲得最大的產(chǎn)量(巖石產(chǎn)量?jī)?yōu)先死宣;在產(chǎn)量相同的情況下伟恶,取總運(yùn)量最小的解)。
請(qǐng)你就兩條原則分別建立數(shù)學(xué)模型毅该,并給出一個(gè)班次生產(chǎn)計(jì)劃的快速算法博秫。針對(duì)下面的實(shí)例,給出具體的生產(chǎn)計(jì)劃眶掌、相應(yīng)的總運(yùn)量及巖石和礦石產(chǎn)量挡育。
某露天礦有鏟位 10 個(gè),卸點(diǎn) 5 個(gè)朴爬,現(xiàn)有鏟車(chē) 7 臺(tái)即寒,卡車(chē) 20 輛。各卸點(diǎn)一個(gè)班次的產(chǎn)量要求:礦石漏 1.2 萬(wàn)噸召噩、倒裝場(chǎng)Ⅰ1.3 萬(wàn)噸母赵、倒裝場(chǎng)Ⅱ1.3 萬(wàn)噸、巖石漏 1.9 萬(wàn)噸具滴、巖場(chǎng) 1.3 萬(wàn)噸凹嘲。
鏟位總數(shù):10個(gè)
卸點(diǎn):5個(gè)
鏟車(chē)(能使用的鏟位數(shù)):7臺(tái)
卡車(chē)總數(shù):20輛
各個(gè)卸點(diǎn)的產(chǎn)量要求:礦石漏 1.2 萬(wàn)噸、倒裝場(chǎng)Ⅰ1.3 萬(wàn)噸构韵、倒裝場(chǎng)Ⅱ1.3 萬(wàn)噸周蹭、巖石漏 1.9 萬(wàn)噸、巖場(chǎng) 1.3 萬(wàn)噸疲恢。
鏟位和卸點(diǎn)位置二維示意圖見(jiàn)下圖凶朗,各鏟位和各卸點(diǎn)之間的距離(公里)見(jiàn)下表,各鏟位礦石冈闭、巖石數(shù)量(萬(wàn)噸)和礦石的平均鐵含量也見(jiàn)下表俱尼。
表1 鏟位與卸點(diǎn)之間的距離表
鏟位1 | 鏟位2 | 鏟位3 | 鏟位4 | 鏟位5 | |
---|---|---|---|---|---|
礦石漏 | 5.26 | 5.19 | 4.21 | 4.00 | 2.95 |
倒裝廠1 | 1.90 | 0.99 | 1.90 | 1.13 | 1.27 |
巖廠 | 5.89 | 5.61 | 5.61 | 4.56 | 3.51 |
巖石漏 | 0.64 | 1.76 | 1.27 | 1.83 | 2.74 |
倒裝廠2 | 4.42 | 3.86 | 3.72 | 3.16 | 2.25 |
鏟位6 | 鏟位7 | 鏟位8 | 鏟位9 | 鏟位10 | |
2.74 | 2.46 | 1.90 | 0.64 | 1.27 | |
2.25 | 1.48 | 2.04 | 3.09 | 3.51 | |
3.65 | 2.46 | 2.46 | 1.06 | 0,57 | |
2.60 | 4.21 | 3.72 | 5.05 | 6.10 | |
2.81 | 0.78 | 1.62 | 1.27 | 0.50 |
表2 鏟位礦石,巖石數(shù)量和礦石的平均鐵含量表萎攒。
鏟位1 | 鏟位2 | 鏟位3 | 鏟位4 | 鏟位5 | |
---|---|---|---|---|---|
礦石量 | 0.95 | 1.05 | 1.00 | 1.05 | 1.10 |
巖石量 | 1.25 | 1.10 | 1.35 | 1.05 | 1.15 |
鐵含量 | 30% | 28% | 29% | 32% | 31% |
鏟位6 | 鏟位7 | 鏟位8 | 鏟位9 | 鏟位10 | |
礦石量 | 1.25 | 1.05 | 1.30 | 1.35 | 1.25 |
巖石量 | 1.35 | 1.05 | 1.15 | 1.35 | 1.25 |
鐵含量 | 33% | 32% | 31% | 33% | 31% |
本例就原則一舉例遇八,展現(xiàn)完整的建模和求解過(guò)程。
各種符號(hào)及單位說(shuō)明如下:
:從號(hào)鏟位到號(hào)卸點(diǎn)的石料運(yùn)量耍休,單位:車(chē)·次·(最終方案所求量之一刃永,在相應(yīng)車(chē)道上的總(車(chē)·次)數(shù))
:從號(hào)鏟位到號(hào)卸點(diǎn)的距離,單位:公里
:從號(hào)鏟位到號(hào)卸點(diǎn)運(yùn)行一個(gè)周期所需的時(shí)間羊精,單位:分
:從號(hào)鏟位到號(hào)卸點(diǎn)最多能同時(shí)運(yùn)行的卡車(chē)數(shù)斯够,單位:輛(最終方案所求量之一,在對(duì)應(yīng)車(chē)道上安排的同時(shí)運(yùn)行的車(chē)數(shù))
:從號(hào)鏟位到號(hào)卸點(diǎn),一輛車(chē)一個(gè)班次中最多可以運(yùn)行的次數(shù)读规,單位:次
:號(hào)鏟位的礦石鐵產(chǎn)量乘以100
抓督,單位:車(chē)·次;
:號(hào)鏟位的鐵礦石儲(chǔ)量束亏,單位:萬(wàn)噸
:號(hào)鏟位的巖石儲(chǔ)量铃在,單位:萬(wàn)噸
:描述第號(hào)鏟位是否使用0-1變量,
=
分析所有的目標(biāo)函數(shù)和限制條件:
目標(biāo)函數(shù):
卡車(chē)運(yùn)行總距離最少
限制條件:
1.電鏟能力限制(裝車(chē)時(shí)間5分,每個(gè)電鏟最多能裝60*8/5=96輛車(chē))
2.卸車(chē)能力限制(卸車(chē)時(shí)間3分怕敬,每個(gè)卸點(diǎn)最多能卸60*8/3=160輛車(chē))
3.各鏟位礦石儲(chǔ)量限制(從各個(gè)鏟位運(yùn)出的礦石不能大于儲(chǔ)量)
4.需求量限制(各個(gè)卸點(diǎn)卸下的礦石要大于需求量)
5.品位因數(shù)限制(礦石純度要求29.5% ± 1%)
6.卡車(chē)總數(shù)限制(20)
7.電鏟啟用數(shù)限制(7)
于是可以建立如下模型:
程序如下:
model:
title CUMCM-2003B;
sets:
cai / 1..10 /:p,cy,ck,f;
xie / 1 .. 5 /:q;
link(cai,xie):a,b,c,t,x;
endsets
data:
v=28;
p=30 28 29 32 31 33 32 31 33 31;
q= 1.2 1.3 1.3 1.9 1.3 ;
c=5.2600 1.9000 5.8900 0.6400 4.4200
5.1900 0.9900 5.6100 1.7600 3.8600
4.2100 1.9000 5.6100 1.2700 3.7200
4.0000 1.1300 4.5600 1.8300 3.1600
2.9500 1.2700 3.5100 2.7400 2.2500
2.7400 2.2500 3.6500 2.6000 2.8100
2.4600 1.4800 2.4600 4.2100 0.7800
1.9000 2.0400 2.4600 3.7200 1.6200
0.6400 3.0900 1.0600 5.0500 1.2700
1.2700 3.5100 0.5700 6.1000 0.5000;
cy = 1.25 1.10 1.35 1.05 1.15 1.35 1.05 1.15 1.35 1.25;
ck = 0.95 1.05 1.00 1.05 1.10 1.25 1.05 1.30 1.35 1.25;
enddata
!下面一行是代表卡車(chē)數(shù)量約束东跪,先計(jì)算除每條線路的運(yùn)行周期(單位:分鐘)
a是運(yùn)行在當(dāng)條道路上的總卡車(chē)限制數(shù)畸陡。
b是1輛車(chē)1個(gè)班次中最多可以運(yùn)行的次數(shù)。
@for(link:t=120*c/v+8;a=@floor(t/5);b=@floor((485-5*a)/t));
min=@sum( link:x*154*c); !目標(biāo)函數(shù);
@for (link: x<=a*b); !道路能力約束;
@for (cai(i): @sum(xie(j):x(i,j))<=f(i)*96); !電鏟能力約束;
@for (xie(j):@sum(cai(i):x(i,j))<=160); !卸點(diǎn)能力約束;
!以下是鏟位儲(chǔ)量約束;
@for (cai(i): x(i,1)+x(i,2)+x(i,5)<=ck(i)*10000/154);
@for (cai(i): x(i,3)+x(i,4)<=cy(i)*10000/154);
!產(chǎn)量任務(wù)約束;
@for (xie(j) : @sum(cai(i):x(i,j)) >= q(j)*10000/154);
@sum(cai(i): x(i,1)*(p(i)-30.5) )<=0; !鐵含量約束;
@sum(cai(i): x(i,2)*(p(i)-30.5) )<=0;
@sum(cai(i): x(i,5)*(p(i)-30.5) )<=0;
@sum(cai(i): x(i,1)*(p(i)-28.5) )>=0;
@sum(cai(i): x(i,2)*(p(i)-28.5) )>=0;
@sum(cai(i): x(i,5)*(p(i)-28.5) )>=0;
@sum(link:x/b)<=20; !車(chē)輛能力約束;
@sum(cai: f)<=7; !電鏟數(shù)量約束;
@for(link : @gin(x)); !整數(shù)約束;
@for(cai: @bin(f)); !0-1變量約束;
end