




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
LINGO
*一.優化模型與優化軟件簡介二.LINGO軟件的基本使用方法Outline三.LINGO程序流程控制和子模型
*一.優化模型與優化軟件簡介*約束條件決策變量優化問題的一般形式目標函數無約束優化:只有目標函數,沒有約束條件有約束優化:目標函數和約束條件都有普通方程組:沒有(1)(3),只有(2)不等式方程組:沒有(1)(2),只有(3)*優化類型連續優化:全部決策變量取值均為連續數值(實數)離散優化:部分或全部決策變量只取離散數值*連續優化
線性規劃(LP)
目標和約束均為線性函數非線性規劃(NLP)
目標或約束中有非線性函數二次規劃(QP)
目標為二次函數、約束為線性*離散優化
整數規劃(IP)
決策變量(全部或部分)為整數
整數線性規劃(ILP),整數非線性規劃(INLP)
純整數規劃(PIP),混合整數規劃(MIP)
一般整數規劃,0-1(整數)規劃*常用優化軟件
LINDO/LINGO軟件MATLAB優化工具箱/mathematica優化程序包EXCEL軟件的優化功能SAS(統計分析)軟件的優化功能*建模時需要注意的幾個基本問題
1、盡量使用實數優化,減少整數約束和整數變量2、盡量使用光滑優化,減少非光滑約束的個數如:盡量少使用絕對值、符號函數、多個變量求最大/最小值、四舍五入、取整函數等*建模時需要注意的幾個基本問題
3、盡量使用線性模型,減少非線性約束和非線性變量的個數(如x/y<5
改為x<5y)4、合理設定變量上下界,盡可能給出變量初始值5、模型中使用的參數數量級要適當(如小于103)*二.LINGO軟件的基本使用方法*§1LINGO入門*max2x1+3x2
St.4x1+3x2<=103x1+5x2<=12x1≥0x2≥0目標函數約束條件決策變量設有數學模型如下:*第一步:啟動Lingo屏幕顯示如下:標記LINGO的外窗口是主框架窗口,主框架窗口的上面包含所有的命令菜單和命令工具欄;標記LINGOMODEL-LINGO1的子窗口是一個新的、空白的模型窗口。*第二步:在模型窗口中輸入模型model:max=2*x1+3*x2;4*x1+3*x2<10;3*x1+5*x2<12;endMax2x1+3x2St.4x1+3x2<=103x1+5x2<=12x1≥0x2≥0*第三步:求解模型1)選擇菜單
LINGO|Solve
或者按工具欄的
*2)LINGO開始編譯模型,如有語法錯誤將返回一個錯誤的消息并指明錯誤出現的位置;如果通過編譯,LINGO將激活Solver運算器
尋求模型的最優解;*3)首先出現solverstatus窗口,其作用是監控solver的進展和顯示模型的維數等信息;*SolverStatus窗口*4)計算完成后出現SolutionReport窗口顯示模型解的詳細信息;*SolutionReport窗口Globaloptimalsolutionfoundatiteration:2Objectivevalue:7.454545VariableValueReducedCost
x11.2727270.000000
x21.6363640.000000RowSlackorSurplusDualPrice17.4545451.00000020.0000000.9090909E-0130.0000000.5454545*ReducedCost:在max模型中:
相應變量的
reducedcost值表示當該變量每增加一個單位時目標函數減少的量。本例中此值均為0*ReducedCost:ReducedCost值列出最優單純形表中判別數所在行的變量的系數,表示當變量有微小變動時,目標函數的變化率。其中基變量的reducedcost值應為0,對于非基變量Xj,相應的reducedcost值表示當某個變量Xj增加一個單位時目標函數減少的量(max型問題)。本例中此值均為0。*SLACKORSURPLUS:
給出約束條件的松馳變量或剩余變量的值;小于等于約束為松馳變量(SLACK);+
大于等于約束為剩余變量(SURPLUS);-*DUALPRICES:對偶價格或影子價格
DUALPRICES表示當對應約束有微小變動時,目標函數的變化率,即約束條件右端的常數項每增加一個單位,目標函數相應獲得的改變量。顯然,如果在最優解處約束正好取等號(緊約束),該值才可能不是0;對于非緊約束對該值必為0,表示對應約束中不等式右端項的微小擾動不影響目標函數。*§2Lingo的基本用法注意事項*1)每一個模型都以
model:
開始,又以
end
結束,也可省略此結構;*2)目標函數必須由
min=
或
max=
開頭。*3)可以用<表示<=;
用>表示>=;Lingo無嚴格小于,欲使a<b,可以適當選取小的正常數e
表示成a+e<b,*4)LINGO的每一語句以
;
結束;5)注釋以!開始,以;
結束;*變量名:
.不區分大小寫
.由字母數字下劃線組成
.第一個字符必須是字母
.變量名最長為32個字符*LINGO編輯器用藍色顯示LINGO關鍵字
綠色顯示注釋其他文本用黑色
匹配的括號用紅色高亮度顯示*8)變量和數字放在約束條件的左、右端均可;
但最好變量在左,數字在右。9)Lingo變量默認域為非負實數,可以改變默認域.*10)行名[name]
例:
[Objective]max=2*x+3*y;
[Con1]4*x+3*y<10;
[Con2]3*x+5*y<12;
線性規劃(行名).lg4
默認為[1],[2],[3]*Globaloptimalsolutionfound.Objectivevalue:7.454545Totalsolveriterations:2VariableValueReducedCostX1.2727270.000000Y1.6363640.000000RowSlackorSurplusDualPrice
OBJECTIVE7.4545451.000000
CON10.0000000.9090909E-01
CON2
0.0000000.5454545*§3LINGO的建模語言*以運輸實例逐步分析6個倉庫向8個小販供應同一種貨物,如何運,總運輸費用最小?注:每個倉庫可以向每個小販供貨,一共48個可能運貨路線。倉庫貨存量、小販需求量、每條路線的單位運輸費用三個表如下:*倉庫貨存量:capacity*小販需求量:demand*每單位貨物運輸費用表:cost*demand_j表示第j個小販的需求量capacity_i
表示第i個倉庫的庫存量cost_i_j表示從第i個倉庫到第j個小販的單位運輸費用已知數量決策變量volume_i_j
表示從第i個倉庫到第j個小販的運輸量*數學模型可表示如下:*當然目標函數可以如下輸入:min=6*volume_1_1+
2*volume_1_2+
6*volume_1_3+...
1*volume_6_6+
4*volume_6_7+
3*volume_6_8;*
但是較大模型如果像上面那樣輸入又費時,又容易出錯!這就需要LINGO的建模語言*LINGO的建模語言優點:1)可以用類似于標準數學符號的方式表示你的模型;2)可以用一個緊湊的語句表示一系列約束。3)數據可獨立于模型:LINGO可以從文本文件、電子數據表、數據庫中讀取數據。*LINGO模型的構成:5個段
目標函數與約束條件段集合段(sets:endsets)數據段(data:enddata)初始段(init:endinit)計算段(calc:endcalc)Lingo建模語言的重點和難點是:對集合概念的理解和正確使用*為什么使用集合
集合是LINGO建模語言的基礎,是LINGO程序設計最強有力的基本構件。借助于集合,能夠用一個單一的、長的、簡明的復合公式表示一系列相似的約束,從而可以快速方便地表達規模較大的模型。*什么是集合
集合是一群相聯系的對象,比如倉庫、小販、運輸路線,這些對象也稱為集合的成員。每個集合成員可能有一個或多個與之有關聯的特征,我們把這些特征稱為屬性。屬性值可以預先給定,也可以是未知的,有待于LINGO求解。*從我們的數學模型看需要三個集合:(1)倉庫-6個成員-貨存量(2)小販-8個成員-需求量(3)運輸路線-48個成員
-單位運費和運貨量*LINGO有兩種類型的集合原始集合(primitiveset):由一些最基本的對象組成的。
派生集(derivedset):用一個或多個其它集來定義的,也就是說,它的成員來自于其它已存在的集。***下面我們學習集合定義部分**1.以sets:開始,以endsets結束;
sets:…endsets*2.原始集合定義法:setname[/member_list/][:attribute_list];。setname是集合的名字;。member_list是成員列表,各成員之間可用空格或逗號分隔;。attribute_list是集合成員所具有的屬性列表,多個屬性之間用逗號分隔;。原始集合的member_list,attribute_list是可選項;**倉庫和小販的集合可如下定義*sets:
warehouses
/w1w2w3w4w5w6/:
capacity;
vendors
/v1,v2,v3,v4,v5,v6,v7,v8/:demand;endsets**成員較多時,可使用隱式成員列表setname/member1..memberN/
[:attribute_list];*數字型字符數字型星期型月份型年份-月份型*隱式成員列表類別**(1)數字型1..n
例:1..5(1,2,3,4,5)(2)字符數字型stringM..stringN例:truck3..truck34*(3)星期型dayM..dayN例:mon..fri(Mon,Tue,Wed,Thu,Fri)(4)月份型MonthM..MonthN例:OCT..JAN(Oct,Nov,Dec,Jan)*(5)年份-月份型monthYearM..monthYearN例:OCT2001..JAN2002
(2001.102001.112001.122002.1)**倉庫和小販的集合也可如下定義*sets:
warehouses
/w1..w6/:
capacity;
vendors
/v1..v8/:
demand;endsets*3.派生集合定義法:setname(parent_set_list)[/member_list/][:attribute_list];parent_set_list是父集合名列表**48條運輸路線集合定義*links(warehouses,vendors):cost,volume;**三個集合定義如下*sets:
warehouses/wh1..wh6/:capacity;
vendors/v1..v8/:demand;
links(warehouses,vendors):
cost,volume;endsets*運輸問題的三個集合說明:這段代碼定義了4個屬性值,在接下來的模型中就可以使用屬性值capacity(1),capacity(2),…,capacity(6);demand(1),demand(2),…,demand(8);cost(1,1),cost(1,2),…,cost(1,8),cost(2,1),cost(2,2),…,cost(2,8),…,cost(6,1),cost(6,2),…,cost(6,8);volume的引用同cost。*4.集合成員過濾:trucks/1..100/:capacity;heavy_duty(trucks)|capacity(&1)#gt#50000
:;&1是集合索引號放置器,如果有兩個父集合,就是&1,&2***下面我們學習數據定義**以data:開始,以enddata結束;
data:..enddata*例如:設有如下集合sets:
set1/a,b,c/:x,y;endsets如果想賦值
x(1)=1,x(2)=2,x(3)=3,y(1)=4,y(2)=5,y(3)=6,則數據段可以為*data:x=1,2,3;y=456;enddatadata:x,y=142536;enddata
多個數據之間可用逗號或空格分隔
*若成員屬性值相同,數據段定義如下:data:x=3;!(所有成員的x=3);y=6;!(所有成員的y=6);enddata
*也可以在運行時輸入屬性值:data:x=?;
!(運行時輸入所有成員的x值);y=6;enddata**運輸問題的數據部分*data:capacity=60,55,51,43,41,52;demand=3537223241324338;*cost=626742594953858252197433767392712395726555228143;enddata*sets:
sett:x,y;endsetsdata:sett,x,y=a14b25c36;enddata
sets:
sett/a,b,c/:x,y;endsetsdata:x=123;y=456;enddata
集合成員可以在數據段定義:*運輸實例:sets:warehouses:capacity;endsetsdata:!可以寫成warehouses=w1..w6;!也可以同時定義集合成員列表和屬性值;
warehouses,capacity=w160,w255,w351,w443,w541,w652;enddata***初始化定義**
只在非線性規劃中使用,指定初始值。
init:..endinit*
例:init:
x=0.999;y=0.002;
endinity<=@log(x);x^2+y^2<=1;給了恰當的初始值,會減少運算時間。***計算段定義**calc:...endcalc計算段的作用:在模型輸入后,LINGO開始正式求解模型之前對原始數據進行一定的計算,得到我們模型中要使用的部分數據。*一個簡單的計算段例子:model:data:x,y,z=1,2,3;enddatacalc:avg=(x+y+z)/3;endcalcend***目標函數和約束條件段**LINGO提供了集合循環函數和集合操作函數使得目標函數和約束條件的書寫如同數學公式那樣簡單。四個集合循環函數FOR、SUM
、MAX、MIN*@sum(
setname
[(set_index_list)[|condition]]
:expression);求和**運輸問題的目標函數*min=@sum(links(i,j):
cost(i,j)*volume(i,j));min=@sum(links:
cost*volume);**運輸問題實例中的求和*!從6個倉庫發到第j個小販的貨物量總和;@sum(warehouses(i):
volume(i,j));*從第i個倉庫發出到8個小販的貨物量總和;@sum(vendors(j):
volume(i,j))*@for
(setname
[(set_index_list)[|condition]]
:expression_list);
生成約束@for
對集合setname中的每個成員獨立地生成約束,約束由約束表達式列表expression_list描述;多個表達式之間用分號相隔。**每個小販的需求約束*!(要求6個倉庫發給每個小販的貨物總量=小販的需求量);@for(vendors(j):
@sum(warehouses(i):volume(i,j))
=demand(j));**每個倉庫的供貨約束*@for(warehouses(i):
@sum(vendors(j):volume(i,j))<capacity(i)
);!(要求每個倉庫發給8個小販的貨物總量<倉庫的貨存量);*返回集合setname上的表達式expression的最大值@max
(setname
[(set_index_list)
[|condition]]
:expression);*@min
(
setname
[(set_index_list)
[|condition]]
:expression
);
返回集合setname上的表達式expression的最小值*
返回數據集setname中成員element的位置號(下標)*集合操作函數*@index([setname,]element)*model:sets:girls/debbie,sue,alice/:;boys/bob,joe,sue,fred/:;endsetscalc:x=@index(boys,sue);y=@index(sue);endcalcend*@in(set_name,
primitive_index_1
[,primitive_index_2…])
如果數據集set_name中包含成員primitive_index_1則返回1,否則返回0。*例:model:sets:plants/a,b,c,d/:;closed(plants)/b/:;open(plants)|#not#@in(closed,&1):x;endsetsdata:x=1,2,3;enddataend*
例2:model:sets:s1/abc/:;s2/xyz/:;s3(s1,s2)/a,xa,zb,yc,z/:;endsetscalc:x=@in(s3,@index(s1,b),@index(s2,y));endcalcend
本例要判斷集合s3中是否包含元素(b,y),運行LINGO|SOLVE得到x=1,說明包含。*@wrap(index,limit)
當index位于區間[1,limit]時返回index,否則返回j=index-k*limit,其中j位于區間[1,limit]*職員時序安排模型
一項工作一周7天都需要有人(比如護士工作),每天(周一至周日)所需的最少職員數為20、16、13、16、19、14和12,并要求每個職員一周連續工作5天,試求每周所需最少職員數,并給出安排。注意這里我們考慮穩定后的情況。*sets:days/mon..sun/:required,start;endsetsdata:required=20161316191412;enddatamin=@sum(days:start);!最小化每周所需職員數;@for(days(j):@sum(days(i)|i#le#5:start(@wrap(j+i+2,7)))>=required(j));*@size(setname)
返回集合setname中所包含的成員個數。*第二章
LINGO與其它軟件交換數據*拷貝、粘貼FromExelPastefromexel.lg4*
輸入輸出函數用來與外部數據源連接
@text()、@ole()、@file()、@odbc()、@dual()*@file(‘filename’)在模型的集合和數據部分使用,從文本文件輸入數據.*sets:warehouses/@file(‘1.txt’)/:capacity;vendors/@file(‘1.txt’)/:demand;links(warehouses,vendors):cost,volume;endsets
運輸實例的數據可以從文本文件輸入:*data:capacity=@file('1.txt');demand=@file('1.txt');cost=@file('1.txt');enddata1.txt文件內容1.txt*@text(‘filename’)
在模型的數據部分使用,向文本文件輸出數據.Outputtotext.lg4*@ole(‘spreadsheet_file’
[,range_name_list])
在模型的數據和集合部分使用,與excel交換數據*運輸實例的數據可以從Excel輸入:sets:
warehouses:capacity;vendors:demand;links(warehouses,vendors):cost,volume;endsets*data:
warehouses,vendors,capacity,demand,cost
=@ole(
‘2.xls’,
‘warehouses’,
‘vendors’,
‘capacity’,
‘demand’,
‘cost’);
enddata*在Excel中定義單元格范圍名稱的方法:①按鼠標左鍵拖曳選擇單元格范圍,②釋放鼠標按鈕,③選擇“插入|名稱|定義”,④輸入希望的名字,⑤點擊“確定”按鈕。*2.xls
從Excel輸入數據.lg4*@odbc(['data_source'[,'table_name'[,col_1'[,'col_2'...]]]]
)
在模型的數據部分使用,與數據庫進行數據傳輸*運輸實例的數據可以從數據庫輸入:sets:
warehouses:capacity;vendors:demand;links(warehouses,vendors):cost,volume;endsets*data:
warehouses,capacity=@odbc();
vendors,demand=@odbc();
links,cost=@odbc();
@odbc()=volume;
enddata*trans.mdb
與數據庫的數據傳遞.lg4*第三章
LINGO的內部函數*1.標準運算符?算術運算符:
^*/+-?邏輯運算符:
#EQ##NE##GE##GT##LE##LT##NOT##AND##OR#*?關系運算符:
=<=>=
可以用<表示<=或<*運算符的優先級*lingo變量默認域為非負實數@free(variable)
取消默認域,使變量可以取任意實數@gin(variable)限制變量取整數值@bin(variable)限制變量取值為0,1@bnd(low,variable,up)
限制變量于一個有限的范圍3.變量界定函數*練習1x1=2,
x2=3,Z*=-17練習1*練習2X1=1X2=0X3=1Z=8練習2*@abs(x)、@cos(x)、@sin(x)、@tan(x)、@exp(x)、@sign(x)@floor(x)(返回x的整數部分)@smax(x1,x2,…,xn)(返回x1,x2,…,xn的最大值)@smin(x1,x2,…,xn)4.數學函數*5.條件控制@if(logical_condition,true_result,false_result)計算logical_condition,若真返回true_result否則返回false_result.*7個選項卡(可設置80-90個控制參數)*范例
*整數規劃整數規劃.lg4*二次規劃的例子(lingo).lg4*遞規調用.lg4
已知,求a[7]
*
學習方法:(1)上課各位老師講的每個有數據的規劃模型上機用lingo語言實踐;(2)LINGO的help下有一項AdditionalExamplesofLINGOModeling,可以仔細研究每個例子的模型。*某車間有甲、乙兩臺機床,可用于加工三種工件。假定這兩臺車床的可用臺時數分別為800和900,三種工件的數量分別為400、600和500,且已知用三種不同車床加工單位數量不同工件所需的臺時數和加工費用如下表。問怎樣分配車床的加工任務,才能既滿足加工工件的要求,又使加工費用最低?
練習3*
練習3*解1
設在甲車床上加工工件1、2、3的數量為x1、x2、x3,在乙車床上加工工件1、2、3的數量分別為x4、x5、x6。可建立以下線性規劃模型:
*解2
設在甲車床上加工工件i的數量為x(i),單位工件所需加工臺時數為timex(i),單位工件的加工費用為costx(i),在乙車床上加工工件i的數量為y(i),單位工件所需加工臺時數為timey(i)單位工件的加工費用為costy(i)工件i的加工數量為demand(i)*數學模型*Lingo建模sets:Chechuang/1..3/:costx,costy,timex,timey,x,y,demand;endsets*Lingo建模min=@sum(chechuang:costx*x+costy*y)@sum(chechuang:timex*x)<800;@sum(chechuang:timey*y)<900;@for(chechuang:x+y=demand);@for(chechuang:@gin(x);@gin(y));*data:costx=13,9,10;costy=11,12,8;timex=0.4,1.1,1;timey=0.5,1.2,1.3;demand=400,600,500;enddata練習3*Lingo-Generate-DisplaymodelMODEL:[_1]MIN=13*X_1+11*Y_1+9*X_2+12*Y_2+10*X_3+8*Y_3;[_2]0.4*X_1+1.1*X_2+X_3<=800;[_3]0.5*Y_1+1.2*Y_2+1.3*Y_3<=900;[_4]X_1+Y_1=400;[_5]X_2+Y_2=600;[_6]X_3+Y_3=500;@GIN(X_1);@GIN(Y_1);@GIN(X_2);@GIN(Y_2);@GIN(X_3);@GIN(Y_3);END*練習4---求S到T的最短路56774968658336C1B1C2B2A1A2A3TS6*model:sets: cities/s,a1,a2,a3,b1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學校燒鍋爐勞務合同
- 共享單車投放與運營維護合同
- 音響設備租賃合同
- 借款分期付款合同
- 廢輪胎購銷合同范本
- 綠網覆蓋合同范本
- 2025年直播違約合同模板
- (7)-小學文言文閱讀詳解50篇
- 租房返利合同范本
- 路邊車位維修合同范本
- 2025年教師資格師德師風建設試題及答案
- 期中測試卷(1-5單元)(試題)(含答案)-2024-2025學年二年級下冊數學青島版
- 2025屆北京市順義區高三下學期一模英語試題(原卷版+解析版)
- 人工智能技術與知識產權保護
- 2025-2030便利店行業市場發展現狀及發展前景與投資研究報告
- 2025屆高三湖北省十一校第二次聯考英語試卷(含答案詳解)
- 信息技術與小學教育教學融合
- 產品設計研發費用統計表
- 提高教學管理質量校長講話:“2574”工作實施思路!即兩大抓手五項重點任務七個落實環節四個質量目標
- 2025屆廣東省深圳市高三年級第一次調研考試歷史試題
- 清理報廢漁船合同范本
評論
0/150
提交評論