運籌學(xué)實驗報告_第1頁
運籌學(xué)實驗報告_第2頁
運籌學(xué)實驗報告_第3頁
運籌學(xué)實驗報告_第4頁
運籌學(xué)實驗報告_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

.運籌與優(yōu)化課內(nèi)實驗 檢測實驗一:線性規(guī)劃問題與對偶問題的建模與求解一.線性規(guī)劃:滿足以下三個條件的稱之為線性規(guī)劃問題:(1)決策變量的取值是連續(xù)的,既可以為整數(shù),也可以喂分?jǐn)?shù)、小數(shù)或?qū)崝?shù)。(2)目標(biāo)函數(shù)是決策變量的線性函數(shù)。(3)結(jié)束條件是含決策變量的線性等式或者不等式。二.線性規(guī)劃模型的形式:2.1.一般形式nmaxminzcixii1ns.t.aijxj,bii1,2,mj1xj()j1,2,n0xj0(2.1)矩陣形式maxminzcTXs.t.AX,b(2.2)X0(X0)其中XTc1,c2,cnTx1,x2,xn為決策向量,c為目標(biāo)函數(shù)的系數(shù)向量,精品文本.bb1,b2,bmT為常數(shù)向量,Aaijmn為系數(shù)矩陣。2.2.標(biāo)準(zhǔn)形式所謂線性規(guī)劃問題的標(biāo)準(zhǔn)形式,是指目標(biāo)函數(shù)要求min所有約束條件都是等式約束,且所有決策定量都是非負(fù)的,即,,,,minf(x1x2xn)c1x1c2x2cnxna11x1a12x2a1nxnb1,a21x1a22x2a2nxnb2,s.t.am1x1am2x2amnxnbm,,,,,x1x2xn0三.原問題與對偶問題的表達(dá)形式和關(guān)系在線性規(guī)劃的對偶理論中,把如下線性規(guī)劃形式稱為原問題的標(biāo)準(zhǔn)形式minf(X)c1x1c2x2cnxn,a11x1a12x2a1nxnb1,axax2a2nxb,21122n2s..tam1x1am2x2amnxnbm,x1,x2,,xn 0.而把如下線性規(guī)劃形式稱為對偶問題的標(biāo)準(zhǔn)形式maxg(Y) b1y1 b2y2 bnyn,a11y1 a12y2 am1ym c1,a21y1 a22y2 am2ymc2,st..a1ny1 a2ny2 amnym cn,y1,y2,,ym 0.若用矩陣形式表示,則原問題和對偶問題分別可寫成如下形式:原問題minf(X) CX,st..對偶問題

AX b,X 0.maxg(Y) Y'b,YA C,s.t.Y 0.原問題與對偶問題的關(guān)系見表原問題(對偶問題) 對偶問題(原問題)精品文本.min目標(biāo)函數(shù)系數(shù)右邊常數(shù)約束條件系數(shù)矩陣第i個約束條件為“≥”型第i個約束條件為“=”型第i個約束條件為“≤”型第j個變量≥0第j個變量無限制第j個變量≤0

max右邊常數(shù)目標(biāo)函數(shù)系數(shù)系數(shù)矩陣的轉(zhuǎn)置第i個變量≥0第i個變量無限制第i個變量≤0第j個約束條件為“≤”型第j個約束條件為“=”型第j個約束條件為“≥”型四.實際問題與 lingo求解計算例(原問題):設(shè)某種植物每天至少需要 2g水,4g礦物質(zhì),5g維生素。已知三種肥料A,B,C;其中A種肥料含有1g水,3g維生素;B種肥料含有3g水,2g礦物質(zhì),1g維生素;C種肥料含有1g水,2g礦物質(zhì),2g維生素。其中A種肥料6元每克,B種肥料4元每克,C種肥料7元每克,要求確定既要滿足植物生長的營養(yǎng)需求,又要費用最省的選用肥料的方案。該問題的模型為:minz=6*x1+4*x2+7*x3;x13*x32;3*x12*x2x34;x12*x22*x35;s.t.0;x1x20;x30;用lingo求解代碼如下:model:min=6*x1+4*x2+7*x3;x1+3*x3>=2;3*x1+2*x2+x3>=4;精品文本.x1+2*x2+2*x3>=5;x1>=0;x2>=0;x3>=0;end求解得:Globaloptimalsolutionfoundatiteration:0Objectivevalue:12.00000VariableValueReducedCostX10.0000003.000000X21.8333330.000000X30.66666670.000000RowSlackorSurplusDualPrice112.00000-1.00000020.000000-1.00000030.33333330.00000040.000000-2.00000050.0000000.00000061.8333330.00000070.66666670.000000通過上面結(jié)果可以知道,最佳費用為12元,此時,需要A,B,C三種肥料為精品文本.0,1.833,0.667克。例(對偶形式):設(shè)某公司生產(chǎn)A,B,C三種肥料,已知生產(chǎn)A種肥料贏利2元,生產(chǎn)B種肥料贏利4元,生產(chǎn)C種肥料贏利5元。而生產(chǎn)A需要1小時設(shè)備1,3小時設(shè)備2,1小時設(shè)備3;生產(chǎn)B需要2小時設(shè)備2,2小時設(shè)備3;需要3小時設(shè)備1,1小時設(shè)備2,2小時設(shè)備3;而設(shè)備1每天可用6小時,設(shè)備2每天可用4小時,設(shè)備3每天可用7小時,求怎樣安排生產(chǎn)才能使公司的贏利最大。該問題的模型為:maxz=2*y1+4*y2+7*y3;y13*y2y36;2*y22*y34;3*y1y22*y37;s.t.0;y1y20;y30;用lingo求解model:max=2*y1+4*y2+5*y3;y1+3*y2+y3<=6;2*y2+2*y3<=4;3*y1+y2+2*y3<=7;y1>=0;y2>=0;y3>=0;end求解得:精品文本.Globaloptimalsolutionfoundatiteration:0Objectivevalue:12.00000VariableValueReducedCostY11.0000000.000000Y20.0000000.3333333Y32.0000000.000000RowSlackorSurplusDualPrice112.000001.00000023.0000000.00000030.0000001.83333340.0000000.666666751.0000000.00000060.0000000.00000072.0000000.000000例4.2.1(原問題):某企業(yè)利用3種原料B1,B2,B3生產(chǎn)2種產(chǎn)品A1,A2。3種原料的月供應(yīng)量和生產(chǎn)1噸產(chǎn)品A1,A2均可在市場銷售,企業(yè)應(yīng)如何安排月生產(chǎn)計劃,使總收益最大?單位產(chǎn)品消耗A1A2原料月供應(yīng)量原料(t)精品文本.B111150B223240B332300單位產(chǎn)品價格(萬元2.41.8/t)設(shè)計劃生產(chǎn)產(chǎn)品 Ai的數(shù)量為xi(t/月),i=1,2,則所討論的原問題的數(shù)學(xué)模型為:maxz=2.4*x1+1.8*x2;x1x21502*x13*x2240s.t.3*x12*x2300x10;x20;用lingo求解model:max=2.4*x1+1.8*x2;x1+x2<=150;2*x1+3*x2<=240;3*x1+2*x2<=300;x1>=0;x2>=0;end求解得:Globaloptimalsolutionfoundatiteration:0Objectivevalue:244.8000精品文本.VariableValueReducedCostX184.000000.000000X224.000000.000000RowSlackorSurplusDualPrice1244.80001.000000242.000000.00000030.0000000.120000040.0000000.7200000584.000000.000000624.000000.000000(對偶問題):設(shè)原料 B1,B2,B3的價格為 y1,y2,y3(萬元/t),顯然,應(yīng)有yi>=0,I=1,2,3.由原問題的條件,生產(chǎn) 1t產(chǎn)品A1需消耗1t原料B1,2t原料B2,3t原料B3,可獲得收益為2.4萬元。因此,若將生產(chǎn) 1t產(chǎn)品A1的這些原料賣出所得的收益為y1+2*y2+3*y3(萬元)它必須不少于生產(chǎn) 1t產(chǎn)品A1所得的收益,對于該企業(yè)才是合算的。所以應(yīng)有 y1+2*y2+3*y3>=2.對于產(chǎn)品 A2,可類似得到y(tǒng)1+2*y2+3*y3>=1.8。同時,若買方(公司)欲購買該工廠的全部原料,則應(yīng)付出150*y1+240*y2+300*y3萬元(這也是該工廠賣出全部原料的總收益)。從買方角度應(yīng)使總支出金可能地少。因此,可得到線性規(guī)劃問題。該問題的模型為:精品文本.minf=150*y1+240*y2+300*y3y12*y23*y32.4y13*y22*y31.8s.t.y10;y20;y30;用lingo求解model:min=150*y1+240*y2+300*y3;y1+2*y2+3*y3>=2.4y1+3*y2+2*y3>=1.8;y1>=0;y2>=0;y3>=0;求解得:Globaloptimalsolutionfoundatiteration:4Objectivevalue:244.8000VariableValueReducedCostY10.00000042.00000Y20.12000000.000000Y30.72000000.000000Row SlackorSurplus DualPrice1 244.8000 -1.000000精品文本.20.000000-84.0000030.000000-24.0000040.0000000.00000050.12000000.00000060.72000000.000000五.實驗分析1.針對上面的線性規(guī)劃問題,每個問題都相應(yīng)的給出了具體的對偶問題,方便的比較。2.利用lingo軟件求解,速度快,精度高。實驗二:基于匈牙利解法的指派問題建模與求解一、指派問題與匈牙利解法指派問題又稱分配問題,其用途非常廣泛,比如某公司指派 n個人去做 n件事,各人做不同的一件事,如何安排人員使得總費用最少?若考慮每個職工對工作的效率(如熟練程度等),怎樣安排會使總效率達(dá)到最大?這些都是一個企業(yè)經(jīng)營管理者必須考慮的問題,所以該問題有重要的應(yīng)用價值 .雖然指派問題可以用 0-1規(guī)劃問題來解,設(shè) X(I,J)是0-1變量, 用X(I,J)=1表示第I個人做第J件事,X(I,J)=0表示第I個人不做第J件事.設(shè)非負(fù)矩陣C(I,J)表示第I個人做第J件事的費用, 則問題可以寫成LINGO程序SETS:PERSON/1..N/;精品文本.WORK/1..N/;WEIGHT(PERSON,WORK):C,X;ENDSETSDATA:W=?ENDDATAMIN=@SUM(WEIGHT:C*X);@FOR(PERSON(I):@SUM(WORK(J):X(I,J))=1);@FOR(WORK(J):@SUM(PERSONM(I):X(I,J))=1);@FOR(WEIGHT:@BIN(X));其中2*N個約束條件是線性相關(guān)的 ,可以去掉任意一個而得到線性無關(guān)條件.但是由于有N^2個0-1變量,當(dāng)N很大時,用完全枚舉法解題幾乎是不可能的.而已有的0-1規(guī)劃都是用隱枚舉法做的,計算量較大 .對于指派問題這種特殊的0-1規(guī)劃,有一個有效的方法——匈牙利算法,是 1955年W.W.Kuhn利用匈牙利數(shù)學(xué)家D.K?nig的二部圖G的最大匹配的大小等于 G的最小頂點覆蓋的大小的定理提出的一種算法,這種算法是多項式算法,計算量為 O(N3).匈牙利算法的基本原理是基于以下兩個定理 .定理1 設(shè)C=(Cij)n×n是指派問題的效益矩陣,若將 C中的任一行(或任一列)減去該行(或該列)中的最小元素,得到新的效率矩陣 C’,則C’對應(yīng)的新的指派問題與原指派問題有相同的最優(yōu)解 .定理2 效率矩陣C中獨立的0元素的最多個數(shù)等于覆蓋所有 0元素的最少精品文本.直線數(shù).當(dāng)獨立零元素的個數(shù)等于矩陣的階數(shù)時就得到最優(yōu)解 .二.模型擴(kuò)展1、目標(biāo)函數(shù)最大化的指派問題模型對于最大化的指派問題nmaxfcijxiji,j1ni1xij1(j1,2,n)ns.t.xij1(i1,2,n)j1xij0或i,j1,2,n1不能將目標(biāo)函數(shù)改為nminzf(cij)xiji,j1來實現(xiàn)求解,因為匈牙利算法要每一個系數(shù)都為非負(fù) .因此,對于最大化的指派問題,只能在效率矩陣 C=(cij)n×n找出最大的數(shù)M,然后進(jìn)行矩陣變換,即可以討論矩陣 B=M – C,其中 M=max(max(C))*ones(size(C)),將原指派問題模型轉(zhuǎn)化為同解指派問題模型:n nminz(Mcij)xijbijxiji,j1i,j1nxij1(j1,2,n)i1s.t.nxij1(i1,2,n)j1xij或1i,j1,2,n0再用匈牙利算法求解即可 .2、效率矩陣不是方陣的指派問題模型精品文本.⑴若人多事少,可以添上一些虛擬的事,這些事被各人做的費用可取為零 .⑵若人少事多,可以添上一些虛擬的人,他們做各事的費用可取為零 .⑶若一個人可同時做幾件事 ,可以將這人化為相同的幾個人 ,費用不變.⑷若規(guī)定某人不能做某事 ,求最小時則可令這人做這事的費用為充分大的數(shù)(在MATLAB中可取為inf);求最大時則可令這人做這事的費用為 0,然后按目標(biāo)函數(shù)最大化的指派問題數(shù)學(xué)模型的求解方式求解 .三.匈牙利解法的缺陷與改進(jìn)3.1、算法的不足之處指派問題就是給定一個 n階非負(fù)矩陣A={A(I,J)}, 求一個0-1矩陣X(I,J),使得f min AI,JXI,J眾所周知,求這個問題的一個方法是 在1955年利用匈牙利數(shù)學(xué)家D.K?nig的關(guān)于矩陣中獨立0元素的定理(即矩陣中獨立零元素的最大個數(shù)等于覆蓋全部0元素的直線的最少條數(shù) )提出了解指派問題的一種算法 .步驟一:將系數(shù)矩陣 A的各行元素分別減去本行中的最小元素 , 再將所得矩陣(仍記為A)的各列元素分別減去本列中的最小元素 .這樣所得矩陣 A的各行和各列中都有0元素.步驟二:求A的最大個數(shù)的獨立 0元素,如個數(shù)等于 n,則完成.不然進(jìn)行下一步.步驟三:求覆蓋矩陣A所有0元素的最少數(shù)目的直線,求A中所有未被直線覆蓋的元素中的最小數(shù) m,把未被直線覆蓋的行中各元素都減去 m,再把A的被直線覆蓋的各列中各元素都加上 m.轉(zhuǎn)步驟二.精品文本.這是一種正確的多項式算法,但是我們發(fā)現(xiàn)現(xiàn)有的文獻(xiàn)中具體實現(xiàn)步驟二的算法是有缺陷的,敘述如下:現(xiàn)有的求最大個數(shù)的獨立 0元素的算法是:步驟一:找只有一個沒有標(biāo)記的 0元素的行,如無轉(zhuǎn)步驟三步驟二:將該0元素標(biāo)記為獨立 0元素,并把該獨立0元素所在的列的其他 0元素標(biāo)記為非獨立 0元素,轉(zhuǎn)步驟一步驟三:找只有一個沒有標(biāo)記的 0元素的列,如無轉(zhuǎn)步驟五步驟四:將該0元素標(biāo)記為獨立 0元素,并把該獨立0元素所在的行的其他 0元素標(biāo)記為非獨立 0元素,轉(zhuǎn)步驟三步驟五:找沒有標(biāo)記的0元素,如無,完成最大個數(shù)的獨立 0元素的尋求.步驟六:未標(biāo)記的0元素在每行及每列的個數(shù)都大于 1,按某種規(guī)則取某個0元素標(biāo)記為獨立 0元素,并把該獨立0元素所在的行和列的其他 0元素標(biāo)記為非獨立0元素,轉(zhuǎn)步驟一.對于已求出最大個數(shù)的獨立 0元素但個數(shù)小于n的矩陣A,一般文獻(xiàn)上介紹的求覆蓋全部零元素的方法是:步驟一:對所有無獨立0元素的行打?;步驟二:若無新打?的行,轉(zhuǎn)步驟六;步驟三:對新打?的行中的非獨立 0元素所在的列打 ?;步驟四:若無新打?的列,轉(zhuǎn)步驟六;步驟五:對新打? 的列中的獨立0元素所在的行打?.轉(zhuǎn)步驟二;步驟六:用直線覆蓋沒有打 ?的行與打?的列.3.2、算法漏洞分析精品文本.但是我們發(fā)現(xiàn),在求最大個數(shù)的獨立 0元素的方法中的步驟六有漏洞 .就是說在當(dāng)行和列中未標(biāo)記的 0元素的個數(shù)都大于 1時在獨立0元素的確定上可能會把不應(yīng)當(dāng)是獨立 0元素的0元素錯誤地確定為獨立 0元素,從而得不到最大個數(shù)的獨立0元素.一般文獻(xiàn)上介紹的求最大個數(shù)的獨立 0元素的方法中,當(dāng)矩陣中各行各列的無標(biāo)記的0元素的個數(shù)都大于 1時,求獨立0元素的規(guī)則有兩種:規(guī)則1: 可任選其中一個0元素為獨立0元素(本文用上標(biāo)加撇來標(biāo)記:0’),同時標(biāo)記同行和同列中其它 0元素為非獨立0元素(本文用加一橫線來標(biāo)記:0).規(guī)則2: 若各行中無標(biāo)記的 0元素至少有兩個,?.從剩有0元素最少的行開始,比較這行各 0元素所在列中0元素的數(shù)目,選擇 0元素少的那列的這個 0元素為獨立0元素.然后標(biāo)記同行同列的其它 0元素為非獨立 0元素.現(xiàn)有的算法中的缺點在于在確定獨立零元素時不一定能得到最大個數(shù)的獨立零元素,從而算法會失敗.我們找到以下一個有 6個獨立0元素的6階矩陣A,其中每行每列都有二個或 2個以上的0元素,其中用 0’表示是獨立0元素,0表示劃線的0元素,1表示任意正數(shù)):0 1 1 0 1 10 0 1 1 1 11 0 0 1 1 1(1)1 1 1 0 0 01 1 1 1 0 01 0 0 1 1 1但是按照取第一行第一列的 0元素為獨立0元素時只能得到以下所示 5個獨立0元素,小于最大獨立0元素的個數(shù)6,而需要覆蓋全部零元素的直線的條數(shù)是6條豎線,導(dǎo)致算法失?。壕肺谋?0 1 1 0 1 10 0 1 1 1 11 0 0 1 1 1(2)1 1 1 0 0 01 1 1 1 0 01 0 0 1 1 1從以上例子可見文獻(xiàn)中敘述的獨立 0元素的求法不一定能得到最大數(shù)目的獨立零元素.我們可以用兩種方法構(gòu)造任意大于 6階的類似的例子,如以下 10階的兩個例子分別應(yīng)該有 10個獨立0元素,但按不當(dāng)?shù)剡x取獨立 0元素時只能得到 9個獨立0元素.01111110110110111111001111111100111111111001111111100111111111001111111110001111111001111111110011111111001111100111111111111001111111110111111111100011111110111111111000111111110111111001111111111110通過把這些矩陣作為對角塊,其余元素為正數(shù)的矩陣可以構(gòu)造更多的這種例子.3.3、算法的更正由于問題出在求最大個數(shù)的獨立零元素上,我們在算法中增加了利用求 M-增廣路的方法[3]來保證能得到最大個數(shù)的獨立零元素 .我們提出的更正的完整的算法如下 :一、化約矩陣將系數(shù)矩陣A的各行元素分別減去本行中的最小元素 , 再將所得矩陣(仍記精品文本.為A)的各列元素分別減去本列中的最小元素.這樣所得矩陣A的各行和各列中都有0元素.二、標(biāo)記零元素找只有一個沒有標(biāo)記的0元素的行,將該0元素標(biāo)記為0’(獨立0元素),并把該0’所在的列的其他 0元素標(biāo)記為0(劃線零元素),轉(zhuǎn)1.如無轉(zhuǎn)2.⒉找只有一個沒有標(biāo)記的 0元素的列,將該0元素標(biāo)記為0’,并把該0’所在的行的其他 0元素標(biāo)記為0,轉(zhuǎn)2;如無轉(zhuǎn)3.⒊若未標(biāo)記的0元素在其所在的行及列的個數(shù)都大于 1,取未標(biāo)記的 0元素最少的行或列中取一個所在列或行上 0元素個數(shù)較少的零元素標(biāo)記為 0’,并把該0’所在的行和列的其他 0元素標(biāo)記為0,轉(zhuǎn)1;如無,轉(zhuǎn)三.三、求最小點覆蓋(即最小直線覆蓋)⒈若0’的個數(shù)等于n,完成;否則,轉(zhuǎn) 2.⒉對所有沒有0’的行標(biāo)記為 S,對S行中的0所在列標(biāo)記為T,將T列上0’所在的行標(biāo)記為 TS,將S行T列上0標(biāo)記為0.⒊將S行和T列分別標(biāo)記為S'和T',將TS改為S.如S行中的某行上的0位于未標(biāo)志的列上,標(biāo)記該列為T,如所有的T列上都有0’,將0’所在的行標(biāo)為TS.將S行T列上的0標(biāo)為為0,轉(zhuǎn)2.不然,若S行中的某行上的0位于未標(biāo)志某個列上,而該列上沒有0’,則存在M-增廣路,在增廣路上交換0和0’.取消行、列的標(biāo)記,轉(zhuǎn)三;若S行上不存在位于未標(biāo)志的列上的0,將S改為S',轉(zhuǎn)四.四、進(jìn)一步化約矩陣用直線覆蓋標(biāo)記為 T'的列和沒有標(biāo)記為 S'的行.即最小點覆蓋是(X-S')?T',求矩陣中所有未被直線覆蓋的元素中的最小數(shù) m,把未被直線覆蓋的行中各元素都減去m,再把被直線覆蓋的各列中各元素都加上 m.去掉所有的標(biāo)記,轉(zhuǎn)二.四.實際問題分析與求解4.1(基于匈牙利解法的問題求解):某出版社有A、B、C、D、E五名專業(yè)精品文本.翻譯,他們翻譯五種外文的速度(印刷字符 /小時)如表所示.若規(guī)定一名翻譯只能翻譯一種外文,問:⑴若C翻譯不懂法語、D翻譯不懂英語(如表所示)如何安排效率最高?⑵若根據(jù)原文作者的要求, A翻譯必須翻譯德語,E翻譯必須翻譯日語,如何安排效率最高?語種英法俄德日翻譯A1000700800800600B80060010009001100C900/700900900D/1000700700800E700700700900900解析:⑴此問題是一個有條件的指派問題的求解,C翻譯不懂法語、D翻譯不懂英語,故設(shè)翻譯 C翻譯法語、翻譯 D翻譯英語的效率為零.于是,該有條件的指派問題的效率矩陣 C為:100070080080060080060010009001100C90007009009001000700700800700700700900900目標(biāo)函數(shù)為:5maxz cijxij.i,j1將其化為求極小化問題: bij=max{cij}-cij,于是精品文本.min1004003003005001000300200200400300500100200003005001002000B2001100400200200200090020000110010040040030010010000300300200400400400200200200200200200000010000min03001002004000300100200400300500020003005000200009001000009001000010000200300200100002003002002002001000020020010000所以,效率最高的最優(yōu)安排方案是 A翻譯英語、B翻譯俄語、C翻譯德語、D翻譯法語、E翻譯日語.⑵若根據(jù)原文作者的要求, A翻譯必須翻譯俄語、E翻譯必須翻譯日語,可視為此時只有B、C、D三名翻譯需要安排任務(wù),使之總的效率最高。語種英法俄翻譯B8006001000C900/700D/1000700于是,該指派問題的效率矩陣 C為:8006001000C900070001000700目標(biāo)函數(shù)為:3maxz cijxij.i,j1精品文本.將其化為求極小化問題: bij=max{cij}-cij,于是min2004000020040002004000B1001000300100090020009002001000030001000030010000300000min所以,在滿足A翻譯必須翻譯德語、E翻譯必須翻譯日語的前提下, B翻譯俄語、C翻譯英語、D翻譯法語,這樣分配時,效率最高 .4.2(標(biāo)準(zhǔn)指派問題軟件求解) :分配甲、乙、丙、丁、戊完成 A,B,C,D,E五項任務(wù),每人完成一項,每項任務(wù)只能由一個人完成, 五個人完成任務(wù)所需時間如下表,做出合理安排,使總時間最少 .人ABCDE甲8610912乙9127119丙74358丁958118戊467511(1)Lingo程序求解代碼如下:model:sets:a/1..5/;time(a,a):t,n;endsetsdata:精品文本.t=8610912912711974358958118467511;enddatamin=@sum(time:t*n);@for(a(i):@sum(a(j):n(i,j))=1);@for(a(j):@sum(a(i):n(i,j))=1);end結(jié)果:Globaloptimalsolutionfoundatiteration:6Objectivevalue:30.00000VariableValueReducedCostT(1,1)8.0000000.000000T(1,2)6.0000000.000000T(1,3)10.000000.000000T(1,4)9.0000000.000000T(1,5)12.000000.000000T(2,1)9.0000000.000000T(2,2)12.000000.000000精品文本.T(2,3)7.0000000.000000T(2,4)11.000000.000000T(2,5)9.0000000.000000T(3,1)7.0000000.000000T(3,2)4.0000000.000000T(3,3)3.0000000.000000T(3,4)5.0000000.000000T(3,5)8.0000000.000000T(4,1)9.0000000.000000T(4,2)5.0000000.000000T(4,3)8.0000000.000000T(4,4)11.000000.000000T(4,5)8.0000000.000000T(5,1)4.0000000.000000T(5,2)6.0000000.000000T(5,3)7.0000000.000000T(5,4)5.0000000.000000T(5,5)11.000000.000000N(1,1)0.0000000.000000N(1,2)0.0000000.000000N(1,3)0.0000003.000000N(1,4)1.0000000.000000精品文本.N(1,5)0.0000003.000000N(2,1)0.0000001.000000N(2,2)0.0000006.000000N(2,3)0.0000000.000000N(2,4)0.0000002.000000N(2,5)1.0000000.000000N(3,1)0.0000003.000000N(3,2)0.0000002.000000N(3,3)1.0000000.000000N(3,4)0.0000000.000000N(3,5)0.0000003.000000N(4,1)0.0000002.000000N(4,2)1.0000000.000000N(4,3)0.0000002.000000N(4,4)0.0000003.000000N(4,5)0.0000000.000000N(5,1)1.0000000.000000N(5,2)0.0000004.000000N(5,3)0.0000004.000000N(5,4)0.0000000.000000N(5,5)0.0000006.000000RowSlackorSurplusDualPrice精品文本.130.00000-1.00000020.000000-9.00000030.000000-9.00000040.000000-5.00000050.000000-8.00000060.000000-5.00000070.0000001.00000080.0000003.00000090.0000002.000000100.0000000.000000110.0000000.000000(2)MATLAB求解此模型的代碼:C=[8610912;9127119;74358;958118;467511];n=size(C,1);C=C(:);A=[];B=[];Ae=zeros(2*n,n^2);fori=1:nforj=(i-1)*n+1:n*iAe(i,j)=1;end精品文本.fork=i:n:n^2Ae(n+i,k)=1;endendBe=ones(2*n,1);Xm=zeros(n^2,1);XM=ones(n^2,1);[x,z]=linprog(C,A,B,Ae,Be,Xm,XM);x=reshape(x,n,n);disp('×?ó??a???ó:');?aAssignment=round(x)disp('×?ó??a?a:');zOptimizationterminated.最優(yōu)解矩陣為:Assignment=00000000010010001000精品文本.1 0 0 0 0最優(yōu)解為:z=30.00003)基于改進(jìn)匈牙利算法的matlab程序代碼%主程序function[f,D,G]=assign(W)%指派問題求最小費用的主程序,如求最大效益,改 W=max(W(:))-W,f=max(W(:))*n-f即可輸入-W:指派問題的系數(shù)矩陣,W(I,J)表示第I人做第j事的費用輸出-D:行向量,第I人做第D(I)件事.-G:行向量,第J事讓第G(J)人做.-f:最小費用null=min(W,[],2);f=sum(null);%null:各行最小元素;f:目標(biāo)函數(shù)值的改變.n=numel(null);%n權(quán)陣的階數(shù)W=W-repmat(null,1,n);%權(quán)陣各行減去本行最小元素null=min(W,[],1);f=f+sum(null);%null:權(quán)陣各列最小元素 ;f:目標(biāo)函數(shù)值的改變.W=W-repmat(null,n,1);%權(quán)陣各列減去本列最小元素,至此權(quán)陣各行各列至少有一個0while1精品文本.[D,G,E]=assignz(W,n);%調(diào)用標(biāo)記獨立0的程序assignz;S=find(D==0); %無獨立0的行標(biāo)ifisempty(S)return;end;%如有n個獨立0,完成指派工作[D,G,SP,TP]=assignln(D,G,E,S,n);%調(diào)用求最少劃線程序 assignlnnum=numel(SP)-numel(TP);%最少劃線數(shù)=n-numifnum %劃線數(shù)小于n時,變換權(quán)陣null=setdiff(1:n,TP); %此null是沒有劃線的列標(biāo)m=min(min(W(SP,null))); %此m為未被直線覆蓋的元素中的最小數(shù)W(SP,null)=W(SP,null)-m;%未被直線覆蓋的元素都減去 mnull=setdiff(1:n,SP); %此add是劃過線的行標(biāo),標(biāo)記獨立0W(null,TP)=W(null,TP)+m;%余下的行和列加上 mf=f+m*num; %目標(biāo)函數(shù)值的改變.elsereturn; %劃線數(shù)=n時完成end;end;%子程序function[D,G,E]=assignz(W,n)%選獨立0的子程序C=zeros(n);C(find(W==0))=1;E=C;%C:未標(biāo)記的0;E:非獨立的0D=zeros(1,n);G=zeros(1,n);%第I人做第D(I)事.第J事讓第G(J)人做.u=sum(C,2);v=sum(C);%u(i)第i行中的未標(biāo)記的0的個數(shù),v(j)第j列中未標(biāo)記的0的個數(shù)whileany(u)精品文本.row=find(u==1,1);%行中只有一個未標(biāo)記的 0的第一個行標(biāo)whilerowcol=find(C(row,:)==1,1);%第row行0所在的列標(biāo)D(row)=col;G(col)=row;E(row,col)=0;u=u-C(:,col);v(col)=0;C(:,col)=0; %刪去第col列的0row=find(u==1,1); %為循環(huán)作預(yù)處理end; %這時行中不是只有一個未標(biāo)記的 0col=find(v==1,1); %求列中只有一個未標(biāo)記的 0的列標(biāo)whilecolrow=find(C(:,col)==1,1);%求零元素所在的行標(biāo) rowD(row)=col;G(col)=row;E(row,col)=0;%第row行第col列為獨立0v=v-C(row,:);u(row)=0;C(row,:)=0; %刪除第row行的0col=find(v==1,1); %為循環(huán)作預(yù)處理end;if any(u) %這時行列中未標(biāo)記的 0多于一個row=find(u,1);col=find(C(row,:),1);D(row)=col; G(col)=row;E(row,col)=0;u=u-C(:,col);u(row)=0;v=v-C(row,:);v(col)=0;C(:,col)=0;精品文本.C(row,:)=0;elsereturn;end;end;子程序function[D,G,SP,TP]=assignln(D,G,E,S,n)%劃線子程序un=S;SP=[];TP=[]; %記錄打勾的行標(biāo) SP及列標(biāo)TPF=zeros(n); %F用于追溯M-交替路while~isempty(S) %有新打勾的S行時[null,T]=find(E(S,:));%新打勾的S行中非獨立零元素所在的列 TT=setdiff(T,TP); %新打勾的列ifisempty(T)SP=union(SP,S);return;end%無新打勾的列時退出F(S,T)=E(S,T); %打勾的行列相交點的位置,用于追溯 M-交替路SP=union(SP,S);TP=union(TP,T);%已打勾的行標(biāo)SP及列標(biāo)TPStemp=G(T); %求新打勾的T列中獨立0所在的行P=find(Stemp==0); %新打勾的T列中不存在獨立 0,追溯M-增廣路if~isempty(P) %當(dāng)新打勾的某列上無獨立 0時Tun=T(P); %新打勾的T列中無獨立0的列標(biāo)[r,c]=find(E(S,Tun),1);%求S行Tun列中一個刪除0的位置row=S(r);col1=Tun(c); %刪除0位于row行,col1列while1精品文本.E(row,col1)=0;%刪除0改為獨立0col2=D(row);D(row)=col1; G(col1)=row;%改變指派的事和人ifismember(row,un)break;end; %當(dāng)追溯到row在un中時結(jié)束E(row,col2)=1;%獨立0改為刪除0row=find(F(:,col2),1);col1=col2;endS=find(D==0); un=S; SP=[];TP=[];F=zeros(n);%清除標(biāo)記,為循環(huán)作準(zhǔn)備elseS=Stemp;end;end;運行結(jié)果;f=30D=1 5 3 2 4G=精品文本.1 4 3 5 24.3(非標(biāo)準(zhǔn)指派問題 lingo解法)公司現(xiàn)有41個技術(shù)人員,其結(jié)構(gòu)和相應(yīng)的工資水平如下:工資情況 高級工程師 工程師 助理工程師 技術(shù)員人數(shù) 9 17 10 5日工資(元) 250 200 170 110公司承接4個工程項目,兩項是在 A地和B地現(xiàn)場施工監(jiān)理;另外兩項是 C和D地工程設(shè)計,主要工作在辦公室完成。各項目的合同對有關(guān)技術(shù)人員的收費標(biāo)準(zhǔn)不同。收費(元/天)高級工程師工程師助理工程師技術(shù)員A1000800600500B1500800700600C1300900700400D1000800700500各項目對專業(yè)技術(shù)人員結(jié)構(gòu)的要求工資情況項目ABCD高級工程師1~32~521~2工程師>=2>=2>=22~8助理工程師>=2>=2>=2>=1技術(shù)員>=1>=3>=1—總計<=10<=16<=11<=18精品文本.CD兩項目是在辦公室完成所以每人每天有 50元開支.如何合理地分配現(xiàn)有的技術(shù)力量,使公司每天的直接收益最大?Lingo求解代碼如下:model:sets:job/1..4/:e;worker/1..4/:a,b;link(job,worker):d,x;endsetsdata:a=917105;b=250200170110;d=1000800600500150080070060013009007004001000800700500;e=10161118;enddatamax=@sum(link(i,j):d(i,j)*x(i,j)-b(j)*x(i,j))-@sum(worker(j)|j#ge#3:50*@sum(job(i):x(i,j)));@for(worker(j):@sum(job(i):x(i,j))<=a(j));精品文本.@for(job(i):@sum(worker(j):x(i,j))<=e(i));x(1,1)>=1;x(1,1)<=3;x(2,1)>=2;x(2,1)<=5;x(3,1)>=2;x(3,1)<=2;x(4,1)>=1;x(4,1)<=2;x(1,2)>=2;x(2,2)>=2;x(3,2)>=2;x(4,2)>=2;x(4,2)<=8;x(1,3)>=2;x(2,3)>=2;x(3,3)>=2;x(4,3)>=1;x(1,4)>=1;x(2,4)>=3;x(3,4)>=1;@for(link:@gin(x));EndGlobaloptimalsolutionfound.Objectivevalue:30.00000Totalsolveriterations:10VariableValueReducedCostCAPACITY(W1)1.0000000.000000CAPACITY(W2)1.0000000.000000CAPACITY(W3)1.0000000.000000CAPACITY(W4)1.0000000.000000CAPACITY(W5)1.0000000.000000DEMAND(J1)1.0000000.000000DEMAND(J2)1.0000000.000000DEMAND(J3)1.0000000.000000DEMAND(J4)1.0000000.000000DEMAND(J5)1.0000000.000000精品文本.COST(W1,J1)8.0000000.000000COST(W1,J2)6.0000000.000000COST(W1,J3)10.000000.000000COST(W1,J4)9.0000000.000000COST(W1,J5)12.000000.000000COST(W2,J1)9.0000000.000000COST(W2,J2)12.000000.000000COST(W2,J3)7.0000000.000000CO

溫馨提示

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

評論

0/150

提交評論