整数规划_分支定界法_MATLAB程序
Matlab求解线性规划和整数规划问题

Matlab求解线性规划和整数规划问题Matlab是一种强大的数值计算和科学计算软件,可以用于求解各种数学问题,包括线性规划和整数规划问题。
本文将详细介绍如何使用Matlab来求解线性规划和整数规划问题。
一、线性规划问题的求解线性规划是一种优化问题,旨在找到一组变量的最佳值,以使线性目标函数在一组线性约束条件下最大或者最小化。
下面以一个简单的线性规划问题为例来说明如何使用Matlab求解。
假设有以下线性规划问题:最大化目标函数:Z = 3x + 5y约束条件:2x + y ≤ 10x + 3y ≤ 15x, y ≥ 01. 创建线性规划模型在Matlab中,可以使用linprog函数来创建线性规划模型。
首先,定义目标函数的系数向量c和不等式约束条件的系数矩阵A以及不等式约束条件的右侧常数向量b。
c = [-3; -5];A = [2, 1; 1, 3];b = [10; 15];2. 求解线性规划问题然后,使用linprog函数求解线性规划问题。
该函数的输入参数为目标函数的系数向量c、不等式约束条件的系数矩阵A、不等式约束条件的右侧常数向量b以及变量的下界和上界。
lb = [0; 0];ub = [];[x, fval, exitflag] = linprog(c, A, b, [], [], lb, ub);其中,x是最优解向量,fval是最优解对应的目标函数值,exitflag是求解器的退出标志。
3. 结果分析最后,打印出最优解向量x和最优解对应的目标函数值fval。
disp('最优解向量x:');disp(x);disp('最优解对应的目标函数值fval:');disp(fval);二、整数规划问题的求解整数规划是一种优化问题,与线性规划类似,但是变量的取值限制为整数。
Matlab提供了intlinprog函数来求解整数规划问题。
下面以一个简单的整数规划问题为例来说明如何使用Matlab求解。
Matlab学习系列26.整数规划

26. 整数规划全部变量限制为整数的规划问题,称为纯整数规划;部分变量限制为整数的规划问题,称为混合整数规划;变量只取0或1的规划问题,称为0-1整数规划。
整数规划问题,建议使用Lingo 软件求解。
常用的整数规划问题解法有:(1)分枝定界法:可求纯或混合整数线性规划; (2)割平面法:可求纯或混合整数线性规划;(3)隐枚举法:用于求解0-1整数规划,有过滤法和分枝法; (4)匈牙利法:解决指派问题(0-1规划特殊情形); (5)蒙特卡罗法:求解各种类型规划。
一、分枝定界法分支定界法的基本思想是:设有最大化的整数规划问题A ,先解与之相应的线性规划问题B ,若B 的最优解不符合A 的整数条件,那么B 的最优目标函数必是A 的最优目标函数z*的上界,记作z2, 而A 的任意可行解的目标函数值将是z*的一个下界z1, 分支定界法就是将B 的可行域分成子区域(称为分支)的方法,逐步减小z2和增大z1, 最终求到z*。
例1 分枝定界法原理示例:1212120max 58s. t. 65945 () 0, Z (1,2)i i z x x x x x x P x x i =++≤+≤≥∈=用Lingo软件求解:代码:max 5x1+8x2stx1+x2<=65x1+9x2<=45endgin 2运行结果:Global optimal solution found.Objective value: 40.00000Objective bound: 40.00000 Infeasibilities: 0.000000Extended solver steps: 0Total solver iterations: 0Variable Value Reduced CostX1 0.000000 -5.000000X2 5.000000 -8.000000Row Slack or Surplus Dual Price1 40.00000 1.0000002 1.000000 0.0000003 0.000000 0.000000二、0-1整数规划变量x i只能取值0,1,该约束条件可表示为:0≤x i≤1, x i∈N 或x i (1-x i)=0 1. 隐枚举法例2求解下列0-1规划问题:1231231231223 max 325s. t. 2 2 () 4 4 () 3 () 4 6 z x x x x x x a x x x b x x c x x =-++-≤++≤+≤+≤123 () ,,0 1d x x x =或求解思路:(1)先试探性地求一个可行解,易看出(x1, x2, x3)=(1, 0, 0)满足约束条件,故是一个可行解,相应的目标函数值为z=3.(2)由于是求极大值,故目标值z<3的解,不必检验是否满足约束条件即可删除,于是可增加一个约束条件(称为过滤条件):1233253x x x -+≥ (e)(3)用全部枚举法,3个变量共23=8种可能的组合,用过滤条件(并计算目标函数值,不断改进过滤条件)筛选每个可能的组合,最终得到问题的最优解。
线性整数规划的分支限界解法及其MATLAB实现

名字由和两词的前个字母MATLAB Matrix Laboratory 3组合而成。
起于世纪年代后期,现在研究和设计中,2070被认为是进行高效研究、开发的首选软件工具。
MATLAB 在国际学术界,已经被确认为准确、可靠的科学MATLAB 计算标准软件。
在数学上提供了大量的优化计算命令。
线性规MALAB 划中,提供了相关函数,但是对于变量取整数的MATLAB 线性规划,即线性整数规划,并没有提供相关函MATLAB 数。
线性整数规划是介于计算机算法和最优化方法中的问题,在实际工程中有着广泛的应用。
本文通过计算机算法中分支限界法的思想解决此类方法。
线性整数规划的求解,是离散型优化问题求解,即指在有限多个可行方案中寻找一个符合目标的方案,常用的技术之一是将整个搜索的范围划分为若干个互不重叠并且完备的子范围,试图找到两个明确结论之一:所要找的最优解(1)肯定不在这个子范围内,如已知所要找的最小值不超过而a,在此范围内最小值超过则问题的解不在此范围内;原问a,(2)题的最小值在该子范围内,则找到该最小值,或者继续划分该子范围,直到找到最小值为止,这样原问题的解就自然得到。
解线性整数规划是一类具体的离散优化问题。
离散优化的问题都可以使用穷举法,在线性整数规划上,这个解空间很大。
显然在实际使用中,使用穷举法时间消耗很大。
在计算机的计算过程中,通常使用回朔的方法,然而仍然需要遍历整个树,然后在所有满足条件的值中找到最优的值。
树的遍历是个递归过程,如果使用递归算法,在每次进行递归调用中,需要保存当前的状态和当前的所有变量,仍然需要很大的空间和时间消耗。
本文通过堆栈的方式,改进递归过程,这将改进整个算法的执行效率。
分支限界法的算法思想1 分支限界法是一种在问题的解空间树上搜索问题界的算法,其目的是找出满足约束条件的一个解,或者是在满足约束条件的解中找出使目标函数值达到极大或极小的解,即最优解。
分支限界法以广度优先或者以最小耗费优先的方式搜索解空间树,分支限界法的策略是,在扩展结点处,先生成其所有的儿子结点,以加速搜索进程,在每一活结点处,计算一个函数值,并根据这些已经计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索向着解空间树上最优解的分支推进,以便尽快找出一个最优解。
Matlab求解线性规划和整数规划问题

Matlab求解线性规划和整数规划问题线性规划和整数规划是数学规划中常见的两种优化问题。
Matlab作为一种强大的数值计算软件,提供了丰富的工具和函数来解决这些问题。
本文将介绍如何使用Matlab求解线性规划和整数规划问题,并提供详细的步骤和示例代码。
一、线性规划问题的求解线性规划问题可以表示为如下形式的数学模型:```minimize c'*xsubject to A*x <= blb <= x <= ub```其中,c是目标函数的系数向量,x是决策变量向量,A是不等式约束矩阵,b 是不等式约束向量,lb和ub分别是决策变量的下界和上界。
Matlab中求解线性规划问题可以使用`linprog`函数。
下面是一个示例:```matlabc = [1; 2; 3]; % 目标函数的系数向量A = [1, -1, 2; 3, 1, 0]; % 不等式约束矩阵b = [4; 5]; % 不等式约束向量lb = zeros(3, 1); % 决策变量的下界ub = [Inf; Inf; 10]; % 决策变量的上界[x, fval] = linprog(c, A, b, [], [], lb, ub);```在上面的示例中,我们定义了目标函数的系数向量c,不等式约束矩阵A,不等式约束向量b,以及决策变量的下界lb和上界ub。
然后使用`linprog`函数求解线性规划问题,得到最优解x和最优目标函数值fval。
二、整数规划问题的求解整数规划问题是线性规划问题的一个扩展,要求决策变量取整数值。
Matlab中求解整数规划问题可以使用`intlinprog`函数。
下面是一个示例:```matlabc = [1; 2; 3]; % 目标函数的系数向量A = [1, -1, 2; 3, 1, 0]; % 不等式约束矩阵b = [4; 5]; % 不等式约束向量lb = zeros(3, 1); % 决策变量的下界ub = [Inf; Inf; 10]; % 决策变量的上界intcon = [1; 2]; % 决策变量的整数约束[x, fval] = intlinprog(c, intcon, A, b, [], [], lb, ub);```在上面的示例中,我们除了定义了线性规划问题的参数外,还定义了决策变量的整数约束intcon。
milp优化问题的典型求解方法

Milp(Mixed Integer Linear Programming)是一类线性规划问题,其变量包括整数型和实数型变量。
对于Milp优化问题,常见的求解方法包括整数规划分支定界法、整数规划切割平面法、启发式算法等。
本文将着重介绍Milp优化问题的典型求解方法,以便读者更好地理解和应用这些方法。
一、整数规划分支定界法1. 整数规划分支定界法是一种常用的Milp求解方法,其基本思想是通过不断地分支和界定变量取值范围来逐步逼近最优解。
具体步骤包括:(1)初始化线性规划问题,将整数变量约束为取值范围。
(2)求解线性松弛问题,得到最优解和最优目标值。
(3)检查最优解中的整数变量是否满足整数条件,若满足则更新最优解和目标值,否则进行分支操作。
(4)重复步骤(2)和步骤(3)直至满足终止条件。
二、整数规划切割平面法2. 整数规划切割平面法是另一种常用的Milp求解方法,其核心思想是通过不断添加约束条件来逼近最优解。
具体步骤包括:(1)初始化线性规划问题,将整数变量约束为取值范围。
(2)求解线性松弛问题,得到最优解和最优目标值。
(3)检查最优解中的整数变量是否满足整数条件,若满足则更新最优解和目标值,否则添加约束条件。
(4)重复步骤(2)和步骤(3)直至满足终止条件。
三、启发式算法3. 启发式算法是一类常用的Milp求解方法,其特点是通过启发式策略来搜索最优解。
常见的启发式算法包括遗传算法、模拟退火算法、禁忌搜索算法等。
这些算法通过不断地迭代和搜索来寻找最优解,其求解步骤包括:(1)初始化种群或解空间。
(2)根据指定策略进行选择、交叉和变异操作。
(3)更新种群或解空间,并计算适应度值。
(4)重复步骤(2)和步骤(3)直至满足终止条件。
四、优化问题的特点及应用4. Milp优化问题的求解方法在实际应用中具有广泛的适用性,常见的应用领域包括生产调度、物流规划、网络设计等。
由于Milp问题的复杂性和求解困难性,对于实际问题的建模和求解需要充分考虑问题特点和求解方法的选择。
Matlab求解线性规划和整数规划问题

Matlab求解线性规划和整数规划问题Matlab是一种功能强大的数学软件,可以用于求解线性规划和整数规划问题。
在本文中,我将详细介绍如何使用Matlab来解决这些问题。
首先,让我们了解一下线性规划和整数规划的基本概念。
线性规划是一种数学优化问题,其目标是在给定的一组约束条件下,最大化或者最小化线性目标函数。
整数规划是线性规划的一种扩展形式,其中变量被限制为整数值。
为了使用Matlab求解线性规划和整数规划问题,我们需要使用Matlab中的优化工具箱。
请确保你已经安装了该工具箱,并准备好了你的问题的数学模型。
在Matlab中,我们可以使用"linprog"函数来求解线性规划问题。
该函数的基本语法如下:[x, fval, exitflag, output] = linprog(f, A, b, Aeq, beq, lb, ub)其中,参数f是目标函数的系数向量,A和b是不等式约束的系数矩阵和右侧向量,Aeq和beq是等式约束的系数矩阵和右侧向量,lb和ub是变量的下界和上界。
函数的输出包括最优解x,最优目标函数值fval,退出标志exitflag以及输出信息output。
接下来,让我们通过一个具体的例子来演示如何使用Matlab求解线性规划问题。
假设我们有以下线性规划问题:最小化目标函数:f = [4, 3, 5]约束条件:A = [1, 1, 1; 2, 1, 3; 1, 2, 2]b = [6; 10; 8]变量的下界和上界:lb = [0; 0; 0]ub = []我们可以使用以下代码来求解这个问题:f = [4, 3, 5];A = [1, 1, 1; 2, 1, 3; 1, 2, 2];b = [6; 10; 8];lb = [0; 0; 0];ub = [];[x, fval, exitflag, output] = linprog(f, A, b, [], [], lb, ub);最优解x将包含变量的最优值,最优目标函数值fval将给出最小化的结果。
分支定界解析

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

分支定界法的思想是:首先确定目标值的上下界发布人: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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
整数规划分支定界法MATLAB 程序1.这种方法绝对能都解出答案,而且答案正确function[x,val]=fzdj(n,f,a,b,aeq,beq,lb,ub) x=zeros(n,1);x1=zeros(n,1);m1=2;m2=1;[x1,val1]=linprog(f,a,b,aeq,beq,lb,ub);if (x1==0) x=x1;val=val1;elseif (round(x1)==x1) x=x1;val=val1;else e1={0,a,b,aeq,beq,lb,ub,x1,val1}; e(1,1)={e1};zl=0; zu=-val1;while (zu~=zl)for c=1:1:m2if (m1~=2)if (cell2mat(e{m1-1,c}(1))==1) e1={1,[],[],[],[],[],[],[],0}; e(m1,c*2-1)={e1};e(m1,c*2)={e1}; continue;end;end; x1=cell2mat(e{m1-1,c}(8)); x2=zeros(n,1);s=0;s1=1;s2=1; lb1=cell2mat(e{m1-1,c}(6)); ub1=cell2mat(e{m1-1,c}(7)); lb2=cell2mat(e{m1-1,c}(6)); ub2=cell2mat(e{m1-1,c}(7));for d=1:1:nif (abs((round(x1(d))-x1(d)))>0.0001)&(s==0) s=1;lb1(d)=fix(x1(d))+1;if (a*lb1<=b)s1=0;end;ub2(d)=fix(x1(d));if (a*lb2<=b)s2=0;end;end;end;e1={s1,a,b,aeq,beq,lb1,ub1,[],0};e2={s2,a,b,aeq,beq,lb2,ub2,[],0};e(m1,c*2-1)={e1};e(m1,c*2)={e2};end;m1=m1+1;m2=m2*2;for c=1:1:m2if (cell2mat(e{m1-1,c}(1))==0)[x1,val1]=linprog(f,cell2mat(e{m1-1,c}( 2)),cell2mat(e{m1-1,c}(3)),cell2mat(e{m1-1,c}(4)),cell2 mat(e{m1-1,c}(5)),cell2mat(e{m1-1,c}(6)),cell2mat(e{m1-1,c}(7)));e1={cell2mat(e{m1-1,c}(1)),cell2mat(e{m1-1,c}(2)),cell2mat(e{m1-1,c}(3)),cell2mat(e{m1-1,c}( 4)),cell2mat(e{m1-1,c}(5)),cell2mat(e{m1-1,c}(6)),cell2mat(e{m1-1,c}(7)),x1,val1};e(m1-1,c)={e1};end;z=val1;if ((-z)<(-zl))e1={1,[],[],[],[],[],[],[],0};e(m1-1,c)={e1};elseif (abs(round(x1)-x1)<=0.0001)zl=z;end;end;for c=1:1:m2if (cell2mat(e{m1-1,c}(1))==0)zu=cell2mat(e{m1-1,c}(9));end;end;for c=1:1:m2if (-cell2mat(e{m1-1,c}(9))>(-zu))zu=cell2mat(e{m1-1,c}(9));end;end;end;for c=1:1:m2if (cell2mat(e{m1-1,c}(1))==0)&(cell2mat(e{m1-1,c}(9))==zu) x=cell2mat(e{m1-1,c}(8)); end;end;val=zu;end;2.这种方法是课本上的程序,但是不能解题,希望高手能将它改进function [x,y]=IntLp(f,G ,h,Geq,heq,lb,ub,x,id,options)%整数线性规划分支定界法,可求解全整数线性或混合整数线性规划%y=min f'*x subjectto:G*x<=h Geq*x=heq x 为全整数%数或混合整数列向量%用法% [x,y]=IntLp(f,G ,h)% [x,y]=IntLp(f,G ,h,Geq,heq)[x,y]=IntLp(f,G ,h,Geq,heq,lb,ub)[x,y]=IntLp(f,G ,h,Geq,heq,lb,ub,x)% [x,y]=IntLp(f,G ,h,Geq,heq,lb,ub,x,id)% [x,y]=IntLp(f,G ,h,Geq,heq,lb,ub,x,id,options) %参数说明% x:最优解列向量;y:目标函数最小值;f:目标函数系数列向量% G :约束不等式条件系数矩阵;h :约束不等式条件右端列向量% Gep:约束等式条件系数矩阵;heq:约束等式条件右端列向量% lb:解的下界列向量(Default:」nf)% ub:解得上界列向量(Default:inf)% x:迭代初值列向量;% id:整数变量指标列向量,1—整数,0 —实数(default")% options 的设置请参见optimset 或linprog%例min z=x1+4x2%s.t. 2x1+x2<=8% x1+2x2>=6% x1,x2>=0 且为整数%先将x1+x2>=6 化为-x1-2x2<=-6 %[x,y]=IntLp([1;4],[2 1;-1 -2],[8;-6],[],[],[0;0])global upper opt c x0 A b Aeq beq ID options;if nargin<10,options=optimset({});options.Display='off';rgeScale='off';endif 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 nargin<5,heq=[];endif nargin<4,Geq=[];end upper=inf;c=f;x0=x;A=G;b=h;Aeq=Geq;beq=heq;ID=id;ftemp=IntLp(lb(:),ub(:)); x=opt;y=upper;%以下为子函数function ftemp=IntLp(vlb,vub) global upper opt c x0 A b Aeq beq ID options; [x,ftemp,how]=linprog(c,A,b,Aeq,beq,vlb,vub,x0,options); if how<=0return;end;if ftemp-upper>0.00005%in order to avoid error return;end;if max(abs(x.*ID-round(x.*ID)))<0.00005if upper-ftemp>0.00005%in order to avoid error opt=x';upper=ftemp;return;else opt=[opt;x']; return;end;end; notintx=find(abs(x-round(x))>0.00005);%in order to avoid error intx=fix(x);tempvlb=vlb;tempvub=vub;if vub(notintx(1,1),1)>=intx(notintx(1,1),1)+1tempvlb(notintx(1,1),1)=intx(notintx(1,1),1)+1; ftemp=IntLp(tempvlb,vub);end;if vlb(notintx(1,1),1)<=intx(notintx(1,1),1) tempvub(notintx(1,1),1)=intx(notintx(1,1),1);ftemp=IntLp(vlb,tempvub);end;3.这种方法是我网上搜的,也不能解题,希望高手改进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-7 kk=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)==1 flag=1;elsek=FN(1);A=AA{k};b=BB{k};endendendend y=round(y); fval=c*y;以上程序都是我网上搜到的,还有自己从课本上自己敲的,第后两个不能,也许是程序有问题,也许是我不会调用,希望高手指点,应用这三个程序!!!个程序能成功解出答案,帮助更多朋友们能够。