數學建模四0-1規划


這是問題:

 

 解:

 

單位換算:1‘06’8=66.8秒 

重點:記Cij為隊員i泳姿為j的成績;i=1,2,3,4,5;j=1,2,3,4;Xij=1即隊員i參加泳姿j的比賽;

①.lingo代碼

 

Min=66.8*x11+75.6*x12+87*x13+58.6*x14+57.2*x21+66*x22+66.4*x23+53*x24+78*x31+67.8*x32+84.6*x33+59.4*x34+70*x41+74.2*x42+
69.6*x43+57.2*x44+67.4*x51+71*x52+83.8*x53+62.4*x54;
%指不等式約束條件A*x<=b指每個人最多參加一種姿勢游泳 [st_1] x11+x12+x13+x14<1; [st_2] x21+x22+x23+x24<1; [st_3] x31+x32+x33+x34<1; [st_4] x41+x42+x43+x44<1; [st_5] x51+x52+x53+x54<1;

%指等式約束條件Aeq*x=beq指每種姿勢游泳有且僅有一個人參加 [st_6] x11+x21+x31+x41+x51=1; [st_7] x12+x22+x32+x42+x52=1; [st_8] x13+x23+x33+x43+x53=1; [st_9] x14+x24+x34+x44+x54=1;

  

%注意一條條羅列

結果如:

 

 

 

 注意看結果,最快成績為253.2秒,x14=x21=x32=x43=1;其它=0;此時甲-自由泳;乙-蝶泳;丙-仰泳;丁-蛙泳

 

②matlab代碼【超級詳細!!看一遍就會!!】

>>  f=[66.8 75.6 87 58.6 57.2 66 66.4 53 78 67.8 84.6 59.4 70 74.2 69.6 57.2 67.4 71 83.8 64.2];
>> A=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0;...
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1];
>>  b=[1;1;1;1;1];
%指不等式約束條件A*x<=b指每個人最多參加一種姿勢游泳

>>  Aeq=[1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0;0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0;0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ;...
0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ];
>>  beq=[1;1;1;1];
%指等式約束條件Aeq*x=beq指每種姿勢游泳有且僅有一個人參加

>> intcon=1:1:20;%指20個整數變量的位置
>> lb=zeros(20,1);%指每個整數變量的下界為0;這里也可以寫zeros(20)或者zeros(1,20)只是生成向量的方式的問題,只要最后結果是個向量都可以
>> ub=ones(20,1);%指每個整數變量的上界為1;這里也可以寫zeros(20)或者zeros(1,20)
>> [x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)%用函數intlinprog求解整數線性規划問題,用bintprog也可以

運行結果為:

LP:                Optimal objective value is 253.200000.                                           


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value,
options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are integer within tolerance, options.IntegerTolerance = 1e-05
(the default value).


x =

     0
     0
     0
     1
     1
     0
     0
     0
     0
     1
     0
     0
     0
     0
     1
     0
     0
     0
     0
     0


fval =

  253.2000

總結:lingo代碼相對簡單。matlab代碼很容易敲錯,一定要細心;再就是剖析題目的能力要加強,學會從實際問題中抽出數學模型,進而求解。本題是一個0-1規划問題,並可以使用二維向量來理解;即Xij=1就是第i個人第j種泳姿參加比賽;Xij=0就是第i個人第j種泳姿不參加比賽!在寫matlab向量一定要細心,還有時間換算將60分制化為百分制!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM