新闻动态

Python演化计算基准函数详解

发布日期:2021-12-20 10:08 | 文章来源:站长之家

基准函数是测试演化计算算法性能的函数集,由于大部分基准函数集都是C/C++编写,Python编写的基准函数比较少,因此本文实现了13个常用基准函数的Python版。

基准函数定义

代码实现

benchmark.py

import numpy as np
import copy
"""
Author : Robin_Hua
update time : 2021.10.14
version : 1.0
"""
class Sphere:
 def __init__(self, x):
  self.x = x
 def getvalue(self):
  res = np.sum(self.x**2)
  return res
class Schwefel2_22:
 def __init__(self, x):
  self.x = x
 def getvalue(self):
  res = np.sum(np.abs(self.x)) + np.prod(np.abs(self.x))
  return res
class Noise:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  d = self.x.shape[0]
  res = np.sum(np.arange(1, d + 1) * self.x ** 4) + np.random.random()
  return res
class Schwefel2_21:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  res = np.max(np.abs(self.x))
  return res
class Step:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  res = np.sum(int(self.x + 0.5) ** 2)
  return res
class Rosenbrock:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  d = self.x.shape[0]
  res = np.sum(np.abs(100*(self.x[1:] - self.x[:-1]**2)**2 + (1 - self.x[:-1])**2))
  return res
class Schwefel:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  d = self.x.shape[0]
  res = 418.9829*d - np.sum(self.x * np.sin(np.sqrt(np.abs(self.x))))
  return res
class Rastrigin:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  d = self.x.shape[0]
  res = 10 * d + np.sum(self.x ** 2 - 10 * np.cos(2 * np.pi * self.x))
  return res
class Ackley:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  d = self.x.shape[0]
  res = - 20 * np.exp(-0.2 * np.sqrt(np.mean(self.x ** 2)))
  res = res - np.exp(np.mean(np.cos(2 * np.pi * self.x))) + 20 + np.exp(1)
  return res
class Griewank:
 def __init__(self,x):
  self.x = x
 def getvalue(self):
  d = self.x.shape[0]
  i = np.arange(1, d + 1)
  res = 1 + np.sum(self.x ** 2) / 4000 - np.prod(np.cos(self.x / np.sqrt(i)))
  return res
class Generalized_Penalized:
 def __init__(self,x):
  self.x = x
 def u(self,a,k,m):
  temp = copy.deepcopy(self.x)
  temp[-a <= temp.any() <= a] = 0
  temp[temp > a] = k*(temp[temp > a]-a)**m
  temp[temp < -a] = k * (-temp[temp < -a] - a) ** m
  """
  temp = np.zeros_like(self.x)
  d = self.x.shape[0]
  for i in range(d):
if self.x[i]>a:
 temp[i] = k*(self.x[i]-a)**m
elif self.x[i]<-a:
 temp[i] = k * (-self.x[i] - a) ** m
else:
 pass
  """
  return temp
 def getvalue(self):
  d = self.x.shape[0]
  y = 1+1/4*(self.x+1)
  res = np.pi/d*(10*np.sin(np.pi*y[0])**2+np.sum((y[:-1]-1)**2*(1+10*np.sin(np.pi*y[1:])**2))+(y[-1]-1)**2)+np.sum(self.u(10,100,4))
  return res
def benchmark_func(x,func_num):
 func = func_list[func_num]
 res = func(x)
 return res
func_list = [Sphere,Schwefel2_22,Noise,Schwefel2_21,Step,Rosenbrock,Schwefel,Rastrigin,Ackley,Griewank,Generalized_Penalized]

调用方法

输入为向量x和函数编号func_num

import benchmark
import numpy as np
vector = np.random.random(30)
value = benchmark.benchmark_func(x=vector,func_num=0).getvalue()

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部