智能优化算法总结

背景

9月上旬准备数模国赛,提前准备了一些智能算法,当时没时间总结,现在比赛结束了抽空总结一下~

1.混合蛙跳算法(SFLA)

思想:

在一片湿地中生活着一群青蛙。湿地内离散的分布着许多石头,青蛙通过寻找不同的石头进行跳跃去找到食物较多的地方。每只青蛙个体之间通过文化的交流实现信息的交换。每只青蛙都具有自己的文化。每只青蛙的文化被定义为问题的一个解。湿地的整个青蛙群体被分为不同的子群体,每个子群体有着自己的文化,执行局部搜索策略。在子群体中的每个个体有着自己的文化,并且影响着其他个体,也受其他个体的影响,并随着子群体的进化而进化。当子群体进化到一定阶段以后,各个子群体之间再进行思想的交流(全局信息交换)实现子群体间的混合运算,一直到所设置的条件满足为止。

过程:

a.输入

F:蛙群数量,m:种群数量,n:子族群中青蛙的数量,Ls:局部进化次数,G:迭代次数(蛙群思想交流次数)

b.蛙群初始化

Px:全局最好蛙

也就是产生问题的初始解(这里一个比较棘手的问题是如何产生具有复杂约束条件的初始解)。然后计算相应的适应度函数。将适应度较好的个体排在前面。适应度越大越好就采用降序,反之采用升序。

记录全局最优解Px。

c.分组

通过取模的方法对蛙群进行划分,也即划分子族群。

第1只蛙分入第 1模因组, 第2只蛙分入第2模因组, 第?只蛙分入第 ?模因组, 第? + 1只蛙重新分入第1模因组, 依次类推.

d.局部进化

对于每一个子族群进行局部进化也就是跳跃。即更新每一个子族群中适应度最差的青蛙。

Pb:局部最好解;Pw:局部最差解;rand():介于0-1之间的随机数

青蛙更新距离 Ds=rand()*(Pb-Pw) (1)

更新后的青蛙 newDw=oldPw+Ds(-Dmax≦Ds≦Dmax) (2)

Dmax表示青蛙个体允许改变的最大步长。如设Uw=[1 3 5 4 2],UB=[2 1 5 3 4],允许改变的最大步长Dmax =3,若rand=0.5 ,则U q(1) =1+min{int[0.5 × (2−1)],3}=1;U q(2) =3+max{int[0.5×(1−3)], −3}=2;依此相同的操作完成更新策略后可得到一个新解U q=[1 2 5 4 3].(摘自百度百科)

更新后的青蛙适应度较差,则使用全局最好解Px去替换局部最优解Pb,再次使用(1)(2)产生新蛙,若新蛙的适应度依旧较差,随机产生一只蛙去取代最差的青蛙。

这里需要注意需要控制生成的新蛙也需要满足问题的约束条件。

        %如果适应度函数增大,就替换
        if aimfun(newDw)>FS(idmin,1)
            FS(idmin,2:end) = newDw;
            FS(idmin,1) = aimfun(newDw);
            f=0;
        else
            %用全局最优来替换Pb
            Pb=Px;
            newDw = (Pw+Ds)./((sqrt(sum((Pw+Ds).^2))));
            if aimfun(newDw)>FS(idmin,1)
                FS(idmin,2:end) = newDw;
                FS(idmin,1) = aimfun(newDw);
                f=0;
            else
                f=2;
            end
        end
        %随机生成一只蛙来替换最差的
        if f==2
            frog = rand(1,8);
            frog = frog./(sqrt(sum(frog.^2)));
            y = aimfun(frog);
            frog = [y,frog];
            FS(idmin,:)=frog;
        end

e.全局思想交流

每个子族群的青蛙进化之后,对蛙群进行混合。依旧根据青蛙的适应度高低进行排序。记录最好蛙Px。继续进行步骤c,d,e。

在每次进行了思想交流之后需要记录最好蛙,以及相关的适应度值。保存在矩阵中。

f.停止条件

(1)在最近的K次全局思想交流过程之后,全局最好解没有得到明显的改进;(可以设置|本次最好解-上次最好解|<某个阈值就停止)

(2)算法预先定义的函数评价次数已经达到。

(3)已有标准测试结果。

2.粒子群算法(PSO)

思想

PSO模拟鸟群的捕食行为。一群鸟在随机搜索食物,在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻离食物最近的鸟的周围区域

过程

a.输入

w :惯性因子 c1:自我认知学习因子 c2:社会认知学习因子 gbest:种群当前最好位置 N = 20:种群中粒子数量 iter_N :迭代次数 dimension:解的维度

b.粒子群初始化

生成符合约束条件的初始解,计算粒子的适应度,并记录每个粒子的最优位置

c.对粒子的速度和位置进行更新

% 速度更新
vi = obj.w*obj.POP(1,i).vi+obj.c1*rand*(obj.POP(1,i).pbestiobj.POP(1,i).xi)+obj.c2*rand*(obj.gbest-obj.POP(1,i).xi);
% 位置更新
xi = obj.POP(1,i).xi+vi;

根据更新后的粒子位置,计算对应的适应度函数,如果适应度更好就替换粒子的最优位置。同时每次迭代也要记录全局最优位置

d.停止条件

1.迭代次数达到Gmax

2.最佳适应度增量小于某个阈值

3.模拟退火算法(SA)

思想:

模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。(其实本质上就是在一定程度上接受较差解,从而避免陷入局部最优值)

过程

a.初始化

输入alpha:降温系数,currenttmp:当前温度,mintmp:最小温度。

b.产生新解

这里也是一个难点,模拟退火算法产生新解的方式还是要结合具体的问题分析的,这种形式只是一种,delta是扰动系数.

%随机扰动
delta = (rand()-0.5)*0.3;
x_new = x_new - 2*delta;

产生了新解之后自然要计算适应度。然后判断是否接受新解。判断函数如下:

这里的dE要根据实际情况确定,如是适应度越大越好dE = f_old-f_new,如果是越小越好就是dE=f_new-f_old

        function flag = judge(obj,dE,t)
            if(dE<0)
                flag = 1;
            else
                d = exp(-(dE/t));
                if d>rand
                    flag=1;
                else
                    flag=0;
                end
            end
        end

c.停止条件

1.当前温度小于最小温度,tmp_current = tmp_init*alpha.

2.迭代了若干次后依然找不到较好的解

4.遗传算法(GA)

思想

遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。

过程

a.编码

这个要根据实际问题分析,这里用比较著名的旅行商问题举例:编码就是路径如:927863451

b.交叉

同样要根据实际问题,对于旅行商问题而言,因为编码的数字不能重复。有很多交叉方法,可以查查相关文献。

c.变异

可以选择两个染色体位交换交换,或者交换两个染色体位两端部分。

总结:

OK,那么总结一下吧,其实智能算法或者说是启发是算法并没有多么高达上,只是因为不能通过穷举来解决问题,因为时间复杂度较高。通过一种随机搜索的思想,无论是混合蛙跳的思想交流,粒子群的群体学习,模拟退火的退火,还是遗传算法交叉变异,都是希望搜索的方向可以向着较好的地方。关于如何产生符合条件的新解,可以通过产生新解之后,看看是否符合条件,如果不符合就把适应度函数返回值设置成inf或者-inf,根据实际情况定。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值