关于MATLAB遗传算法工具箱不等式约束

 

过去很久了,之前写论文的经验分享一下。

写毕业论文的时候需要用到遗传算法,网上查了很多资料,由于没时间认真去学算法的内部结构,最后还是选择了MATLAB自带的遗传算法工具箱(MATLAB2017-GA),看着前辈们写的教程很快熟悉了那个操作界面,功能很强大,我先尝试输了简单的函数,很快就把准确的结果求了出来,但是当我把我想要求的自定义函数输好,然后再求解的时候简直快要崩溃,由于自定义函数的每个自变量的系数都是变量,所以每一个个体都需要进行大量计算,再加上复杂的线性非线性约束,每次都是等二十分钟之后算出来一个错误的结果。

这是我遇到的问题,网上查了很久,也没找到解决方式,大概有三四个礼拜都在被这个问题困扰,结果算不出来,论文根本没法进行下去,尝试了各种方法,甚至把每一个m文件点开尝试去看程序的整个计算过程,然而并没有什么卵用,记得好像还有几天就快过年了,那天晚上灵光闪现,我不可能去更改人家已经设计好的m文件,那为什么不把不等式约束加到自定义函数里呢?对于超过不等式约束范围的解在往自定义函数中带的时候,给自定义函数加入一定的惩罚函数,使它在遗传过程中被淘汰掉。

思考过程很漫长,解决方法很简单,以下是我当时写的函数(年代久远,大概参考一下):

——————————自定义函数———————————-

function Q=myminf(x)

    %。。。此处略去一万行

    %g1、g2、g3、g4、g5自定义的不等式约束条件,如果小于零,自定义函数为xxx,如果大于零(不符合),就加入惩罚值

    if g1<0 && g2<0 && g3<0 && g4<0 && g5<0 
        Q=9602.4*x(1)-884.36*x(2)+480.12*x(3)+16200*x(1)*x(2)+87735.04;
    else     

        Q=9602.4*x(1)-884.36*x(2)+480.12*x(3)+16200*x(1)*x(2)+87735.04+25000;
    end

end

——————————GA函数———————————-

close all
clc
clear

obj=@myminf;
nvars=3;
A=[0 0 0];
b=0;
LB=[2 1.5 4];
UB=[4 3 8];
options=gaoptimset(‘PopulationSize’,500,’Generations’,200,’StallGenLimit’,200,’TolCon’,1e100,’SelectionFcn’,@selectiontournament,’Display’,’iter’,’PlotFcns’,@gaplotbestf, ‘PopInitRange’,[2 2 7;4 3 8]);
format long;
[x,fval,exitflag,output,population,scores]=ga(obj,nvars,A,b,[],[],LB,UB,[],options);

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/weixin_42884919/article/details/83834146
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞