蒙特卡洛与遗传算法初识2024.1.18

蒙特卡洛

利用随机数求解非线性规划。

整数规划求解非线性规划,一般是用01决策进行转化,在有限集中进行枚举求解。

所以当范围过大或自变量维数很大用01决策难以转化时,整数规划就寄了。则可以使用蒙特卡洛。

一般选择随机1e6个点

例:

        max\ z=x_1^2+x_2^2+3x_3^2+4x_4^4+2x_5^2-8x_1-2x_2-3x_3-x_4-2x_5

        s.t.\left\{\begin{matrix} x_1+x_2+x_3+x_4+x_5\leq 40 & \\ x_1+2x_2+ 2x_3+x_4+6x_5\leq 80& \\ 2x_1+x_2+6x_3\leq 200 & \\ x_3+x_4+x_5\leq 200& \\ 0\leq x_i\leq 99,x\in Z&i=1,2,\cdots 5 \end{matrix}\right.

optimproblem底层采用枚举,所以需要自定义求解function

[f,g]=mengte(x)

mengte 为调用函数名,返回f目标函数值,g约束条件是否满足all(g<=0)

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

Lingo对于随机算法能得到更优解,但matlab内置的遗传算法能达到同样效果。

遗传算法

matlab内置遗传算法的函数[x,v] = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,IntCon,options)

  • fun:目标函数,可以是函数句柄或一个字符串表达式,默认为最小化。
  • nvars:变量的数量,即目标函数的自变量个数。
  • A:不等式约束的系数矩阵,默认为\leq
  • 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

所得的结果比蒙特卡洛更优

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值