蒙特卡洛
利用随机数求解非线性规划。
整数规划求解非线性规划,一般是用01决策进行转化,在有限集中进行枚举求解。
所以当范围过大或自变量维数很大用01决策难以转化时,整数规划就寄了。则可以使用蒙特卡洛。
一般选择随机1e6个点
例:
底层采用枚举,所以需要自定义求解
为调用函数名,返回目标函数值,约束条件是否满足
clc,clear,close all;
rng(0);
v0=0;
x0=0;
n=1e6;
tic
for i=1:n
x=randi([0,99],1,5);
[f,g]=mengte(x);
if all(g<=0)
if v0<f
x0=x;v0=f;
end
end
end
toc
disp(x0);
disp(v0);
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
对于随机算法能得到更优解,但内置的遗传算法能达到同样效果。
遗传算法
内置遗传算法的函数
fun
:目标函数,可以是函数句柄或一个字符串表达式,默认为最小化。nvars
:变量的数量,即目标函数的自变量个数。A
:不等式约束的系数矩阵,默认为b
:不等式约束的右侧向量。Aeq
:等式约束的系数矩阵。beq
:等式约束的右侧向量。lb
:自变量下限向量。ub
:自变量上限向量。nonlcon
:非线性约束函数,可以是函数句柄或一个字符串表达式。- IntCon: 整数约束。
options
:一个结构体,包含优化选项的设置。
例 :
问题同上
clc,clear,close all;
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
];
tic
[x0,v]=ga(@(x) -op(x),5,A,b,[],[],zeros(1,5),99*ones(1,5),[],[1:5]);
toc
disp(x0);
disp(-v);
function f=op(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);
end
所得的结果比蒙特卡洛更优