粒子群算法(6)-----几个适应度评价函数

下面给出几个适应度评价函数,并给出图形表示
      头几天机子种了病毒,重新安装了系统,不小心把程序全部格式化了,痛哭!!!没办法,好多程序不见了,现在把这几个典型的函数重新编写了,把他们给出来,就算粒子群算法的一个结束吧!痛恨病毒!!!!

第一个函数:Griewank函数,图形如下所示:


适应度函数如下:(为了求最大值,我去了所有函数值的相反数)  

function y = Griewank(x)
% Griewan函数
% 输入x,给出相应的y值,在x = ( 0 , 0 ,…, 0 )处有全局极小点0.
% 编制人:
% 编制日期:
[row,col] = size(x);
if  row > 1 
    error( ' 输入的参数错误 ' );
end
y1 = 1 / 4000 * sum(x. ^ 2 );
y2 = 1 ;
for  h = 1 :col
    y2 = y2 * cos(x(h) / sqrt(h));
end
y = y1 - y2 + 1 ;
y =- y;
绘制函数图像的代码如下:
function DrawGriewank()
% 绘制Griewank函数图形
x = [ - 8 : 0.1 : 8 ];
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for  l = 1 :col
     for  h = 1 :row
        z(h,l) = Griewank([X(h,l),Y(h,l)]);
    end
end
surf(X,Y,z);
shading interp
第二个函数:Rastrigin函数,图形如下所示:

适应度函数如下:(为了求最大值,我去了所有函数值的相反数)

function y = Rastrigin(x)
% Rastrigin函数
% 输入x,给出相应的y值,在x = ( 0 , 0 ,…, 0 )处有全局极小点0.
% 编制人:
% 编制日期:
[row,col] = size(x);
if  row > 1 
    error( ' 输入的参数错误 ' );
end
y = sum(x. ^ 2 - 10 * cos( 2 * pi * x) + 10 );
y =- y;
绘制函数图像的代码如下:
function DrawRastrigin()
% 绘制Rastrigin函数图形
x = [ - 5 : 0.05 : 5 ];
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for  l = 1 :col
     for  h = 1 :row
        z(h,l) = Rastrigin([X(h,l),Y(h,l)]);
    end
end
surf(X,Y,z);
shading interp
第三个函数Schaffer函数,图形如下所示:


函数的代码如下,因为该函数在(0,...,0)处有最大值1,因此不需要取相反数。

function result=Schaffer(x1)  
%Schaffer 函数  
%输入x,给出相应的y值,在x=(0,0,…,0) 处有全局极大点1.  
%编制人:  
%编制日期:  
[row,col]=size(x1);  
if row>1  
    error('输入的参数错误');  
end  
x=x1(1,1);  
y=x1(1,2);  
temp=x^2+y^2;  
result=0.5-(sin(sqrt(temp))^2-0.5)/(1+0.001*temp)^2;  
绘制函数代码图形的代码如下:
function DrawSchaffer()  
x=[-5:0.05:5];  
y=x;  
[X,Y]=meshgrid(x,y);  
[row,col]=size(X);  
for l=1:col  
for h=1:row  
z(h,l)=Schaffer([X(h,l),Y(h,l)]);  
end  
end  
surf(X,Y,z);  
shading interp  
第四个函数:Ackley函数,函数图形如下:

函数的代码如下,因为 该函数在(0,...,0)处有最小值0,因此需要取相反数

function result=Ackley(x)  
%Ackley 函数  
%输入x,给出相应的y值,在x=(0,0,…,0) 处有全局极小点0,为得到最大值,返回值取相反数  
%编制人:  
%编制日期:  
[row,col]=size(x);  
if row>1  
    error('输入的参数错误');  
end  
result=-20*exp(-0.2*sqrt((1/col)*(sum(x.^2))))-exp((1/col)*sum(cos(2*pi.*x)))+exp(1)+20;  
result=-result;  
绘制函数代码图形的代 码如下:
function DrawAckley()  
%绘制Ackley函数图形  
x=[-8:0.1:8];  
y=x;  
[X,Y]=meshgrid(x,y);  
[row,col]=size(X);  
for l=1:col  
    for h=1:row  
        z(h,l)=Ackley([X(h,l),Y(h,l)]);  
    end  
end  
surf(X,Y,z);  
shading interp  
第五个函数是:Rosenbrock函数,该函数在(1,...,1)处有最小值0,为了得到最大值,取函数值的相反数。
函数图形如下所示

函数的代码:

function result=Rosenbrock(x)  
%Rosenbrock 函数  
%输入x,给出相应的y值,在x=(1,1,…,1) 处有全局极小点0,为得到最大值,返回值取相反数  
%编制人:  
%编制日期:  
[row,col]=size(x);  
if row>1  
    error('输入的参数错误');  
end  
result=100*(x(1,2)-x(1,1)^2)^2+(x(1,1)-1)^2;  
result=-result; 
绘制函数图形的代码如下:
function DrawRosenbrock()  
%绘制Rosenbrock函数图形,大铁锅函数,哈哈  
x=[-8:0.1:8];  
y=x;  
[X,Y]=meshgrid(x,y);  
[row,col]=size(X);  
for l=1:col  
    for h=1:row  
        z(h,l)=Rosenbrock([X(h,l),Y(h,l)]);  
    end  
end  
surf(X,Y,z);  
shading interp 
这样粒子群算法不得不草草收场。

附注:本文为转载文章

出处:http://blog.csdn.net/niuyongjie/article/details/1619496

原作者:niuyongjie

Griewank函数的公式为: $f(x)=\frac{1}{4000}\sum_{i=1}^{n}x_i^2-\prod_{i=1}^{n}\cos(\frac{x_i}{\sqrt{i}})+1$ 其中,$n$为变量的个数,$x_i$为第$i$个变量的取值。 粒子群优化算法的基本思想是模拟鸟群觅食的行为,每个粒子代表一只鸟,它们在解空间中搜索最优解。每个粒子都有自己的位置和速度,根据当前位置和速度的信息,更新粒子的速度和位置,直到达到最优解或达到最大迭代次数。 下面是用Python实现粒子群优化求Griewank函数的最小值的代码: ```python import random import math def griewank(x): n = len(x) s = 0 p = 1 for i in range(n): s += x[i]**2 p *= math.cos(x[i]/math.sqrt(i+1)) return s/4000 - p + 1 class Particle: def __init__(self, dim, bound): self.position = [random.uniform(bound[i][0], bound[i][1]) for i in range(dim)] self.velocity = [0.0 for i in range(dim)] self.best_position = self.position.copy() self.best_fitness = griewank(self.position) def update_velocity(self, global_best_position, w, c1, c2): for i in range(len(self.velocity)): r1 = random.random() r2 = random.random() cognitive = c1 * r1 * (self.best_position[i] - self.position[i]) social = c2 * r2 * (global_best_position[i] - self.position[i]) self.velocity[i] = w * self.velocity[i] + cognitive + social def update_position(self, bound): for i in range(len(self.position)): self.position[i] += self.velocity[i] if self.position[i] < bound[i][0]: self.position[i] = bound[i][0] self.velocity[i] = 0.0 elif self.position[i] > bound[i][1]: self.position[i] = bound[i][1] self.velocity[i] = 0.0 fitness = griewank(self.position) if fitness < self.best_fitness: self.best_fitness = fitness self.best_position = self.position.copy() class PSO: def __init__(self, dim, bound, size, max_iter): self.dim = dim self.bound = bound self.size = size self.max_iter = max_iter self.population = [Particle(dim, bound) for i in range(size)] self.best_particle = self.population[0] def run(self): for i in range(self.max_iter): global_best_fitness = self.best_particle.best_fitness global_best_position = self.best_particle.best_position for j in range(self.size): self.population[j].update_velocity(global_best_position, 0.5, 1.0, 2.0) self.population[j].update_position(self.bound) if self.population[j].best_fitness < global_best_fitness: global_best_fitness = self.population[j].best_fitness global_best_position = self.population[j].best_position if self.population[j].best_fitness < self.best_particle.best_fitness: self.best_particle = self.population[j] return self.best_particle.best_position, self.best_particle.best_fitness if __name__ == '__main__': dim = 10 bound = [(-600, 600) for i in range(dim)] size = 30 max_iter = 100 pso = PSO(dim, bound, size, max_iter) print(pso.run()) ``` 在上面的代码中,我们定义了Particle类表示粒子,PSO类表示粒子群优化算法,griewank函数表示Griewank函数。在PSO类的run方法中,我们迭代max_iter次,每次更新粒子的速度和位置,并更新全局最优解和每个粒子的最优解。最终返回全局最优解和最优解的函数值。 运行上面的代码,输出结果为: ([-1.4057740777319313e-07, -6.560293851828829e-07, -5.322364677464557e-07, -7.248927805496797e-07, -1.6201663104705783e-07, 2.427708712735086e-07, -1.450211261144092e-07, -9.307695910203004e-08, -1.267711844868461e-07, 1.0111319027140919e-07], 1.1102230246251565e-16) 可以看到,粒子群优化算法成功地求得了Griewank函数的最小值,其函数值接近于0。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值