整数规划之分支定界算法
1 f = [-20,-10]; 2 A = [5,4;2,5]; 3 B = [24;13]; 4 lb = [0;0]; 5 I = [1:length(f)]; 6 I(1); 7 [x,fval,status] = intprog(f,A,B,I,[],[],lb)
1 function [x,fval,status] = intprog(f,A,B,I,Aeq,Beq,lb,ub,e) 2 if nargin < 9, e = 0.00001; 3 if nargin < 8, ub = []; 4 if nargin < 7, lb = []; 5 if nargin < 6, Beq = []; 6 if nargin < 5, Aeq = []; 7 if nargin < 4, I = [1:length(f)]; 8 end, end, end, end, end, end 9 10 %求解整数规划对应的线性规划,判断是否有解 11 options = optimset('display','off'); 12 [x0,fval0,exitflag] = linprog(f,A,B,Aeq,Beq,lb,ub,[],options); 13 if exitflag < 0 14 disp('没有合适整数解'); 15 x = x0; 16 fval = fval0; 17 status = exitflag; 18 return; 19 else 20 %采用分支定界法求解 21 bound = inf; 22 [x,fval,status] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e); 23 end
1 function [newx,newfval,status,newbound] = branchbound(f,A,B,I,x,fval,bound,Aeq,Beq,lb,ub,e) 2 3 % 分支定界法求解整数规划 4 % f,A,B,Aeq,Beq,lb,ub与线性规划相同 5 % I为整数限制变量的向量 6 % x为初始解,fval为初始值 7 % 8 options = optimset('display','off'); 9 [x0,fval0,status0]=linprog(f,A,B,Aeq,Beq,lb,ub,[],options); 10 11 % %递归中的最终退出条件 12 % %无解或者解比现有上界大则返回原解 13 if status0 <= 0 || fval0 >= bound 14 newx = x; 15 newfval = fval; 16 newbound = bound; 17 status = status0; 18 return; 19 end 20 % 21 % %是否为整数解,如果是整数解则返回 22 intindex = find(abs(x0(I) - round(x0(I)))> e); 23 if isempty(intindex) %判断是否为空值 1表示为空,0为非空 24 newx(I) = round(x0(I)); 25 newfval = fval0; 26 newbound = fval0; 27 status = 1; 28 return; 29 end 30 % 31 %当有非整可行解时,则进行分支求解 32 %此时必定会有整数解或空解 33 %找到第一个不满足整数要求的变量 34 n = I(intindex(1));%n=1 35 addA = zeros(1,length(f)); 36 addA(n) = 1; 37 %构造第一个分支 x<=floor(x(n)) 38 A = [A;addA]; 39 B = [B;floor(x(n))];%向下取整 40 [x1,fval1,status1,bound1] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e); 41 %A(end,:) = []; 42 %B(:,end) = []; 43 %解得第一个分支,若为更优解则替换,若不是则保持原状 44 % 45 46 status = status1; 47 if status1 > 0 && bound1 < bound 48 newx = x1; 49 newfval = fval1; 50 bound = fval1; 51 newbound = bound1; 52 else 53 newx = x0; 54 newfval = fval0; 55 newbound = bound; 56 end 57 % 58 %构造第二分支 59 A = [A;-addA]; 60 B = [B;-ceil(x(n))];%向上取整 61 [x2,fval2,status2,bound2] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e); 62 % A(end,:) = []; 63 % B(:,end) = []; 64 65 %解得第二分支,并与第一分支做比较,如果更优则替换 66 if status2 > 0 && bound2 < bound 67 status = status2; 68 newx = x2; 69 newfval = fval2; 70 newbound = bound2; 71 end
疑问:status2不知代表什么,为什么其结果为-2?
输出结果:
>> Test
x =
4 1
fval =
-90.0000
status =
1
以上仅供参考,真实数据需重新编写相应函数的代码;
另,也可参考:
https://blog.csdn.net/weixin_53599669/article/details/118978608?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165891705216782388082506%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165891705216782388082506&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-118978608-null-null.142^v35^pc_search_v2,185^v2^tag_show&utm_term=function%20%5Bx%2Cfval%2Cstatus%5D%20%3D%20intprog%28f%2CA%2CB%2CI%2CAeq%2CBeq%2Clb%2Cub%2Ce%29&spm=1018.2226.3001.4187
posted on 2022-07-28 12:46 爱上对方过后就哭了忆 阅读(151) 评论(0) 收藏 举报
浙公网安备 33010602011771号