MATLAB分支定界法程序(推荐文档)

合集下载

完整word版,分支定界法的Matlab实现

完整word版,分支定界法的Matlab实现

一个调用例子:ifint=[0 1];f=[10 9];a=[1 0;0 1;-5 -3];b=[8 10 -45];[x,fval,exitflag] = linprogdis(ifint,f,a,b,[],[],[],[],[],[])function r=checkint(x)%算法:如果x(i)是整数,则返回r(i)=1;否则返回r(i)=0function r=ifrowinmat(arow,amat)%输入参数:% arow 向量,% amat 矩阵%%设计:如果 arow与矩阵amat中的某一行相等,则返回1,如果找不到现等的一行,则返回0可以使用ismember(arrow,amat,’rows’)替换ifrowinmat的调用,2005-10-28标注使用时,将下面的代码存入文件:linprogdis.mfunction [x,fval,exitflag,output,lambda]=... linprogdis(ifint,f,A,b,Aeq,beq,lb,ub,x0,options)%Title:% 分支定届法求解混合整数线性规划模型%%初步完成:2002年12月%最新修订: 2004-03-06%最新注释:2004-11-20%数据处理[t1,t2] = size(b);if t2~=1,b=b';%将b转置为列向量end%调用线性规划求解[x,fval,exitflag,output,lambda] =linprog(f,A,b,Aeq,beq,lb,ub,x0,options);if exitflag<=0,%如果线性规划失败,则本求解也失败returnend%得到有整数约束的决策变量的序号v1=find(ifint==1);%整数变量的indextmp=x(v1);%【整数约束之决策变量】的当前值if isempty(tmp),%无整数约束,则是一般的线性规划,直接返回即可returnendv2=find(checkint(tmp)==0);%寻找不是整数的index if isempty(v2),%如果整数约束决策变量确实均为整数,则调用结束returnend%第k个决策变量还不是整数解%注意先处理第1个不满足整数约束的决策变量k=v1(v2(1));%分支1:左分支tmp1=zeros(1,length(f));%线性约束之系数向量tmp1(k)=1;low=floor(x(k));%thisA 分支后实际调用线性规划的不等式约束的系数矩阵A%thisb 分支后实际调用线性规划的不等式约束向量b if ifrowinmat([tmp1,low],[A,b])==1%如果分支的约束已经存在旧的A,b中,则不改变约束thisA= A;thisb= b;elsethisA=[A;tmp1];thisb=b;thisb(end+1)=low;end%disp('fenzhi1'),thisA,thisb%递归调用[x1,fval1,exitflag1,output1,lambda1]= ...linprogdis(ifint,f,thisA,thisb,Aeq,beq,lb,ub,x0,o ptions);%分支2:右分支tmp2=zeros(1,length(f));%tmp1;tmp2(k)=-1;high= - ceil(x(k));if ifrowinmat([tmp2,high],[A,b])==1thisA= A;thisb= b;elsethisA=[A;tmp2];thisb=b;thisb(end+1)=high;end%disp('fenzhi2'),thisA,thisb[x2,fval2,exitflag2,output2,lambda2]= ...linprogdis(ifint,f,thisA,thisb,Aeq,beq,lb,ub,x0,o ptions);if isempty(v2) & ((exitflag1>0 & exitflag2<=0 & fval<=fval1 ) ...| (exitflag2>0 & exitflag1<=0 &fval<=fval2 )...| (exitflag1>0 & exitflag2>0 &fval<=fval1 & fval<=fval2 )),disp('error call')return %isempty(v2) 表示都是整数 2002-12-7非常重要end%下面分别根据返回标志exitflag确定最终的最优解%case 1if exitflag1>0 & exitflag2<=0 %【左分支有】最优解,右分支无最优解x = x1;fval = fval1;exitflag = exitflag1;output = output1;lambda = lambda1;%case 2elseif exitflag2>0 & exitflag1<=0 %【右分支有】最优解,左分支无最优解x = x2;fval = fval2;exitflag = exitflag2;output = output2;lambda = lambda2;%case 3elseif exitflag1>0 & exitflag2>0 %【左、右分支均有】最优解,则比较选优if fval1<fval2,%【左】分支最优(min)x = x1;fval = fval1;exitflag = exitflag1;output = output1;lambda = lambda1;else x = x2;,%【右】分支最优(min)fval = fval2;exitflag = exitflag2;output = output2;lambda = lambda2;end%fval1<fval2endfunction r=checkint(x)%算法:如果x(i)是整数,则返回r(i)=1;否则返回r(i)=0%输入参数:x 向量%输出参数:r 向量for i=1:length(x),ifmin(abs(x(i)-floor(x(i))),abs(x(i)-ceil(x(i))))<1 e-03%这里用于判定是否为0的参数可以调整,如改为1e-6r(i)=1;elser(i)=0;endendfunction r=ifrowinmat(arow,amat)%输入参数:% arow 向量,% amat 矩阵%%设计:如果 arow与矩阵amat中的某一行相等,则返回1,如果找不到现等的一行,则返回0r = 0;rows = size(amat,1);for i=1:rows,temp = (amat(i,:)==arow);%利用 Matlab的==操作,如果相等,则为1向量;if length(find(temp==0))==0,%没有为0的,即temp元素全部是1r=1;return end%end %for。

python分支定界算法解决问题范例

python分支定界算法解决问题范例

Python分支定界算法解决问题范例一、概述分支定界算法是一种用于解决组合优化问题的算法。

它通过不断地分解问题和减少搜索空间来找到最优解。

Python是一种广泛应用的编程语言,其简洁、灵活的特性使其成为实现分支定界算法的理想工具。

本文将以一个例子来展示如何使用Python实现分支定界算法解决问题,以帮助读者更好地理解和运用这一算法。

二、问题描述假设有一个物品清单,每个物品有其对应的价值和重量。

同时有一个背包,其最大承重为W。

现需要将物品放入背包,使得背包中的物品总价值最大,但总重量不能超过背包的承重。

如何选择物品并放置到背包中才能使得总价值最大化呢?三、分支定界算法解决方案1. 定义问题我们需要明确问题的定义和目标。

通过对问题进行数学建模,可以将其表示为一个0-1背包问题。

具体而言,我们可以定义以下几个参数:- n:物品的数量- weight[i]:第i个物品的重量- value[i]:第i个物品的价值- W:背包的最大承重通过以上定义,我们可以将问题表述为,在给定n个物品、其对应的重量和价值以及背包的最大承重情况下,如何选择物品并放置到背包中,使得背包中的物品总价值最大,但总重量不能超过背包的承重。

2. 分支定界算法实现接下来,我们将使用Python实现分支定界算法来解决上述问题。

具体步骤如下:我们定义一个Node类来表示搜索树的节点,其中包括以下几个属性:level、value、weight、bound和include。

- level表示当前节点所处的层级;- value表示当前节点已获得的总价值;- weight表示当前节点已获得的总重量;- bound表示当前节点的价值上界;- include表示一个列表,记录了每个物品是否被选择放入背包中。

```pythonclass Node:def __init__(self, level, value, weight, bound, include):self.level = levelself.value = valueself.weight = weightself.bound = boundself.include = include```我们定义一个bound函数来计算当前节点的价值上界。

运筹学第三节分支定界法

运筹学第三节分支定界法
Z=4
整理课件
10
运筹学教程
不同的搜索策略会导致不同的搜索树,一般 情况下,同一层的两个子问题,先搜索目标 函数比较大的较有利(如果是极小问题,则 应先搜索目标函数值小的较为有利)。这样 可能得到数值比较大的下界,下界越大被剪 去的分支越多。
分支定界算法对于混合整数规划特别有效, 对没有整数要求的变量就不必分支,这将大 大减少分支的数量。
确定整数解目标函数值上下界并不断更新 ,“剪除”目 标函数值小于下界的分支的过程,称为定界(Bound)。
整理课件
4
运筹学教程
整数规划问题的求解方法 分支定界法图解整数规划
松弛问题 Max Z = X1 + X2 14X1 + 9X2 ≤ 51 - 6X1 + 3X2 ≤ 1 X1 , X2 ≥ 0
B1 Max Z = X1 + X2
14X1 + 9X2 ≤ 51
- 6X1 + 3X2 ≤ 1
X1
≥2
X1 , X2 ≥ 0
B2 Max Z = X1 + X2
14X1 + 9X2 ≤ 51
- 6X1 + 3X2 ≤ 1
X1
≤1
X1 , X2 ≥ 0
6
运筹学教程
(3/2 ,10/3) Z1 = 29/6
0, B采用原加工方式 y1 1, B不采用原加工方 多余式 的约束
0, B采用新加工方式 y2 1, B不采用新加工方式
当y1=1,y2=0;采用
st.00..23xx11
0.5x2 0.4x2
150My1 120My2
新工艺,(2)式成立;
y1 y2 1 整理课件
15

线性整数规划的分支限界解法及其MATLAB实现

线性整数规划的分支限界解法及其MATLAB实现

名字由和两词的前个字母MATLAB Matrix Laboratory 3组合而成。

起于世纪年代后期,现在研究和设计中,2070被认为是进行高效研究、开发的首选软件工具。

MATLAB 在国际学术界,已经被确认为准确、可靠的科学MATLAB 计算标准软件。

在数学上提供了大量的优化计算命令。

线性规MALAB 划中,提供了相关函数,但是对于变量取整数的MATLAB 线性规划,即线性整数规划,并没有提供相关函MATLAB 数。

线性整数规划是介于计算机算法和最优化方法中的问题,在实际工程中有着广泛的应用。

本文通过计算机算法中分支限界法的思想解决此类方法。

线性整数规划的求解,是离散型优化问题求解,即指在有限多个可行方案中寻找一个符合目标的方案,常用的技术之一是将整个搜索的范围划分为若干个互不重叠并且完备的子范围,试图找到两个明确结论之一:所要找的最优解(1)肯定不在这个子范围内,如已知所要找的最小值不超过而a,在此范围内最小值超过则问题的解不在此范围内;原问a,(2)题的最小值在该子范围内,则找到该最小值,或者继续划分该子范围,直到找到最小值为止,这样原问题的解就自然得到。

解线性整数规划是一类具体的离散优化问题。

离散优化的问题都可以使用穷举法,在线性整数规划上,这个解空间很大。

显然在实际使用中,使用穷举法时间消耗很大。

在计算机的计算过程中,通常使用回朔的方法,然而仍然需要遍历整个树,然后在所有满足条件的值中找到最优的值。

树的遍历是个递归过程,如果使用递归算法,在每次进行递归调用中,需要保存当前的状态和当前的所有变量,仍然需要很大的空间和时间消耗。

本文通过堆栈的方式,改进递归过程,这将改进整个算法的执行效率。

分支限界法的算法思想1 分支限界法是一种在问题的解空间树上搜索问题界的算法,其目的是找出满足约束条件的一个解,或者是在满足约束条件的解中找出使目标函数值达到极大或极小的解,即最优解。

分支限界法以广度优先或者以最小耗费优先的方式搜索解空间树,分支限界法的策略是,在扩展结点处,先生成其所有的儿子结点,以加速搜索进程,在每一活结点处,计算一个函数值,并根据这些已经计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索向着解空间树上最优解的分支推进,以便尽快找出一个最优解。

关于MATLAB整数规划分支定界法

关于MATLAB整数规划分支定界法

关于MATLAB整数规划分支定界法一、编程利用Matlab的线性规划指令:[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)编写计算整数规划函数,输入与输出与上述指令相同分枝定界法(递归实现)function [x,fval,status] = intprog(f,A,B,I,Aeq,Beq,lb,ub,e)%整数规划求解函数 intprog()% 其中 f为目标函数向量% A和B为不等式约束 Aeq与Beq为等式约束 % I为整数约束% lb与ub分别为变量下界与上界% x为最优解,fval为最优值%例子:% maximize 20 x1 + 10 x2 % S.T.% 5 x1 + 4 x2 <=24 % 2 x1 + 5 x2 <=13 % x1, x2 >=0 % x1, x2是整数 % 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% 控制输入参数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%求解整数规划对应的线性规划,判断是否有解 options = optimset('display','off'); [x0,fval0,exitflag] = linprog(f,A,B,Aeq,Beq,lb,ub,[],options);if exitflag < 0disp('没有合适整数解');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子函数function [newx,newfval,status,newbound] =branchbound(f,A,B,I,x,fval,bound,Aeq,Beq,lb,ub,e)% 分支定界法求解整数规划% f,A,B,Aeq,Beq,lb,ub与线性规划相同 % I为整数限制变量的向量% x为初始解,fval为初始值options = optimset('display','off');[x0,fval0,status0]=linprog(f,A,B,Aeq,Beq,lb,ub,[],options);%递归中的最终退出条件%无解或者解比现有上界大则返回原解 if status0 <= 0 || fval0 >= bound newx = x;newfval = fval;newbound = bound;status = status0;return;end%是否为整数解,如果是整数解则返回 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%当有非整可行解时,则进行分支求解 %此时必定会有整数解或空解%找到第一个不满足整数要求的变量n = I(intindex(1));addA = zeros(1,length(f));addA(n) = 1;%构造第一个分支 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) = [];%解得第一个分支,若为更优解则替换,若不是则保持原状status = status1;if status1 > 0 && bound1 < boundnewx = x1;newfval = fval1;bound = fval1;newbound = bound1;elsenewx = x0;newfval = fval0;newbound = bound;end%构造第二分支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) = [];%解得第二分支,并与第一分支做比较,如果更优则替换 if status2 > 0 && bound2 < boundstatus = status2;newx = x2;newfval = fval2;newbound = bound2;end二、求解利用上述指令求解下列问题:汽车厂生产三种类型的汽车,已知各类型每辆车对钢材、劳动时间的需求,利润及工厂每月的现有量小型中型大型现有量钢材(吨) 1 2 5 1000劳动时间(小时) 250 125 150 120000利润(万元) 3 5 121、若每月生产的汽车必须为整车,试制订月生产计划,使工厂的利润最大2、如果生产某一类型汽车,则至少要生产50辆,那么最优的生产计划应作何改变, 解:1f = [-3 -5 -12];A = [1 2 5;250 125 150];B = [1000 120000];I = [1:length(f)];lb = [0 0 0];[x,fval,status] = intprog(f,A,B,I,[],[],lb)答案为 x =307 344 1 fval = -2653 status =12lb = [50 50 50]答案为 x =350 200 50 fval =-2.6500e+003 status =1用分枝定界法求解整数线性规划问题%%问题的标准形式:%% min c'*x%% s.t. A*x<=b%% Aeq*x=beq%% 要求是整数%%function [y,fval]=BranchBound(c,A,b,Aeq,beq)%NL=length(c);UB=inf;LB=-inf;FN=[0];AA(1)={A};BB(1)={b};k=0;flag=0;while flag==0;[x,fval,exitFlag]=linprog(c,A,b,Aeq,beq); if (exitFlag == -2) | (fval >= UB)FN(1)=[];if isempty(FN)==1flag=1;elsek=FN(1);A=AA{k};b=BB{k};endelsefor i=1:NLif abs(x(i)-round(x(i)))>1e-7kk=FN(end);FN=[FN,kk+1,kk+2];temp_A=zeros(1,NL);temp_A(i)=1;temp_A1=[A;temp_A];AA(kk+1)={temp_A1};b1=[b;fix(x(i))];BB(kk+1)={b1};temp_A2=[A;-temp_A];AA(kk+2)={temp_A2};b2=[b;-(fix(x(i))+1)];BB(kk+2)={b2};FN(1)=[];k=FN(1);A=AA{k};b=BB{k};break;endendif (i==NL) & (abs(x(i)-round(x(i)))<=1e-7) UB=fval;y=x;FN(1)=[];if isempty(FN)==1flag=1;elsek=FN(1);A=AA{k};b=BB{k};endendendendy=round(y);fval=c*y;。

分支定界解析

分支定界解析

MATLAB 解整数规划问题——分支定界法柯伟敏 G012012348一、问题分析在线性规划问题中,有些最优解可能是分数或小数,事实上,线性规划是连续变量的线性优化问题。

但在实际问题中,常有要求解答必须是整数的情形。

例如,所求解是机器人的台数,完成工作的人数或者装货的车数等,分数或者小数的解答就不符合要求。

为了满足整数解的要求,初看起来,似乎只要把已得到的带有分数的或小数的解经过‘舍入化整’就可以了。

但这常常是不行的,因为化整之后不见得就是可行解,或虽是可行解,但不一定是最优解。

因此,对求最优整数解问题,有必要另行研究。

我们称这样的问题为整数规划问题。

学习运筹学过后,我们学习了笔算这类问题,但是当对于一个问题的约束条件有很多个时,手算必然耗费很大个工作量。

但是用 MATLAB 解题却可以达到事半功倍的效果,省去了很多繁琐的运算过程。

二、数学原理下面我主要介绍分支定界解法。

分支定界法的基本思想是不断将可行域分割成小的集合,然后再小的集合上找整数最优解,在分割可行域时,整数解并不会丢失。

其算法过程如下: 1、 置矩阵NF_lb 为原整数的的lb ,NF_ ub 为原整数规划的ub ,置最优解=*x ∅,目标函数的最优上界F=+∞。

2、设NF_lb 的第一列为l 0b ,NF_ub 第一列为u 0b ,求解线性规划min f (x )=cx , b Ax ≤s.t. 00ub x lb ≤≤ ,设最优解为-x ,最优值为_f ,如果不存在最优解,则设_f =+∞;0≥x3、若_f =+∞,则将NF_lb 的第一列和NF_ub 的第一列去掉,转7,否则,转44、若_f ≥F ,则将NF_lb 的第一列去掉,和NF_ub 的第一列去掉,转7,否则,转5.5、若_f <F ,且-x 的各分量都为整数,则置F=_f ,=*x -x ,将NF_lb 的第一列和NF_ub 的第一列去掉,转7,否则转6。

6、若_f <F ,但-x 的有些分量不是整数,任选择-x 中一个不是整数的分量_k x ,将此问题分解为两个问题Q1Q2;第一个问题的ub 等于u 0b ,而lb 是将NF_lb 中的第一列分量_k x 对应的下界改为[_k x ]+1;第二个问题的lb 等于l 0b ,而ub 是将NF_ub 中的第一列_k x ,对应的上界改为[_k x ],再将NF_lb 的第一列和NF_ub 的第一列去掉,把Q1,Q2对应的lb ,ub 作为新列分别添加到NF_lb 和NF_ub 的后面,转27、若NF_lb不为空,则转2,若为空,且*x不为空,则*x为原整数规划的最优解,F=最优值,如果*x为空,则原整数规划不存在最优解。

下料问题

下料问题

关于一维下料问题的研究摘要:“下料问题”是把相同形状的一些原材料分割加工成若干个不同规格大小的零件的问题.此类问题在工程技术和工业生产中有着重要和广泛的应用.在生产实践中通常要求解决用料最省、浪费最少等问题.下料问题即是其一。

属最优化研究范畴.一维下料问题是生产实践中常见的问题,优化下料要求最大限度地节约原材料,提高原材料的利用率。

本文介绍了两种方法,其一提出分支定界算法优化一维下料问题,并用MATLAB编写程序,通过计算机来完成这一复杂的过程。

另一种方法-lingo,针对单一原材料的一维下料问题, 建立了整数规划模型, 然后将模型转化为求解最优下料方式问题; 利用lingo进行编程, 实现循环调用得到一维下料问题的局部最优解。

实际上本文就是给出了解决适当规模下料问题的求解方法.该方法既可手工演算又可通过计算机求解。

在实践中可以借鉴使用.Abstract: The “℃utting Stock Problem”is a problem of dividing raw materials in the same shape into several parts in different shapes. This kind of problem has important and wide appliance in engineering and industry production.Being living to give birth to in the practice requires use to anticipate to save most usually and Squanders at least and so on ,First of all Immediate future the cutting stock problem is ,The category optimization is researched the category 。

分支定界法----整数规划matlab

分支定界法----整数规划matlab

分支定界法的思想是:首先确定目标值的上下界发布人:chengxu0921 发布时间:2008-7-21 18:16:27 新闻类别:分支-界限法例1:设有A,B,C,D,E 5人从事j1,j2,j3,j4,j5 5项工作每人只能从事一项,它们的效益表如下:求最佳安排,使效益最高?原文代码重写如下,希望增加点可读性。

program PlanJob;const MAX_SIZE = 20;typeTIntArray = array[1..MAX_SIZE] of Integer;PNode = ^Node;Node = recordJob2Man: TIntArray; // Job2Man[n] = m, job-n assign to person-m Man2Job: TIntArray; // Man2Job[n] = m, person-n assign to job-m UpperVal: Integer; // upper valueJobsDep: Integer; // jobs decided, as search depthNext: PNode;end;varCurNode: PNode; // Current nodeNewNode: PNode; // New branch nodeDelNode: PNode; // for deleteGoalNode: PNode; // the goalGoalMaxVal: Integer; // goal max valueCurMan, CurJob: Integer; // Current Man and Job of current NodeSize: Integer; // Person number, also task numberValues: array[1..MAX_SIZE, 1..MAX_SIZE] of Integer;function CalUpperValue(ANode: PNode): Integer;varRes: Integer;Man, Job: Integer;JobMaxVal: Integer;beginRes := 0;with ANode^ dobeginfor Job := 1 to Size dobeginif Job <= JobsDep thenbeginMan := Job2Man[Job];Res := Res + Values[Man, Job];Continue;end;// else find the max value for JobJobMaxVal := 0;for Man := 1 to Size dobeginif (JobMaxVal < Values[Man,Job]) and (Man2Job[Man] = 0) then JobMaxVal := Values[Man,Job];end;Res := Res + JobMaxVal;end; // for Jobend; // with ANode^CalUpperValue := Res;end;function InitNode(): PNode;varMan, Job: Integer;FInput: Text;Res: PNode;beginAssign(FInput, 'input.txt');Reset(FInput);Read(FInput, Size);Readln(FInput);for Man := 1 to Size dobeginfor Job := 1 to Size doRead(FInput, Values[Man,Job]);Readln(FInput);New(Res);with Res^ dobeginfor Man := 1 to Size dobeginMan2Job[Man] := 0;Job2Man[Man] := 0;end;JobsDep := 0;UpperVal := CalUpperValue(Res);Next := nil;end;InitNode := Res;end;procedure Insert(ANode: PNode; From: PNode);varPrevNode, NextNode: PNode;beginNextNode := From;repeatPrevNode := NextNode;NextNode := PrevNode^.Next;until (NextNode = nil) or (ANode^.UpperVal >= NextNode^.UpperVal); PrevNode^.Next := ANode;ANode^.Next := NextNode;end;procedure PrintNode(ANode: PNode);varMan, Job: Integer;AllJobAssigned: Boolean;beginAllJobAssigned := true;for Job := 1 to Size dobeginMan := ANode^.Job2Man[Job];if 0 <> Man thenWriteln('Job ', Job, ' assign to man ',Man, ', value ', Values[Man, Job])elseAllJobAssigned := false;Writeln;if AllJobAssigned thenWriteln('Value = ', ANode^.UpperVal)elseWriteln('UpperVal = ', ANode^.UpperVal);end;beginCurNode := InitNode();GoalMaxVal := 0;repeatCurJob := CurNode^.JobsDep + 1;for CurMan := 1 to Size dobeginif CurNode^.Man2Job[CurMan] <> 0 thenContinue;// New search branchNew(NewNode);NewNode^ := CurNode^;NewNode^.JobsDep := CurJob;NewNode^.Man2Job[CurMan] := CurJob;NewNode^.Job2Man[CurJob] := CurMan;NewNode^.UpperVal := CalUpperValue(NewNode);if NewNode^.UpperVal < GoalMaxVal thenDispose(NewNode) // discard this branch if smaller than limit elseInsert(NewNode, CurNode);if CurJob < Size then Continue; // for CurMan// all job assigned, update goalif NewNode^.UpperVal > GoalMaxVal thenbeginGoalNode := NewNode;GoalMaxVal := GoalNode^.UpperValend; // ifend; // for CurManDelNode := CurNode;CurNode := CurNode^.Next;Dispose(DelNode);until (CurNode^.UpperVal <= GoalMaxVal)or (CurNode = nil); // end of repeatPrintNode(GoalNode);Readln;end.input.txt:513 11 10 4 713 10 10 8 55 9 7 7 415 12 10 11 510 11 8 8 4output:Job 1 assign to man 4, value 15Job 2 assign to man 5, value 11Job 3 assign to man 2, value 10Job 4 assign to man 3, value 7Job 5 assign to man 1, value 7Value = 50如果扩展为10*10,input.txt:1013 11 10 4 7 13 11 10 4 713 10 10 8 5 13 10 10 8 55 9 7 7 4 5 9 7 7 415 12 10 11 5 15 12 10 11 5 10 11 8 8 4 10 11 8 8 413 11 10 4 7 13 11 10 4 713 10 10 8 5 13 10 10 8 55 9 7 7 4 5 9 7 7 415 12 10 11 5 15 12 10 11 5 10 11 8 8 4 10 11 8 8 4运行约两分钟。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

源代码如下:fun ctio n [x,y]=ILp(f,G,h,Geq,heq,lb,ub,x,id,optio ns)%整数线性规划分支定界法,可求解纯整数规划和混合整数规划。

%y=minf ' *x s.t. G*x<=h Geq*x=heq x为全整数或混合整数列向量%用法%[x,y]=ILp(f,G,h,Geq,heq,lb,ub,x,id,optio ns)%参数说明%lb:解的下界列向量(Default:」nt )%ub:解的上界列向量(Default:int)%x:迭代初值列向量%id :整数变量指标列向量,1-整数,0-实数(Default:1 )global upper opt c x0 A b Aeq beq ID options;if nargin<10,options=optimset({});options.Display='off;opti on rgeScale='off;e ndif nargin<9,id=ones(size(f));endif nargin<8,x=[];endif nargin<7 |isempty(ub),ub=inf*ones(size(f));endif nargin<6 |isempty(lb),lb=zeros(size(f));endif narginv5,heq=[];endif narginv4,Geq=[];endupper=i nf;c=f;xO=x;A=G;b=h;Aeq=Geq;beq=heq;ID=id; ftemp=ILP(lb(:),ub(:));x=opt;y=upper;%下面是子函数fun cti on ftemp=ILP(vlb,vub)global upper opt c x0 A b Aeq beq ID options;[x,ftemp,how]=li nprog(c,A,b,Aeq,beq,vlb,vub,xO,opti on s);if how <=0return;en d;if ftemp-upper>0.00005 %in order to avoid errorreturn;en d;if max(abs(x.*ID-round(x.*ID)))<0.00005if upper-ftemp>0.00005 %in order to avoid error opt=x';upper=ftemp;return;elseopt=[opt;x'];return;en d;en d;notintx=find(abs(x-round(x))>=0.00005); %in order to avoid errorin tx=fix(x);tempvlb=vlb;tempvub=vub;if vub(notintx(1,1),1)>=intx(notintx(1,1),1)+1;tempvlb( no ti ntx(1,1),1)=i ntx(n oti ntx(1,1),1)+1;ftemp=I ntLP(tempvlb,vub);en d;if vlb(notintx(1,1),1)<=intx(notintx(1,1),1)tempvub( not in tx(1,1),1)=i ntx(notin tx(1,1),1);ftemp=I ntLP(vlb,tempvub);en d;在命令行运行>>c=[1,1,-4];a=[1,1,2;1,1,-1;-1,1,1];b=[9;2;4];>> [x,f]=ILp(c,a,b,[],[],[0;0;0],[inf;inf;inf])从你的程序中的如下这条语句可以看出变量ID是全局变量:global upper opt c x0 A b Aeq beq ID opti ons;该全局变量(ID)是在你的函数之外被别的程序语句进行过赋值,而且也很有可能被赋成了向量/矩阵、并且它的维数大小跟向量x的维数大小并不相同,这就造成了进行运算x.*ID的时候维数不匹配的问题第二个:题目:min (4*x1+4*x2); 约束条件:2*x1+5*x2<=15,2*x1-2*x2<=5,x1,x2>=0, 且都为整数.解这个还是很容易,算出来x1,x2都为0点几,因为题目要求是整数,所以主要是这个分支定界的问题,急求一个分支定界的MATLAB算法,通用算法也可以,或者只能解这道题也可以,只要能进行计算就行,最后解出来x1,x2都为0.希望大家帮帮忙,先谢谢大家了.解线性方程很容易,但主要是整数解,需要用分支定界法•希望算法尽量简单易懂,最好有注释,本人是初学者,谢谢了把以下程序存为ILP.m ,function [x,y]=ILp(f,G,h,Geq,heq,lb,ub,x,id,options)%整数线性规划分支定界法,可求解纯整数规划和混合整数规划。

%y=minf ' *x s.t. G*x<=h Geq*x=heq x 为全整数或混合整数列向量%用法%[x,y]=ILp(f,G,h,Geq,heq,lb,ub,x,id,optio ns)%参数说明%lb:解的下界列向量 (Default:」nt )%ub:解的上界列向量(Default:int)%x:迭代初值列向量%id :整数变量指标列向量,1-整数,0-实数(Default:1 )global upper opt c x0 A b Aeq beq ID opti ons;if nargin <10,opti on s=optimset({});opti on s.Display='off;opti on rgeScale='off;e ndif nargin< 9,id=on es(size(f));e ndif nargin< 8,x=[];e ndif nargin<7 |isempty(ub),ub=inf*on es(size(f));e ndif nargin<6 |isempty(lb),lb=zeros(size(f));e ndif narginv 5,heq=[];e ndif narginv 4,Geq=[];e ndupper=i nf;c=f;xO=x;A=G;b=h;Aeq=Geq;beq=heq;ID=id;ftemp=ILP(lb(:),ub(:));x=opt;y=upper;%下面是子函数fun cti on ftemp=ILP(vlb,vub)global upper opt c x0 A b Aeq beq ID opti ons;[x,ftemp,how]=li nprog(c,A,b,Aeq,beq,vlb,vub,xO,opti on s);if how <=0return;en d;if ftemp-upper>0.00005 %in order to avoid errorreturn;en d;if max(abs(x.*ID-rou nd(x.*ID)))<0.00005if upper-ftemp>0.00005 %in order to avoid erroropt=x';upper=ftemp;return;elseopt=[opt;x'];x =return;en d;en d;no ti ntx=fi nd(abs(x-r oun d(x))>=0.00005); %in order to avoid error in tx=fix(x);tempvlb=vlb;tempvub=vub;if vub( not in tx(1,1),1)>=i ntx(no ti ntx(1,1),1)+1;tempvlb( no ti ntx(1,1),1)=i ntx(n oti ntx(1,1),1)+1;ftemp=I ntLP(tempvlb,vub);en d;if vlb( noti ntx(1,1),1)<=i ntx(n oti ntx(1,1),1)tempvub( not in tx(1,1),1)=i ntx(notin tx(1,1),1);ftemp=I ntLP(vlb,tempvub);en d;%==================================== 然后:clc;clearf=[4 4]A=[2 5;2 -2]b=[15;5]Aeq=[];beq=[];LB=[0 0];UB=[];[x n,yn ]=ILp(f,A,b,Aeq,beq,LB,UB,[1 1],1,[]) [x,fval,exitflag]=li nprog(f,A,b,Aeq,be q,L B,UB)结果:xn =0 0yn =Optimization terminated.1.0e-013 *0.2990040786747590.503948216933779fval =3.211809182434153e-013exitflag =1matlab的整数规划功能不行,还不如EXCEL的solver。

提问者评价貌似还是不能正确得出整数。

相关文档
最新文档