整数规划
变量限制为整数
方法:分枝定界(纯和混合)
割平面(同上)
隐枚举法(0-1)
匈牙利
蒙特卡洛
0-1型整数
0或1,二进制
相互排斥约束条件
m个相互排斥的约束条件,
ai1x1+…+ainxn<=bi. I=1,2,3,4,5…m
引入m个0,1变量 yi=1(当i起作用)
充分大的M
ai1x1+…+ainxn<=bi+(1-yi)*M i=1,2,3。。。m
y1+。。。+ym=1
固定费用
有固定成本kj和变动成本cj
min z=sigma kjyj+cjxj
yje<=xj<=yjM(e为充分小的数,M为充分大的数)
指派问题
n人n项工作,第i人做第j项工作要cij单位时间,如何分配时间最少
xij=1(I做j)/0(I不做j)
min sigma cij*xij
蒙特卡洛(随机取样法)
matlab相关知识:
unifrnd关于这个函数的使用
rand关于这个函数
state和seed关于rand的state和seed
randi相关介绍
eg:求y=x^2 和y=12-x围成的曲面三角形的近似面积大小
在[0,9]x[0,12]的矩形区域取10^7个点,求落在三角形面积的频数,三角形面积为频率乘矩形面积
clc
clear
x=unifrnd(0,12,[1,10000000]);
y=unifrnd(0,9,[1,10000000]);
pin=sum(y<x.^2&x<=3)+sum(y<12-x&x>=3);
area=12*9*pin/10^7;
eg:0~99中取一个数
用10^ 6个点来估算
蒙特卡洛算法
%%%蒙特卡洛法
%%定义目标函数和约束向量函数
function [f, g] = mengte(x);
f = x(1) ^ 2 + x(2) ^ 2 + 3 * x(3) ^ 2 + 4 * x(4) ^ 2 + 2 * x(5) - 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
* x(1) + x(2) + 6 * x(3) - 200
x(3) + x(4) + 5 * x(5) - 200];
end
%%%通过迭代求解
rand('state', sum(clock)); %初始化随机数发生器
p0 = 0;%p0代表目标值z,x0代表目标x
tic%计时开始
for i = 1 : 10 ^ 6 %采集10^6个点
x = randi([0,99],1,5);%0<= x <= 99(整数)
[f, g] = mengte(x);
if all(g <= 0)%若满足4个则符合条件
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);
模型:st. x(intcon)为整数
Ax<=b
Aeqx=beq
lb<=x<=ub