差异演化

差异演化和昨天实现的PSO很类似,都属于优化算法。

算法步骤:

1.设定种群个体个数和需要迭代的次数。当然也可以设定条件,然后判断是否停止迭代。

2.定义交叉概率CR,个体有一定概率进行变异,如果变异则进行第3步,如果不变异则下一代个体和当前个体一样。

3.在种群中随机选出三个互不相同的个体进行变异,变异公式如下(有博士论文总结了一大堆变异公式):

Xi,g+1=Xr1,g+F(Xr2,g-Xr3,g)

其中X是种群中个体特征向量,这里就是x和y坐标。g是种群的代数。i代表当前个体,r1,r2,r3是和i不同,并且也互不相同的个体。

4.计算变异后个体的适应度,如果变异后适应度不如变异前,那么将变异后个体重新恢复为变异前个体。

5.比较变异后个体适应度和种群最优个体适应度,将适应度高的个体赋给种群最优个体。

最后当然还是需要目标函数才能计算适应度。

算法结果如下图,小绿点代表种群最优个体适应度:

clc;
clear all;
close all;

[x , y] = meshgrid(-100:100,-100:100);
sigma = 50;
img = (1/(2*pi*sigma^2))*exp(-(x.^2 + y.^2)/(2*sigma^2));
mesh(img);
hold on
%% 初始化种群,定义结构体
pop_size = 20;%种群个体的数量
pop = struct([]);
for i = 1:pop_size
pop(i).x = -100 + 200*rand;
pop(i).y = -100 + 200*rand;
pop(i).fit = 0;
end
pop_best = pop(1);
p1 = plot3(pop(1).x +100,pop(1).y +100,pop(1).fit,‘k.‘,‘markersize‘,20);
for itervater = 1:1000;
set(p1,‘xdata‘,pop_best.x +100,‘ydata‘,pop_best.y+100,‘zdata‘,pop_best.fit);
drawnow
pause(.1)
[pop,pop_best] = select_and_combine(pop,pop_best,pop_size);
end

function [pop,pop_best] = select_and_combine(pop,pop_best,pop_size)
a = 0.5;%加速因子
pr = 0.8;%变异率
new_pop = pop;%新种群
for i = 1:pop_size
% while 1
% r1 = floor(1 + 20*rand);
% r2 = floor(1 + 20*rand);
% r3 = floor(1 + 20*rand);
% if r1~= i && r2 ~= i && r3~=i...
% r1~= r2 && r2 ~= r3 && r1 ~= r3;
% break;
% end
% end
tem = randperm(pop_size);
r1 = tem(1);
r2 = tem(2);
r3 = tem(3);
if rand < pr
new_pop(i).x = pop(r1).x + a*(pop(r2).x - pop(r3).x);
new_pop(i).y = pop(r1).y + a*(pop(r2).y - pop(r3).y);
end
new_pop(i).fit = compute_fit(new_pop(i));
if pop(i).fit > new_pop(i).fit
new_pop(i) = pop(i);
end
if new_pop(i).fit > pop_best.fit
pop_best = new_pop(i);
end
end
end

function re = compute_fit(pop)
x = pop.x;
y = pop.y;
sigma = 50;
if x < -100 || x>100|| y < -100 || y > 100
re =0;
else
re =(1/(2*pi*sigma^2))*exp(-(x.^2 + y.^2)/(2*sigma^2));
end
end

来源于:http://www.cnblogs.com/tiandsp/p/3159778.html

时间: 2024-10-13 02:39:43

差异演化的相关文章

(转)大型网站架构演化发展历程

前面已经描述了大型网站系统的特点,而对一个大型网站系统,其架构也是重要的一个环节. 大型网站技术主要的挑战来自于庞大的用户.高并发以及海量的数据这三个方面.大型网站的形成就像一颗大树的成长,历尽长时间的磨练,最后枝繁叶茂,服务他人. 初始网站架构结构 起初的网站鉴于用户量.访问量较少,只需要一台服务器足以,应用程序.数据库.文件等其所有资源放在一太服务器上就已经足够满足此时的需求,这时候网站的架构就几个简单组成部分如下图 应用和数据服务分离 随着网站业务需求的发展,越来越多的用户进行访问,此时一

Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(2)

本篇继续上篇<Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(1)>来对Winform开发框架之存储过程的支持进行介绍,上篇主要介绍了SQLServer和Oracle两种数据库对常规存储过程的编写和对比,本篇主要介绍如何在C#里面,如何对这些存储过程进行调用,并获取到对应的数据类型,如输出参数,单个数据记录,多个数据记录等情况.最后在完成实现功能的基础上,对这些实现进行演化提炼,并扩展到我的WInform开发框架里面,实现功能重用.代码简化的目的. 1.数据访问接口的定义

应用软件技术演化

技术驱动应用overview   SOA面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语言.这使得构建在各种各样的系统中的服务可以使用一种统一和通用的方式进行交互. SOA对企业IT的影响 升级SOA的成本   BPM 规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法 两个公司合并实现的BPM CRM与ERP的定义

《软件工程概论》第十一章 软件演化

软件演化特性 1.软件维护是一个必然的过程 2.软件的不断修改会导致软件的退化 3.软件系统的演化特性是在早期的开发阶段建立起来的 4.软件开发的效率与投入的资源无关 5.在软件系统中添加新的功能不可避免地会产生新的缺陷. 软件维护的概念: 1.改正性维护 2.适应性维护 3.完善性维护 软件维护的特点: 1.软件维护受开发过程影响大 2.软件维护困难多 (1)读懂别人的程序是很困难的 (2)文档的不一致性是软件维护困难的又一个因素 (3)软件开发和软件维护在人员和时间上存在差异 (4)软件维护

剖析设计的演化过程:关于‘设计’的设计

中国国家博物馆有一个常设的专题,是改扩建工程中的设计展.在这个展览中,入围的十个方案被陈列出来,还有后期的几次修改.定稿,最终形成了今天的国家博物馆.把招投标的方案独立陈列出来,展现接近艺术的设计感,并不是建筑业的专利.联想到之前在上海看的皮克斯动画25周年展,从草稿.模型.实验性短片到“艺术风景”影视,被解剖开的设计演化过程本身,令人心驰神迷. 昨天重新翻到<设计原本>,虽然是从计算机工程领域出发,但其中关于设计的归纳与描述,还是令我大受启发.所谓的工匠精神,就是追求精益求精的设计感吧.美术

Uber开源「神经演化」可视化工具VINE

艾伯特 AI 科技评论按:算力的提升可能会为旧的算法注入活力.近两年来,神经演化(Neuroevolution)的方法逐渐再次受到关注,包括OpenAI.DeepMind.GoogleBrain.Sentient.Uber等全球几大研究机构近期在这方面都有一些研究,而其中Uber似乎投入了更多的精力. 图1. Google Trend中「Neuroevolution」的变化 艾伯特前段时间曾对 Uber 数日连发的 5 篇关于神经演化的文章进行了深度的解读.这些文章介绍了他们在遗传算法(gene

区块链快速入门(五)——区块链技术的演化

区块链快速入门(五)--区块链技术的演化 一.区块链技术的发展 比特币区块链面向转账场景,支持简单的脚本计算.如果引入更多复杂的计算逻辑,将能支持更多应用场景,即智能合约(Smart Contract).智能合约可以提供除了货币交易功能外更灵活的合约功能,执行更为复杂的操作.引入智能合约的区块链,已经超越了单纯数据记录功能:可以为区块链加入权限管理,高级编程语言支持等,实现更强大的.支持更多商用场景的分布式账本系统.区块链技术的三种典型演化场景如下: 二.区块链技术的分类 根据参与者的不同,区块

第四章 软件架构演化

第一节 软件架构定义及演化 分层架构 ·"关注点分离"原则 ·软件系统的组件被分成多个相互不重叠的层次,每一层都有着特定的职能,仅处理本层的逻辑,而并不关心其它层的实现. ·表现层 ·业务层 ·持久层 ·数据层 ·分层架构模式特点: +结构简单 +易于组织开发 +便于独立测试.维护 -不易实现特续发布.部署 -性能代价 -可扩展性差 面向服务架构 ·面向服务架构(SOA) 是一个分布式组件的集合,这些组件为其它组件提供服务(provider),或者消费其它组件所提供的服务(consum

【设计理念】编码与演化

编码与演化 对于服务端(server-side)应用程序,可能需要执行滚动升级 ,一次将新版本部署到少数几个节点,检查新版本是否运行正常,然后逐渐部完所有的节点.这样无需中断服务即可部署新版本,为频繁发布提供了可行性,从而带来更好的可演化性. 对于客户端(client-side)应用程序,升不升级就要看用户的心情了.用户可能相当长一段时间里都不会去升级软件. 这意味着,新旧版本的代码,以及新旧数据格式可能会在系统中同时共处.系统想要继续顺利运行,就需要保持双向兼容性: 向后兼容 新代码可以读旧数