Matlab——整数规划

整数规划有很多解法,下面将一一列出:
(1)分枝定界法——可求纯或混合整数线性规划(隐枚举法)
\quad (A)分枝。将可行解的空间反复地分割为越来越小的子集
\quad (B)定界。对每个子集内的解集计算一个目标下界
\quad (C)剪枝。若界限超出已知可行解集目标值的子集,不再分枝
(2)割平面法——可求纯或混合整数线性规划
(3)隐枚举法——求解“0-1”规划特殊情形
\quad (A)过滤隐枚举法(只检查变量取值的组合的一部分,就能求到问题的最优解。)
\quad (B)分枝隐枚举法
求解思路:

  • 先试探性求一个可行解,易看出满足条件的一个可行解z0
  • 因为是求极大值问题,故求最优解时,凡是目标值z
  • 改进过滤条件
  • 由于对每个组合首先计算目标值以验证过滤条件,故应优先计算目标值z大的组合,这样可提前太高门槛,以减少计算量。

(4)匈牙利算法——解决指派问题(“0-1”规划特殊情形)
(5)蒙特卡罗法——求解各种类型规划
栗子:
已知非线性整数规划为:
M a x z = x ( 1 ) 2 + x ( 2 ) 2 + 3 x ( 3 ) 2 + 4 x ( 4 ) 2 + 2 x ( 5 ) 2 − 8 x ( 1 ) − 2 x ( 2 ) − 3 x ( 3 ) − x ( 4 ) − 2 x ( 5 ) Maxz=x(1)^2+x(2)^2+3x(3)^2+4x(4)^2+2x(5)^2-8x(1)-2x(2)-3x(3)-x(4)-2x(5) Maxz=x(1)2+x(2)2+3x(3)2+4x(4)2+2x(5)28x(1)2x(2)3x(3)x(4)2x(5)
s . t . { 0 ≤ x ( i ) ≤ 99 ( i = 1 , . . . 5 ) x ( 1 ) + x ( 2 ) + x ( 3 ) + x ( 4 ) + x ( 5 ) ≤ 99 x ( 1 ) + 2 x ( 2 ) + 2 x ( 3 ) + x ( 4 ) + 6 x ( 5 ) ≤ 800 2 x ( 1 ) + x ( 2 ) + 6 x ( 3 ) ≤ 200 x ( 3 ) + x ( 4 ) + 5 x ( 5 ) ≤ 200 s.t. \begin{cases} 0\leq x(i) \leq99(i=1,...5)&\\ x(1)+x(2)+x(3)+x(4)+x(5)\leq99&\\ x(1)+2x(2)+2x(3)+x(4)+6x(5)\leq800 &\\ 2x(1)+x(2)+6x(3)\leq200 &\\ x(3)+x(4)+5x(5)\leq200 &\\ \end{cases} s.t.0x(i)99(i=1,...5)x(1)+x(2)+x(3)+x(4)+x(5)99x(1)+2x(2)+2x(3)+x(4)+6x(5)8002x(1)+x(2)+6x(3)200x(3)+x(4)+5x(5)200

\\使用MATLAB,首先构造一个函数。
function [f,g]=mengte(x);
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);
g=[sum(x)-400
x(1)+x(2)+x(3)+x(4)+x(5)-400
2*x(1)+x(2)+6*x(3)-200
x(3)+x(4)+5*x(5)-200];
\\其次,使用函数
rand('state',sum(clock));
p0=0;
tic
for i=1:10^6
    x=99*rand(5,1)
x1=floor(x);
x2=ceil(x);
[f,g]=mengte(x1);
if sum(g<=0)==4
    if p0<=f
        x0=x2;p0=f;
    end
end
end
x0,p0
toc
\\使用LINGO软件建模
model:
sets:
row/1..4/:b;
col/1..5/:c1,c2,x;
link(row,col):a;
endsets
data:
c1=1,1,3,4,2;
c2=-8,-2,-3,-1,-2;
a=1 1 1 1 1
  1 2 2 1 6
  2 1 6 0 0
  0 0 1 1 5;
b=400,800,200,200;
enddata
max=@sum(col:c1*x^2+c2*x);
@for(row(i):@sum(col(j):a(i,j)*x(j))

结果如下所示:
Matlab——整数规划_第1张图片
Matlab——整数规划_第2张图片

你可能感兴趣的:(MATLAB)