蒙特卡洛模型——有约束的非线性规划问题
题目:
例:求
f
(
x
)
=
x
1
⋅
x
2
⋅
x
3
的最大值
s
.
t
{
−
x
1
+
2
x
2
+
2
x
3
⩾
0
x
1
+
2
x
2
+
2
x
3
⩽
72
10
⩽
x
2
⩽
20
x
1
−
x
2
=
10
\text{例:求}f\left( x \right) =x_1\cdot x_2\cdot x_3\text{的最大值} \\ s.t\begin{cases} -x_1+2x_2+2x_3\geqslant 0\\ x_1+2x_2+2x_3\leqslant 72\\ \,\, 10\leqslant x_2\leqslant 20\\ \,\, x_1-x_2=10\\ \end{cases}
例:求f(x)=x1⋅x2⋅x3的最大值s.t⎩⎪⎪⎪⎨⎪⎪⎪⎧−x1+2x2+2x3⩾0x1+2x2+2x3⩽7210⩽x2⩽20x1−x2=10
蒙特卡洛模型的思路:
1.求变量受限的大致范围;
2.在上述的范围中用随机数生成若干组实验点,先验证是否满足所有约束条件。若满足则将其划分到行组,再从组中找到的函数的最大值(最小值)。
matlab代码部分
蒙特卡洛模拟实现代码
clc;clear
tic
n=10000000;
x1=unifrnd(20,30,n,1);
x2=x1-10;
x3=unifrnd(-10,16,n,1);
fmax=-inf;
for i=1:n
x=[x1(i),x2(i),x3(i)];
if -x(1)+2*x(2)+2*x(3)>=0 && x(1)+2*x(2)+2*x(3)<=72
result=x(1)*x(2)*x(3);
if result>fmax
fmax=result;
X=x;
end
end
end
disp(['蒙特卡洛模拟的结果为:',num2str(fmax)]);
disp(['此时x1,x2,x3的值为',num2str(X)]);
toc
代码输出结果
我用一个表格来表示这次求出来的结果
类型 | Value |
---|---|
最大值 | 3445.5138 |
x1 | 22.6222 |
x2 | 12.6222 |
x3 | 12.0666 |
收获与心得
在求解非线性规划的问题时,我们还可以通过蒙特卡洛方法来解决,我们可以对比两次的结果几乎差不多,尤其是在蒙特卡洛模拟次数n较大时,模拟的结果更加贴近现实。还有为了提高结果的运算过程和精度,我们可以通过缩小随机生成变量的范围来实现,大家还可以通过for循环来优化算法。还有蒙特卡洛算法具有随机性,所以每一次的结果有差异,但是差异可以忽略,结果几乎差不多。
刚开始写博客,作为一名预备码农,数理爱好者,希望和广大数模爱好者、matlab爱好者等交流、分享学习过程,共同进步!