整数规划的定义:
数学规划中的变量(部分或者全部)限制为整数的时候,称为整数规划。
整数规划的分类:
如果不加特殊说明,指的就是整数线性规划(在线性规划的模型中变量限制为整数)。分为两类:
1:变量全部限制为整数,称纯整数规划。
2:变量部分限制为整数,称混合整数规划。
整数规划的特点:
1:原线性规划的最优解全是整数,则自变量限制为整数之后,最优解不变。
2:整数规划没有可行解。
0-1型整数规划
顾名思义,在该模型下,变量xi的值只能取到0或者1,称xi为0-1变量或者二进制变量。可由约束条件 0 <= xi <= 1而且xi为整数所代替。
在一些互相排斥的约束问题:比如两种方式可供选择,但是只能选择一种的情形。
在一些指派问题的数学模型中:比如:n个人分配去做n项工作,每个人都做且都只能做一项工作。
蒙特卡洛随机取样法求解
先给出一个例子:
y = x^2, y = 12 - x与x轴在第一象限围成一个曲边三角形,设计一个随机试验求该图形的面积。
分析:可以在一个已知矩形面积(包含所求的曲边三角形)的矩形中生成n个随机数之后统计落在去边三角形中的随机数的个数,之后计算比值,从而得出面积。
clc
clear
x = unifrnd(0, 12, [1, 100000]);
y = unifrnd(0, 9, [1, 100000]);
ps = sum(y < x .^ 2 & x <= 3) + sum(y < 12 - x & x >= 3)
area = ps/100000 * 9 * 12
上述内容简单的介绍了蒙特卡洛法的基本思想。
实战:用蒙特卡洛法求解非线性整数规划。
% 首先编写函数
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
% 正式的Matlab代码
rand('state', sum(clock)) % 初始化随机数发生器。(感觉可有可无)
p0 = 0
tic % 开始计时
for i = 1:10^6
x = randi([0, 99], 1, 5) % 生成一行五列的在区间[0,99]的随机整数
[f, g] = mengte(x);
if all(g <= 0)
if p0 < f
x0 = x;
p0 = f; % 记录下来当前更好的解
end
end
end
x0
p0
toc % 计时结束
整数线性规划的计算机求解
在Matlab中求解混合整数线性规划的命令为:
[x, fval] = intlinprog(f, intcon, a, b, aeq, beq, lb, ub)
% f, x, intcon, beq, lb, ub为列向量;a, aeq为矩阵。
混合整数规划问题如下:
clc
clear
f = [-3;-2;-1]
intcon = 3
a = ones(1,3)
b = 7
aeq = [4 2 1]
beq = 12
lb = zeros(3,1)
ub = [inf;inf;1]
x = intlinprog(f, intcon, a, b, aeq, beq, lb, ub)
% 求得最优解为x1 = 0, x2 = 5.5, x3 = 1; 目标函数的最优值为 z = -12。