(一)优化模型——遗传算法

一、算法概念

遗传算法所遵循的是生物进化中“优胜劣汰”思想,是一种概率性的有随机搜索功能的遗传机制。它的基本思想是通过模拟染色体,采取随机的编码方式对问题的解进行编码,通过选择、交叉、变异得到新的个体,然后对新个体进行适应度计算,适应度较高的个体基因将有较大机会得到存续,适应度较低的个体基因会通过罚函数淘汰,进而提升种群整体的适应度,直到得到最优的结果。遗传算法全局搜索能力较强,因此被广泛用于路径规划等方面。

通俗的解释就是:比如说我们要求一片山的最高点,我们可以在一堆可能的点中,我们选择一些点,然后带入自己写的函数中,看看哪些更接近,接近的留下来,不接近的排除,之后将接近的点进行所谓的交叉变异,一步步的让结果更加靠近最高点即可。

下面介绍遗传算法的几个基本概念:

①染色体:问题的一个可行解被称为一条染色体,而可行解编码的分量被称为染色体上的基因。

②群体:算法中染色体的总数称为群体,群体中包含了问题的部分解。

③适应度:每个染色体编码后,都是问题的一个解,而每个解又对应这一个函数值,这个函数值即为适应函数,算法可以根据适应度函数的大小进行染色体的筛选,使得结果变得更加接近最佳。

④选择:根据每条染色体的适应度,对染色体进行轮盘赌的选择方法,适应度高的被留下的概率就大。

⑤交叉:交叉即将两个父代个体的部分结构进行替换重组从而形成新的个体的操作,是遗传算法的核心部分。

⑥变异:变异即对个体上的某些或某个基因进行基因组的改变,提升群体的多样性。

算法中称遗传的生物体为个体,个体对环境的适应程度用适应值表示。适应值取决于个体的染色体,在算法中染色体常用一串数字表示,数字串中的一位对应一个基因。一定数量的个体组成一个群体。对群体中的染色体进行筛选、交叉及变异等操作,生成新的群体,称为新一代。

二、算法流程

遗传算法计算程序的基本流程如下:

①选择更为简单合适的编码,将问题中的变量转换为一条条染色体。

②选择适合的初始参数,其中包括群体中的个体数、交叉概率以及变异概率。同时需确定好模型中各个点之间的距离。

③确定适应值函数f(x),且函数值应为正值。

④随机初始化,根据编码规则和种群规模,随机生成初始种群;

⑤对每一染色体(串)计算其适应度,同时计算群体的总适应值。

⑥对种群采用轮盘赌的方式进行选择,对每串产生[0,1]间随机数,若r>pc,则可以从种群中筛选得到新的种群。

⑦对种群中的个体进行适应度分析,将适应度不合适的个体用罚函数筛选掉,留下满足基本要求的个体,最后对染色体进行解码操作,从而得出最合适的结果。

 交叉会使染色体之间交换信息,从而保留优秀的信息,而变异会使基因发生图变,从而产生新的个体,这有助于让算法跳出局部最优解的陷阱。具体流程如下

三、算法应用

遗传算法可以在求极值、多目标规划、TSP、车间调度等问题上应用

比如求解下面函数的最大值或者最小值。

四、算法优缺点

1.算法优点

①许多传统的算法都是单点搜索,在空间中对点进行搜寻,在多高峰的情况下很容易就陷入了局部最优解的情况,而遗传算法在寻找最优解的过程中,不依赖梯度寻找,而通过交叉变异等方式跳出局部最优,同时对空间的多个解进行适应度分析,因此具有很强的全局搜索能力

②在遗传算法中,只需通过适应度函数来对个体完成评价,而不需要其他的辅助信息,且适应度函数不受约束,定义域也可任意设定

③遗传算法具有很强的鲁棒性、随机性、自适应性。算法过程中的遗传、交叉及变异等操作都是通过轮盘赌的随机概率去实现的,增加了整个算法的灵活性,从而使得在进化的过程中产生更加优质的个体,提高整个种群的稳定性

④遗传算法还具体很强的可扩展性,易与其他算法进行结合,从而增加算法特性。

2.算法缺点

早熟收敛是遗传算法一大问题,当群体中所有个体相似度过高时,进化就会缓慢甚至停止,参数的设置不当更可能导致个体失去竞争性,从而整个群体的进化变得缓慢。

②遗传算法的求解约束问题能力弱,对于不符合标准的个体,一般采用罚函数将其排除,而提前确定合适的罚函数显得很难,往往需要实验的不断调整,好的罚函数对实验结果有着很大的影响。

③遗传算法的实现过程有些复杂,在对问题进行编码后,还需在找到最优解后对问题进行解码,同时对交叉率和变异率的选择,也对结果有着影响,如何选择更加合适的初始数据,只能凭借经验和实验的不断修改。

五、算法代码

可以参考毕业论文中的代码

%% 标准遗传算法SGA
clear
clc
pc=0.7;
pm=0.05;
%定义遗传算法参数
NIND=40;        %个体数目
MAXGEN=500;     %最大遗传代数
NVAR=2;               %变量的维数
PRECI=20;             %变量的二进制位数
GGAP=0.9;             %代沟
trace=zeros(MAXGEN,1);
FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])];%建立区域描述器
Chrom=crtbp(NIND, NVAR*PRECI);                       %创建初始种群
gen=0;                                               %代计数器   
maxY=0; %最优值
ObjV=ObjectFunction(bs2rv(Chrom, FieldD));%计算初始种群个体的目标函数值
while gen<MAXGEN                                     %迭代
    FitnV=ranking(-ObjV);                            %分配适应度值(Assign fitness values)
    SelCh=select('sus', Chrom, FitnV, GGAP);         %选择
    SelCh=recombin('xovsp', SelCh, pc);              %重组
    SelCh=mut(SelCh,pm);                             %变异
    ObjVSel=ObjectFunction(bs2rv(SelCh, FieldD));           %计算子代目标函数值
    [Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);  %重插入
    gen=gen+1;           %代计数器增加
    if maxY<max(ObjV)
        maxY=max(ObjV);
    end
    trace(gen,1)=maxY;
end

%% 进化过程图
plot(1:gen,trace(:,1));

%% 输出最优解
[Y,I]=max(ObjV);
X=bs2rv(Chrom, FieldD);
disp(['最优值为:',num2str(Y)])
disp(['对应的自变量取值:',num2str(X(I,:))])

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值