在matlab中使用哪个命令可以求解混合整数线性规划问题?

在matlab中使用哪个命令可以求解混合整数线性规划问题?,第1张

bintprog 求解0-1规划问题 格式如下

x = bintprog(f)

x = bintprog(f, A, b)

x = bintprog(f, A, b, Aeq, beq)

x = bintprog(f, A, b, Aeq, beq, x0)

x = bintprog(f, A, b, Aeq, Beq, x0, options)

[x, fval] = bintprog(...)

[x,fval, exitflag] = bintprog(...)

[x, fval, exitflag, output] = bintprog(...)

这里x是问题的解向量

f是由目标函数的系数构成的向量

A是一个矩阵,b是一个向量

A,b和变量x={x1,x2,…清段,xn}一起,表示了线性规划中不等式约束条件

A,b是系数矩阵和右端向量。

Aeq和Beq表示了线性规划中等式约束条件中的系数矩阵和右端向量。

X0是给定的变量的初始值

options为控制规划过程的参数系列。

返回值中fval是优化结束后得到的目标函数值。

exitflag=0表示优化结果已经超过了函数的估计值或者已声明的最大迭代次数;

exitflag>0表示优化过程中变量收敛于闹渣解X,

exitflag<0表示计算不收敛。

output有3个分量,

iterations表示优化过程的迭代次数,

cgiterations表示PCG迭代次数,

algorithm表示优化所采用的运算规则。

在使用linprog()命令时,系统默认它的参数至少为1个,

但如果我们需要给定第6个参数,则第2、3、4、5个参数也必须给出,否则系统无法认定给出的是第6个参数。遇到无法给出时,则用空矩阵“[]”替代。

例如

max=193*x1+191*x2+187*x3+186*x4+180*x5+185*x6%f由这里给出

st.

x5+x6>=1

x3+x5>=1

x1+x2<=1

x2+x6<=1

x4+x6<=1

%a、b由不等关系给出,如没有不等关系,a、b取[]

x1+x2+x3+x4+x5+x6=1%aep、bep由等式约束给出

代码如下

f=[-193-191-187-186-180-185]

a=[0 0 0 0 -1 -10 -1 0 0 -1 01 1 0 0 0 00 1 0 0 0 10 0 0 1 0 1]

b=[-1,-1,1,1,1]'

aeq=[1 1 1 1 1 1]

beq=[3]

x=bintprog(f,a,b,aeq,beq)

注意

目标值为最大值时应乘以液正悄-1化为求最小值;

不等约束为>=时应乘以-1化为<=

你用round肯定不可能限制这些变量为整数的。

对于混合整数线性规划问题(MILP),2014a引入了一个函数intlinprog可用于求解。

intlinprog(c,1:8,A,B,[],[],zeros(8,1))

另外,可以用遗传算法求解混合整数非线性规划问题(当然,用于线性规划也可以)

ga(@(x)c*x(:),8,A,B,[],[],zeros(1,8),[],[],1:8)

但是,用两种方法得到的结果都是无法找到可行解(也就是,无法满足所有的约束条件,与目标函数无关),请题主还是检查一下问题自身是否有误。

为验证上述结果的正确性,我把模型转为Lingo格式,用Lingo求解:

max=x1

12*x1+0*x2+10*x3+0*x4+0*x5+0*x6+0*x7+0*x8<=47

-12*x1+0*x2+10*x3+0*x4+0*x5+0*x6+0*x7+0*x8<=-37

18*x1+0*x2+10*x3+8*x4+0*x5+0*x6+0*x7+0*x8<=88

-18*x1+0*x2+-10*x3+-8*x4+0*x5+0*x6+0*x7+0*x8<=-80

0*x1+12*x2+0*x3+0*x4+10*x5+0*x6+0*x7+0*x8<=31

0*x1+-12*x2+0*x3+0*x4+-10*x5+0*x6+0*x7+0*x8<=-21

0*x1+18*x2+0*x3+0*x4+10*x5+8*x6+0*x7+0*x8<=81

0*x1+-18*x2+0*x3+0*x4+-10*x5+-8*x6+0*x7+0*x8<=73

0*x1+6*x2+0*x3+0*x4+10*x5+8*x6+8*x7+0*x8<=131

0*x1+-6*x2+0*x3+0*x4+-10*x5+-8*x6+-8*x7+0*x8<=-123

18*x1+18*x2+10*x3+8*x4+-10*x5+8*x6+8*x7+8*x8<=252

-18*x1+-18*x2+-10*x3+-8*x4+10*x5+-8*x6+-8*x7+-8*x8<=-244

1*x1+1*x2+-0.2*x3+-0.2*x4+-0.2*x5+-0.2*x6+-0.2*x7+-0.2*x8<=0

@gin(x1)

@gin(x2)

@gin(x3)

@gin(x4)

@gin(x5)

@gin(x6)

@gin(x7)

@gin(x8)

其中目标函数是随便写的,因为现在主要是要验证约束条件存在冲突,导致找不到可行解,与目标函数无关。验证的结果同样是找不到可行解(州此歼81. NO FEASIBLE SOLUTION FOUND)。

对扒枝于这种情况,Lingo提供了Debug功能,可以帮册冲助用户找出导致不可行的最小约束集合,得到的结果如下:

  Constraints and bounds that cause an infeasibility:

  Sufficient Rows:

  (Dropping any sufficient row will make the model feasible.)

   [_3] - 12 * X1 + 10 * X3 <= - 37 

   [_2] 12 * X1 + 10 * X3 <= 47 

  Sufficient Variable Bounds:

  (Dropping any sufficient bound will make the model feasible.)

   X3 >=  0

也就是说,去掉第一个或第二个约束都可以解决可行解的问题,或者去掉x3>=0的变量限制也可以(我试了一下,好像这个不起作用?)。总之还是请题主好好check一下题目的条件。

可以用YALMIP工具箱解整数规划

定义变量:

sqdvar()实型

intvar()整型

binvar()0-1型

设定目标函数 :

f=目标函数

设定限定条件:

F=set(限定条件)

多个限定条件用加号相连:

F=set(限定条件)+set(限定条件1)+set(限定条件2)…乱肢…

求解: solvesdp(F,f)

这里解得是F条件下目标函数f的最小值,要求最大值f前面加个负号

求解之后查看数值 :

double(f) double(变量)

intvar(m,n):生成整数型变量;

sdpvar(m,n):生产变量;

solvesdp(F,f):求解最优解(最小值),其中F为约中陪袜束条件(用set连接),f为目标函数

double:显示求解的答案

有个例子:

已知卖激非线性整数规划为:

Max z=x1^2+x2^2+3*x3^2+4*x4^2+2*x5^2-8*x1-2*x2-3*x3-x4-2*x5

s.t.

0<=xi<=99(i=1,2,...,5)

x1+x2+x3+x4+x5<=400

x1+2*x2+2*x3+x4+6*x5<=800

2*x1+x2+6*x3<=800

x3+x4+5*x5<=200

matlab中输入

>>x=intvar(1,5)

f=[1 1 3 4 2]*(x'.^2)-[8 2 3 1 2]*x'F=set(0<=x<=99)

F=F+set([1 1 1 1 1]*x'<=400)+set([1 2 2 1 6]*x'<=800)+set(2*x(1)+x(2)+6*x(3)<=800)

F=F+set(x(3)+x(4)+5*x(5)<=200)solvesdp(F,-f)

max=double(f)

sx=double(x)

* Starting YALMIP integer branch &bound.

* Lower solver : fmincon-standard

* Upper solver : rounder

* Max iterations : 300

Warning : The relaxed problem may be nonconvex. This means

that the branching process not is guaranteed to find a

globally optimal solution, since the lower bound can be

invalid. Hence, do not trust the bound or the gap...

Node Upper Gap(%) LowerOpen

1 : -8.020E+004 0.03-8.025E+004 2

2 : -8.020E+004 0.03-8.025E+004 1

3 : -8.020E+004 0.00-8.020E+004 2

+ 3 Finishing. Cost: -80199

max =

80199

sx =

53999999 0


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12518128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存