时钟
您的浏览器不支持

asdfghjkl00-2

失有所悟,梦有所想; 生活还要继续,奔跑吧!

导航

整数规划之分支定界算法

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)    收藏  举报

Test
您的浏览器不支持