一、程序设计流程及参数选取

   1、遗传算法的程序设计伪代码

BEGIN t=0;%遗传代数
    初始化P(t);初始化种群或染色体
    计算P(t)的适应值;
    while(不满足停止准则)do 
        begin 
        t=t+1;
        从P(t-1)中选择P(t);%选择
        重组P(t);%交叉和变异
        计算P(t)的适应值;
    end
END

    2、遗传算法的参数设计原则

    (1)种群的规模:种群规模的一个建议值为0~100 。

    (2)变异概率:变异概率一般取为0.0001~0.2 。

    (3)交配概率:交配概率一般取0.4~0.99 。

    (4)进化代数:进化代数一般取100~500 。

    (5)种群初始化:初始种群的生成是随机的。在初始种群的赋予之前,尽  量进行一个大概的区间估计,以免初始种群分布在远离全局最优解的编码空     间,导致遗传算法的搜索范围受到限制,同时也为算法减轻负担。

二、MATLAB遗传算法工具箱

    1、GA工具箱简介

        为了省略艰深难懂的遗传算法数学理论和降低程序开发的难度,MATLAB软件已经将遗传算法命令进行了封装,做成专门的遗传算法工具箱—GA Toolbox

    2、工具箱核心函数的用法

        (1)函数ga

                 函数ga的语法格式

[x,fval,reason] = ga (@fitnessfun,nvars,options)

               其中,x为经过遗传进化后自变量最佳染色染体返回值(最佳解),fval为最佳染色体的适应度(最佳值),reason为算法停止的原因,@fitnessfun为适应度句柄函数;nvars为目标函数自变量的个数;options为算法的属性设置,该属性是通过函数gaoptimset赋予的 ;

      (2)函数gaoptimset

               函数gaoptimset的语法格式为

Options=gaoptimset(‘PropertyName1’,’propertyValue1’, ‘PropertyName2’,’propertyValue2’, 
‘PropertyName3’,’propertyValue3’,…….)

              函数gaoptimset实现的功能为,设置遗传算法的参数和句柄函数,下图所列为函数gaoptimset常用的11种属性。

遗传算法实现排课 java 遗传算法课程设计_初始化

             由于遗传算法本质上是一种启发式的随机运算,算法程序经常重复运行多次才能得到理想结果。鉴于此,可以将前一次运行得到的最后种群作为下一次运行的初始种群,如此操作会得到更好的结果。例如:

[x,fval,reason,output,final_pop]=ga(@fitnessfcn,nvars);

            最后一个输出变量final_pop返回的就是本次运行得到的最后种群。再将final_pop作为函数ga的初始种群,语法格式为

 

options=gaoptimset('InitialPopulation',finnal_pop);
[x,fval,reason,output,finnal_pop2]=ga(@fitnessfcn,nvars,options);

三、Genetic Algorithm and Direct Search Toolbox 适应度函数设计

             实例1  遗传算法和直接搜索工具箱中的函数ga是求解目标函数的最小值,所以求目标函数最小值的问题,可直接令目标函数为适应度函数(注意:这里是求最小值)。编写适应度函数,语法格式如下:

function f=fitnessfcn(x)%x为自变量向量
f=f(x);

           实例2 如果有约束条件(包括自变量的取值范围),对于求解函数的最小值问题,可以使用如下语法格式:

function f=fitnessfcn(x)
if(x<=-1)lx>3)%表示有约束x>-1和x<=3,其他约束条件类推
    f=inf;
else 
    f=f(x);
end

         实例3如果有约束条件(包括自变量的取值范围),对于求解函数的最大值问题,可以使用如下语法格式

function f=fitnessfcn(x)
if(x<=-1)|x>3)
    f=inf;
else 
    f=-f(x);%注意,这里f=-f(x)而不是f=f(x)
end

       若目标函数作为适应度函数,则最终得到的目标函数值为一fval而不是fval。

四、程序设计范例

遗传算法实现排课 java 遗传算法课程设计_初始化_02

    首先编写函数f(x)的文件

function f=lbw(x)
if(x(1)>30|x(1)<-30|x(2)>30|x(2)<-30|x(3)>30|x(3)<-30|x(4)>30|x(4)<-30|x(4)>30|x(5)>30|x(5)<-30|x(6)>30|x(6)<-30|x(7)>30|x(7)<-30|x(8)>30|x(8)<-30|x(9)>30|x(9)<-30|x(10)>30|x(10)<-30)
    f=300;
else
    f=-2*pi*exp(-0.2*sqrt(1/10*((x(1)).^2+(x(2)).^2+(x(3)).^2+(x(4)).^2+(x(5)).^2+(x(6)).^2+(x(7)).^2+(x(8)).^2+(x(9)).^2+(x(10)).^2)))-exp(1/10*(cos(2*pi*x(1))+cos(2*pi*x(2))+cos(2*pi*x(3))+cos(2*pi*x(4))+cos(2*pi*x(5))+cos(2*pi*x(6))+cos(2*pi*x(7))+cos(2*pi*x(8))+cos(2*pi*x(9))+cos(2*pi*x(10))))+2*pi;
end

      编写主函数

options=gaoptimset('Generations',800,'StallGenLimit',300,'PlotFcns',@gaplotbestf);
[x,f]=ga(@lbw,10,options)

运行结果: 

遗传算法实现排课 java 遗传算法课程设计_初始化_03