导论
数学规划中的变量(部分或全部)限制为整数时,称为整数规划,前者为完全整数规划,后者为混合整数规划。
求解方法可分为:1分支定界法,2割平面法,2隐枚举法,4匈牙利法,5蒙特卡罗法。下面介绍0-1型整数规划的matlab求解与蒙特卡罗法。
0-1型整数规划
0-1型整数规划是整数规划中的特殊情形,它的变量x仅取值0或1,称其为0-1变量或二进制变量。在实际问题中,如果引入0-1变量,就可以把有各个情况需要分别讨论的数学规划问题统一在一个问题中讨论了。
整数线性规划的计算机求解
Matlab求解整数线性规划使用如下命令:
[x, fval] = intlinprog(f, intcon, A, b, Aeq, beq, lb, ub);
Matlab在求解数学规划问题中存在一个问题,即只能针对一维决策变量。
指派问题
clear
clc
intcon = 1:25;
c = [3 8 2 10 3; 8 7 2 9 7; 6 4 2 7 5; 8 4 2 3 5; 9 10 6 9 10]; % 指派矩阵
c = c(:);
Aeq = zeros(10, 25);
for i = 1:5
Aeq(i, (i-1)*5+1:5*i) = 1;
Aeq(5+i,i:5:25) = 1;
end
beq = ones(10, 1);
xl = zeros(25, 1);
xu = ones(25, 1);
[x, fval] = intlinprog(c, intcon, [], [], Aeq, beq, xl, xu);
x = reshape(x, [5, 5]);
混合整数规划问题
clear
clc
f = [-3; -2; -1]; intcon = 3;
A = ones(1, 3); b = 7;
Aeq = [4 2 1]; beq = 12;
xl = zeros(3, 1); xu = [inf; inf; 1];
[x, fval] = intlinprog(f, intcon, A, b, Aeq, beq, xl, xu);
蒙特卡洛算法
整数规划由于限制变量为整数而增加了难度,但又由于整数解是有限个,为枚举法提供了方便。
clear
clc
p0 = 0;
x = randi([0, 99], 1, 5);
tic
for i = 1:10^7
x = randi([0, 99], 1, 5);
[f, g] = mengte(x);
if all(g <= 0)
if p0 < f
x0 = x; p0 = f;
end
end
end
x0,p0
toc
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) + 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];
end