蒙特卡罗法
原文:
http://blog.csdn.net/qq_34861102/article/details/77859530
随机抽样或统计模拟方法,是一种以概率统计理论为指导的一类非常重要的数值计算方法
使用Matlab求解非线性整数规划(蒙特卡罗法)
模型:
max 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)
s.t.
x1 + x2 + x3 + x4 + x5 <= 400
x1 + 2*x2 + 2*x3 + x4 + 6*x5 <= 800
2*x1 + x2 + 6*x3 <= 200
x3 + x4 + 5*x5 <= 200
0=< xi <= 99 , i = 1,2,3,4,5
Matlab代码:
function [f,g] = fun1(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(1)=sum(x)-400;
g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;
g(3)=2*x(1)+x(2)+6*x(3)-200;
g(4)=x(3)+x(4)+5*x(5)-200;
主函数:
rand('state',sum(clock));
p0=0;
tic
for i=1:10^7
x=99*rand(5,1);
x1=floor(x);
x2=ceil(x);
[f,g]=fun1(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;
p0=f;
end
end
[f,g]=fun1(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;
p0=f;
end
end
end
x0, p0
toc
这样运行的时间就是 11.68 秒,运行结果为50297,采用的实例是其中的0.01%的数目
正常的Matlab求解非线性规划:
function ff = fun(x)
ff = -(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));
end
tic
x0 = [50 99 0 99 20];
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];
Aeq = [];
beq = [];
VLB = [0;0;0;0;0];
VUB = [99;99;99;99;99];
[x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,VLB,VUB)
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))@for(col:@gin(x));
@for(col:@bnd(0,x,99));
end
最优解为:51568.00
这里是一个简单的实例。实际情况会复杂很多,无法可行时间内得出解的时候,就可以考虑使用蒙特卡罗法,可见蒙特卡罗法误差度较低。