matlab练习程序(演化策略ES)

% 算法步骤如下:
% 1.设定种群个体数和需要迭代的次数。
% 2.选择父代中的个体按照公式:
% z1=sqrt(-2*ln(u1))*sin(2*pi*u2)*m,
% z2=sqrt(-2*ln(u1))*cos(2*pi*u2)*m
% 这里u1,u2都是随机值,m是控制因子,演化次数越多m,
% m越小,父代通过与z1,z2相加得到后代。
% 3.计算后代的适应性。
% 4.选择后代中最优的适应性作为全局最优适应性。


%% matlab 代码开始
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);
axis([-100,100,-100,100,2e-5,8e-5]);
hold on
%% 初始化种群
pop_size = 20;%种群规模
pop = struct([]);
iterative = 100;
for i = 1:pop_size
pop(i).x = -100 + 200*rand();
pop(i).y = -100 + 200*rand();
pop(i).fit = compute_fit(pop(i));
end
pop_best = pop(1);

%% 演化开始
p1 = plot3(pop_best.x +100,pop_best.y+100,pop_best.fit,‘k.‘,‘markersize‘,30);
for i = 1:iterative
set(p1, ‘xdata‘,pop_best.x+100,‘ydata‘,pop_best.y+100,‘zdata‘,pop_best.fit)
drawnow
pause(.1)
[pop,pop_best] = select_and_combin(pop,pop_best,pop_size,i,iterative);
end

function [new_pop,pop_best] = select_and_combin(pop,pop_best,pop_size,k,iterative)
mul = (iterative - k) / iterative;
new_pop = pop;
% z1=sqrt(-2*ln(u1))*sin(2*pi*u2)*m,
% z2=sqrt(-2*ln(u1))*cos(2*pi*u2)*m
for i = 1:pop_size
%随机数
u1 = rand();
u2 = rand();
z1 = sqrt(-2*log(u1))*sin(2*pi*u2)*mul;
z2 = sqrt(-2*log(u1))*cos(2*pi*u2)*mul;
%变异
new_pop(i).x = pop(i).x + z1;
new_pop(i).y = pop(i).y + z2;
%计算适应值
new_pop(i).fit = compute_fit(new_pop(i));
if new_pop(i).fit < pop(i).fit
new_pop(i) = pop(i);
end
if pop_best.fit < new_pop(i).fit
pop_best = 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

http://www.cnblogs.com/tiandsp/p/3165388.html

时间: 2024-10-07 11:07:03

matlab练习程序(演化策略ES)的相关文章

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag

模式识别 - 有害视频检測程序的策略

有害视频检測程序的策略 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26346831 有害(色情\恐怖\暴力)视频, 严重危害网络的健康, 须要进行检測和过滤. 检測色情\恐怖视频, 通过检測程序, 检測出多个场景的概率, 然后进行排序, 当场景多余6个时, 仅仅取最大的6个场景; 返回的概率值是前3个最大检測值场景的概率的均值; 色情\恐怖汇总时, 首先检測色情, 假设为色情视频, 则不进行恐怖的检測, 否则继续检測恐怖,

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); for y=

模式识别 - 有害视频检测程序的策略

有害视频检测程序的策略 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26346831 有害(色情\恐怖\暴力)视频, 严重危害网络的健康, 需要进行检测和过滤. 检测色情\恐怖视频, 通过检测程序, 检测出多个场景的概率, 然后进行排序, 当场景多余6个时, 只取最大的6个场景; 返回的概率值是前3个最大检测值场景的概率的均值; 色情\恐怖汇总时, 首先检测色情, 如果为色情视频, 则不进行恐怖的检测, 否则继续检测恐怖,

matlab练习程序(弧形投影)

这个其实也算是圆柱体投影了,不过上一篇文章是从正面看,得到的是凸形的结果,而这个是从反面看,得到的是凹形的结果. 计算公式就不写了,大致介绍一下,计算公式中关于x坐标求法和上篇一样,y坐标则正好是上篇公式的反变换,结合上篇公式代码和本篇的代码,应该都不是很难理解的. 下面是hfOV为pi/2时得到的变换结果: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); hfOV

(转)matlab练习程序(HOG方向梯度直方图)

matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram of Oriented Gradient)方向梯度直方图,主要用来提取图像特征,最常用的是结合svm进行行人检测. 算法流程图如下(这篇论文上的): 下面我再结合自己的程序,表述一遍吧: 1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率. 3.

【转载】matlab练习程序(图像Haar小波变换)

matlab练习程序(图像Haar小波变换) 关于小波变换我只是有一个很朴素了理解.不过小波变换可以和傅里叶变换结合起来理解. 傅里叶变换是用一系列不同频率的正余弦函数去分解原函数,变换后得到是原函数在正余弦不同频率下的系数. 小波变换使用一系列的不同尺度的小波去分解原函数,变换后得到的是原函数在不同尺度小波下的系数. 不同的小波通过平移与尺度变换分解,平移是为了得到原函数的时间特性,尺度变换是为了得到原函数的频率特性. 小波变换步骤: 1.把小波w(t)和原函数f(t)的开始部分进行比较,计算

matlab练习程序(波纹扭曲)

其实就是用sin或cos对x,y坐标进行变换,处理的时候依然是反向变换. 类似的,用不同的函数能得到不同的扭曲效果,比如log,1/x,exp等等. 效果如下: 代码如下(还给出了如何生成gif图片的代码): clear all;close all;clc; img=imread('lena.jpg'); [h w]=size(img); wave=[10,100]; %[幅度,周期] newh=h+2*wave(1); neww=w+2*wave(1); rot=0; for i=1:10 i

matlab练习程序(圆柱投影)

圆柱投影就是将一张二维的图像投影到三维的圆柱体上,不过在显示图像的时候依然是以二维的形式给出. 投影最重要的步骤就是计算投影变换公式,和图像旋转类似,只要得到变换公式,再依照公式进行代码编写就很容易了. 这里就不写投影变换公式的推导过程了,直接给出变换公式.公式分为正变换和反变换,编程时,反变换公式通常更有用. 正变换公式如下: x'=f\cdot\arctan\left({\frac{x-\frac{W}{2}}{f}}\right)+f\cdot\arctan\left({\frac{W}{