日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数学建模 分支限界算法求解整数规划原理以及编程实现

發(fā)布時間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学建模 分支限界算法求解整数规划原理以及编程实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引入

線性規(guī)劃問題(松弛問題)

圖解法:
使用圖解法求出最優(yōu)解,再使用四舍五入求出的整數(shù)解不滿足條件

完全枚舉法(窮舉法):找出集合內(nèi)所有滿足條件的整數(shù)點,再帶入不等式中,看是否有最優(yōu)解

分支限界法

說明:
松弛問題:線性規(guī)劃問題
ILP:整數(shù)規(guī)劃,在線性規(guī)劃的基礎(chǔ)上對決策變量進行取整
所以線性規(guī)劃無可行解則整數(shù)規(guī)劃也無可行解

  • 增加約束條件,一個個來,一次增加一個
    對原始結(jié)果進行向上取整 [4.6]=5
    對原始結(jié)果進行向下取整 [4.6]=4

    流程:
    如果添加完約束之后仍然沒有找到整數(shù)解,那么此時分支限界法已經(jīng)不能解決此問題了

    案例

    整數(shù)規(guī)劃的最優(yōu)解只是針對決策變量x的,與目標值Z無關(guān)
    所以x1=4;x2=1;z=14.3(是整數(shù)規(guī)劃的最優(yōu)解)
    1)當增加了x1<=3的條件之后,得出的結(jié)果中出現(xiàn)了非整數(shù)x2=2.67;所以此時還需要對x2向下取整與向上取整,看結(jié)果對比


    判斷:
    得到目標值高的先進行分支

    matlab代碼

    branchbound.m

    function [newx,newfval,status,newbound] = branchbound(f,A,B,I,x,fval,bound,Aeq,Beq,lb,ub,e)% 分支定界法求解整數(shù)規(guī)劃 % f,A,B,Aeq,Beq,lb,ub與線性規(guī)劃相同 % I為整數(shù)限制變量的向量 % x為初始解,fval為初始值options = optimset('display','off'); [x0,fval0,status0]=linprog(f,A,B,Aeq,Beq,lb,ub,[],options);%遞歸中的最終退出條件 %無解或者解比現(xiàn)有上界大則返回原解 if status0 <= 0 || fval0 >= boundnewx = x;newfval = fval;newbound = bound;status = status0;return; end%是否為整數(shù)解,如果是整數(shù)解則返回 intindex = find(abs(x0(I) - round(x0(I))) > e); if isempty(intindex) %判斷是否為空值newx(I) = round(x0(I));newfval = fval0;newbound = fval0;status = 1;return; end%當有非整可行解時,則進行分支求解 %此時必定會有整數(shù)解或空解 %找到第一個不滿足整數(shù)要求的變量 n = I(intindex(1)); addA = zeros(1,length(f)); addA(n) = 1; %構(gòu)造第一個分支 x<=floor(x(n)) A = [A;addA]; B = [B,floor(x(n))];%向下取整 [x1,fval1,status1,bound1] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e); A(end,:) = []; B(:,end) = []; %解得第一個分支,若為更優(yōu)解則替換,若不是則保持原狀status = status1; if status1 > 0 && bound1 < boundnewx = x1;newfval = fval1;bound = fval1;newbound = bound1; elsenewx = x0;newfval = fval0;newbound = bound; end%構(gòu)造第二分支 A = [A;-addA]; B = [B,-ceil(x(n))];%向上取整 [x2,fval2,status2,bound2] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e); A(end,:) = []; B(:,end) = [];%解得第二分支,并與第一分支做比較,如果更優(yōu)則替換 if status2 > 0 && bound2 < boundstatus = status2;newx = x2;newfval = fval2;newbound = bound2; end

    intprog.m

    function [x,fval,status] = intprog(f,A,B,I,Aeq,Beq,lb,ub,e) %整數(shù)規(guī)劃求解函數(shù) intprog() % 其中 f為目標函數(shù)向量 % A和B為不等式約束 Aeq與Beq為等式約束 % I為整數(shù)約束 % lb與ub分別為變量下界與上界 % x為最優(yōu)解,fval為最優(yōu)值 %例子: % maximize 20 x1 + 10 x2 % S.T. % 5 x1 + 4 x2 <=24 % 2 x1 + 5 x2 <=13 % x1, x2 >=0 % x1, x2是整數(shù) % f=[-20, -10]; % A=[ 5 4; 2 5]; % B=[24; 13]; % lb=[0 0]; % ub=[inf inf]; % I=[1,2]; % e=0.000001; % [x v s]= IP(f,A,B,I,[],[],lb,ub,,e) % x = 4 1 v = -90.0000 s = 1% 控制輸入?yún)?shù) if nargin < 9, e = 0.00001;if nargin < 8, ub = []; if nargin < 7, lb = []; if nargin < 6, Beq = []; if nargin < 5, Aeq = [];if nargin < 4, I = [1:length(f)];end, end, end, end, end, end%求解整數(shù)規(guī)劃對應(yīng)的線性規(guī)劃,判斷是否有解 options = optimset('display','off'); [x0,fval0,exitflag] = linprog(f,A,B,Aeq,Beq,lb,ub,[],options); if exitflag < 0disp('沒有合適整數(shù)解');x = x0;fval = fval0;status = exitflag;return; else%采用分支定界法求解bound = inf;[x,fval,status] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e); end

    test.m

    %例子1 % f = [-40 -90];%A = [9 7;7 20];%B = [56 70]; % lb = [0 0]'; %例子2f = [-20 -10];A = [5 4;2 5];B = [24 13];lb = [0 0];[x,fval,status] = intprog(f,A,B,[1 2],[],[],lb)

    總結(jié)

    以上是生活随笔為你收集整理的数学建模 分支限界算法求解整数规划原理以及编程实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。