一、線性規劃基礎
(一)方法
① 一個線性規劃中只含一個目標函數。(兩個以上是多目標線性規劃,Lingo無法直接解)
② 求目標函數的最大值或最小值分別用max = …或min = …來表示。
③ 以!開頭,以;結束的語句是注釋語句;
④ 線性規劃和非線性規劃的本質區別是目標函數是否線性,其余一致,故不需要區分。
但值得注意的是,非線性規劃的求解十分困難,基本得不到全局最優解。 ?
(二)例題
某工廠有兩條生產線,分別用來生產M和P兩種型號的產品,利潤分別為200元/個和300元/個,生產線的最大生產能力分別為每日100和120,生產線每生產一個M產品需要1個勞動日(1個工人工作8小時稱為1個勞動日)進行調試、檢測等工作,而每個P產品需要2個勞動日,該廠工人每天共計能提供160勞動日,假如原材料等其他條件不受限制,問應如何安排生產計劃,才能使獲得的利潤最大?
(三)解
設兩種產品的生產量分別為x1和x2,則該問題的數學模型為:
目標函數:max?z=200x1+300x2?
約束條件為:
x1<=100
x2<=200
x1+2*x2<=160
xi>=0, ?i=1,2?
(四)程序
max = 200*x1 + 300*x2;
x1 <= 100; ?
x2 <= 120;
x1 + 2*x2 <= 160;
由Lingo信息可知,運行時間依舊0秒,目標值為29000,此時x1是100,x2是30。
二、矩陣工廠
(一)矩陣工廠:生產一維矩陣
先來看看例子,不必在意其中的空格(Lingo不讀取空格):
sets: ?????????????????
factory /1..6/ : a,b; ?
plant /1..3/ : x,y; ???
endsets ???????????????
以上程序對應知識點:
① factory和plant都是制造矩陣的工廠,但它們是兩家不同的工廠。
② factory工廠后面的 /1..6/ 說明它專門生產1*6的矩陣。
???factory工廠最后面出現的a和b,都是1*6的矩陣。
③ plant工廠后面的 /1..3/ 說明它專門生產1*3的矩陣。
? ? plant工廠最后面出現的x和y,都是1*3的矩陣。
④ 矩陣工廠的名字factory是隨便起的,工廠所生產行矩陣的名字a和b也是隨便起的。
⑤ 以上這四句話,本質是定義了四個行矩陣的大小,矩陣工廠只是中介。
⑥ 生產完矩陣后,工廠和矩陣之間將脫開聯系。
⑦ Lingo不是一行一行讀代碼的,所以用sets:和endsets表示矩陣工廠生產流程的起止。
(二) 矩陣的賦值
矩陣工廠不能只生產矩陣,還要給矩陣賦初值才行,例子如下:
sets: ????????????????????????????
factory /1..6/ : a,b; ????????????
plant /1..3/ : c,x; ??????????????
endsets ??????????????????????????
data: ????????????????????????????
a = 1, 2, 3, 4, 5, 6; ????????????
b = 6.0, 5.0, 4.0, 3.0, 2.0, 1.0;
c = 10, 20, 30; ??????????????????
enddata ??????????????????????????
以上程序對應以下知識點:
① 不是每個矩陣都要賦值,有些矩陣正是我們要求解的變量。
② 需要賦值的矩陣必須賦滿,不能給6個元素的矩陣只賦3個數值。
③ Lingo中可以給矩陣賦整數,也可以賦小數。
④ Lingo不是一行一行讀代碼的,所以用data:和enddata表示矩陣賦值的起止。
?(三)?循環與求和
【例】已知模型如下,請編程求解:
【for循環】
題中約束條件:i=1,2,…,5可以利用for循環一步到位。
???@for( gc(i) : a(i)*x(i) = S );
① for循環,括起整行語句,因為S=ai*xi,i=1,2,…,5,相當于5個約束條件;
② for循環內部,先寫工廠,以告訴for循環幾次,之后再上接約束條件。
③ 此處的i可帶可不帶,甚至可以換成j、k或m等等。
④ 二維矩陣工廠出現后,同時會出現i和j,那時必須帶i和j。
【sum求和】
題中約束條件,可以利用sum求和一步到位。
?@sum( gc(i) : x(i) ) = 5000;
① sum求和,不可以括起完整的約束條件,因為一般的求和的結構是這樣的: x1+x2+x3+x4+x5=5000
② sum求和內部,先寫工廠,以告訴sum求和幾次,之后再上接約束條件。
③ 此處的i可帶可不帶。
④ 二維矩陣工廠出現后,同時會出現i和j,那時必須帶。
【for與sum出現的標志】
① 約束條件后面有i=1,2,…,5一定在最外層套上for。
② 約束條件前面是出現求和符號?,一定在中間加上sum。
-
【例題】
【程序】
model: ????????????????????????
sets: ?????????????????????????
gc /1..5/ : a,x; ??????????????
endsets ???????????????????????
data: ?????????????????????????
a = 1,2,3,4,5; ????????????????
enddata ???????????????????????
max = S; ??????????????????????
@for( gc(i) : a(i)*x(i) = S );
@sum( gc(i) : x(i) ) = 5000; ??
end ???????????????????????????
PS:使用了矩陣工廠創建矩陣后,整個程序需用model:和end包起來。