最優(yōu)化模型計算三_第1頁
最優(yōu)化模型計算三_第2頁
最優(yōu)化模型計算三_第3頁
最優(yōu)化模型計算三_第4頁
最優(yōu)化模型計算三_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

通過Windows剪貼板傳遞數據

LINGO與文本文件的數據傳遞

LINGO與Excel等數據庫文件的數據傳遞

LINGO建模舉例第三講LINGO軟件與外部文件的數據傳遞為了便于處理同一類型的實際問題,在編寫LINGO程序時應該盡量做到程序與數據分離,這樣可以確保程序的通用性、提高可讀性第三講LINGO軟件與外部文件的數據傳遞通過Windows剪貼板傳遞數據

有時候實際問題的數據在Word或Excel文件中,通常為表格形式,在編寫LINGO程序時可以通過剪貼板,將表格連同數據傳遞到LINGO中。例3.1(指派問題AssignmentProblem)設有n項工作分配給n個人去做,每人做一項。由于每個人完成各項工作所需的時間不同,設第i個人完成第j項工作需要的時間為cij(稱為效率矩陣)。問如何分配工作,使完成全部工作的總時間最少?決策變量

用0-1變量xij表示分配情況,xij=1表示指派第i個人完成第j項工作,xij=0表示不分配指派問題也稱為最優(yōu)匹配問題,是一類重要的組合優(yōu)化問題則指派問題的數學模型可以表示為第三講LINGO軟件與外部文件的數據傳遞目標函數

約束條件每人分配一項工作每項工作只分一人變量取整0-1限制n2變量,2n約束的線性整數規(guī)劃模型現有7項工作分配給7名工人去完成,他們完成各項工作所需要的時間如文件“例31.doc”中的表格所示,試作出工作分配使總時間最少。model:!7個工人,7個工作的分配問題;sets:workers/w1..w7/;jobs/j1..j7/;

links(workers,jobs):cost,x;endsetsmin=@sum(links:cost*x);!目標函數;@for(workers(I):

@sum(jobs(J):x(I,J))=1;);!每個工人只能有一份工作;@for(jobs(J):

@sum(workers(I):x(I,J))=1;);!每份工作只能有一個工人;@for(links:@bin(x));data:cost=6 2 6 7 4 2 5 4 9 5 3 8 5 8 5 2 1 9 7 4 3 7 6 7 3 9 2 7 2 3 9 5 7 2 6 5 5 2 2 8 11 4 9 2 3 12 4 5 10 ;enddataend第三講LINGO軟件與外部文件的數據傳遞cost數據從剪貼板粘貼得到第三講LINGO軟件與外部文件的數據傳遞點擊工具條上的按鈕,執(zhí)行程序,得到結果:

Globaloptimalsolutionfoundatiteration:14Objectivevalue:18.00000

VariableValueReducedCost

x(W1,J5)1.0000000.000000x(W2,J4)1.0000000.000000x(W3,J7)1.0000000.000000x(W4,J6)1.0000000.000000x(W5,J1)1.0000000.000000x(W6,J3)1.0000000.000000x(W7,J2)1.0000000.000000最優(yōu)解:工人1做工作5、工人2做工作4、工人3做工作7、工人4做工作6、工人5做工作1、工人6做工作3、工人7做工作2。最少工作總時間為18小時第三講LINGO軟件與外部文件的數據傳遞LINGO與文本文件的數據傳遞LINGO與文本文件的數據傳遞,是通過LINGO的2個輸入輸出函數@file()和@text()進行的1.函數@file的使用格式為@file(file_name);該語句可以出現在LINGO程序的集合段、數據段和初始段參數file_name是存放數據的文件名,文件名可以包含目錄路徑;如果不包含,則默認在當前目錄函數讀取的數據文件必須是純文本(ASCII碼)文件數據文件中可以包含不同的數據段,數據段之間用“~”符號分開;數據段內的多個數據間用空格或逗號分開;數據結束時不加“;”號第三講LINGO軟件與外部文件的數據傳遞例3.2在第一講例2運輸問題的程序中,可以用函數@file從數據文件中讀入模型的參數。程序改寫如下model: !6發(fā)點8收點運輸問題;sets:!

集合段;

wh/@file(data_file.txt)/:ai;

vd/@file(data_file.txt)/:dj;

links(wh,vd):C,X;endsetsmin=@sum(links:C*X); !目標函數;@for(vd(J):

@sum(wh(I):X(I,J))=dj(J));!需求約束;@for(wh(I):

@sum(vd(J):X(I,J))<=ai(I));!產量約束;data: !

數據段;

ai=@file(data_file.txt);

dj=@file(data_file.txt);C=@file(data_file.txt);enddataend第三講LINGO軟件與外部文件的數據傳遞在當前目錄下,有文件data_file.txt,其中內容格式為w1,w2,w3,w4,w5,w6~v1,v2,v3,v4,v5,v6,v7,v8~605551434152~3537223241324338~626742954953858252197433767392712395726555228143第一行中的6個字符串將成為集合wh的6個成員第二行中的8個字符串將成為集合vd的8個成員第三行中的數據將成為屬性ai的初始值,第四行中的數據將成為屬性dj的初始值第五~十行的數據是屬性c的值@file函數的工作方式:模型中第一次調用@file函數時,LINGO打開數據文件,然后讀取第一個記錄;第二次調用@file函數時,LINGO讀取第二個記錄等。文件最后一條沒有記錄結束標記,LINGO會讀取最后一條記錄,然后關閉文件。

第三講LINGO軟件與外部文件的數據傳遞2.函數@text的使用格式為@text(file_name)=變量名;該語句一般出現在LINGO程序的數據段,其中file_name是純文本文件名,由用戶按自己意愿起個名字如果文件file_name不存在,則在當前目錄下生成該文件;若存在,則其中的數據將會被覆蓋例3.3某餐廳在一周7天中需要的服務員數如下:20、16、13、16、19、14和12。假設每個服務員連續(xù)工作5天,休息2天,他們的薪水是相同的。問該餐廳至少需要雇傭多少名服務員?設周一至周日分別安排x(i)(i=1,2,…,7)個服務員開始上班,其中周一開始上班的人在周六、周日休息,以此類推。點擊工具條上的按鈕,執(zhí)行程序,得到結果:

第三講LINGO軟件與外部文件的數據傳遞model:sets:days/mon..sun/:r,x;endsetsdata:r=20161316191412;!每天所需的最少人數;@text(ex33_out.txt)=x;enddatamin=z;!最小化每周所需職員數;z=@sum(days:x); n=@size(days);@for(days(I):z-x(@wrap(I+1,n))-x(@wrap(I+2,n))>=r(I));end設總人數為z,則在周一上班的人數為z-x(2)-x(3)約束條件可以表示為滿足不等式z-x(2)-x(3)r(1)建立LINGO模型如下安排方案輸出到文件Ex33_out.txt最優(yōu)安排方案:周一至周日開始上班人數分別為

8、2、0、6、3、3、0總共至少需要22名服務員第三講LINGO軟件與外部文件的數據傳遞Globaloptimalsolutionfoundatiteration:15Objectivevalue:22.00000VariableValueReducedCostx(MON)8.0000000.000000x(TUE)2.0000000.000000x(WED)0.0000000.3333333x(THU)6.0000000.000000x(FRI)3.0000000.000000x(SAT)3.0000000.000000x(SUN)0.0000000.0000008.00000002.00000000.00000006.00000003.00000003.00000000.0000000在LINGO的當前目錄下生成文本文件ex33_out.txt其中的數據如上所示第三講LINGO軟件與外部文件的數據傳遞LINGO與Excel等數據庫文件的數據傳遞LINGO通過函數@OLE()實現與Excel文件傳遞數據,函數@OLE既可以從Excel文件中導入數據,也能將計算結果寫入Excel文件1.從Excel文件中導入數據@OLE函數可以出現在LINGO程序的集合段、數據段和初始段,從指定的Excel文件中讀取數據使用@OLE從Excel文件中導出數據有三種形式(1)變量名1,變量名2=@OLE(‘文件名’,‘數據塊名1’,‘數據塊名2’);文件名可以包括擴展名(.xls),也可以包括完整的路徑目錄名稱,默認路徑是LINGO當前的工作目錄第三講LINGO軟件與外部文件的數據傳遞打開的Excel文件中定義了2個數據塊,其中的數據分別用來對變量1和變量2進行初始化如果變量名是集合,則對應的數據塊應該是文本格式表示的集合成員名;如果變量名是屬性,則對應的數據塊應當是一系列數據;進一步,原始集合的屬性對應的數據塊是一列數據;派生集合的屬性對應的數據塊是二維矩形數據區(qū)域(2)變量名1,變量名2=@OLE(‘文件名’,‘數據塊名’);左邊的兩個變量必須定義在同一個集合中,@OLE的參數僅指定一個數據塊名,該數據快應包含兩列類型相同的數據,第一列賦值給變量1,第二列賦值給變量2(3)變量名1,變量名2=@OLE(‘文件名’);右邊的數據文件中,沒有指定數據塊的名稱,表示默認使用Excel文件中與變量名同名的數據塊第三講LINGO軟件與外部文件的數據傳遞2.將計算結果導出到Excel文件與前面類似,將計算結果導出到Excel文件也有三種形式(1)@OLE(‘文件名’,‘數據塊名1’,‘數據塊名2’)=變量名1,變量名2;將兩個變量的內容分別寫入指定Excel文件中預先定義的2個數據塊,每個數據塊的長度不能小于變量所包含的數據長度如果數據塊原來有數據,則@OLE寫入語句運行后原來的數據將被新的數據覆蓋(2)@OLE(‘文件名’,‘數據塊名’)=變量名1,變量名2;將兩個變量的內容寫入指定Excel文件中預先定義的同一數據塊(有2列)(3)@OLE(‘文件名’)=變量名1,變量名2;不指定數據塊名稱,默認使用指定Excel文件中、與變量名同名的數據塊第三講LINGO軟件與外部文件的數據傳遞例3.4(投資組合問題)設研究美國某三種股票A、B、C,在從1943年~1954年的12年的投資收益率如下表所示,表中還附有各年度500種股票的指數供參考。如果你在1955年有一筆資金計劃投資這三種股票,希望年收益率達到1.15。試給出風險最小的投資組合。收益率=(本金+收益)/本金第三講LINGO軟件與外部文件的數據傳遞設投資三種股票的資金比例分別為xi

(i=1,2,3)滿足約束條件分析投資的年收益率其中Ri是第i種股票的年收益率,它是隨機變量.用每種股票12年的平均收益率代表該股票年收益率的數學期望E(Ri).則Y的數學期望為投資者希望年收益率達1.15,則構造約束Markowitz用收益率的方差來衡量投資的風險,即方差越大風險越大,越小風險越小第三講LINGO軟件與外部文件的數據傳遞投資者年收益率Y的方差建立投資組合的Markowitz模型目標函數約束條件Markowitz模型是一個二次規(guī)劃模型均值和協(xié)方差矩陣的計算可以在Excel中完成,然后通過@OEL函數傳遞給LINGO程序第三講LINGO軟件與外部文件的數據傳遞利用股票A、B、C的數據建立Excel文件“投資組合.xls”,通過計算構造COV數據塊,存放協(xié)方差矩陣;MEAN數據塊,存放三種股票的平均收益率;暫時空的“投資份額”數據塊左圖中,從A2-C13的矩形區(qū)域中的數據為股票A、B、C的收益率數據;A16-C16區(qū)域(MEAN數據塊)為平均收益率;E4-E6(“投資份額”數據塊)為空上圖中,從B2-D4的矩形區(qū)域構成COV數據塊第三講LINGO軟件與外部文件的數據傳遞建立LINGO模型如下model:sets:stocks/A,B,C/:Mean,X;

stst(stocks,stocks):Cov;endsetsdata:Mean=@OLE(‘投資組合’,’MEAN’);!平均收益率;

Cov=@OLE(‘投資組合’,’COV’);!協(xié)方差矩陣;@OLE(‘投資組合’,‘投資份額’)=X;enddatamin=@sum(stst(i,j):Cov(i,j)*X(i)*X(j));@sum(stocks:X)=1;@sum(stocks:X*Mean)>=1.15;end第三講LINGO軟件與外部文件的數據傳遞Localoptimalsolutionfoundatiteration:14Objectivevalue:0.2054596E-01VariableValueReducedCostMEAN(A)1.0890830.000000MEAN(B)1.2136670.000000MEAN(C)1.2345830.000000X(A)0.53009160.000000X(B)0.35641490.000000X(C)0.11349350.000000三種股票的投資份額分別為0.5300916,0.3564149,0.1134935在Excel文件“投資組合.xls”中,“投資份額”數據塊已經不再是空白了,而是寫入了數據Localoptimalsolutionfoundatiteration:14Objectivevalue:0.2054596E-01ExportSummaryReportTransferMethod:OLEBASEDSpreadsheet:投資組合

RangesSpecified:1

投資份額

RangesFound:1RangeSizeMismatches:0ValuesTransferred:3VariableValueReducedCostX(A)0.53009160.000000X(B)0.35641490.000000X(C)0.11349350.000000第三講LINGO軟件與外部文件的數據傳遞第三講LINGO軟件與外部文件的數據傳遞@ODBC

:與數據庫連接輸入基本集合元素:集合名/@ODBC(‘數據源名’,‘數據表名’,‘列名’)/:屬性名;輸入派生集合元素:集合名/@ODBC(‘數據源名’,‘數據表名’,‘列名1’,‘列名2’,…)/:屬性名;目前支持下列DBMS:(如為其他數據庫,則需自行安裝驅動)ACCESS,DBASE,EXCEL,F

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論