智能优化算法23个标准测试函数(Python)
吾所求
编辑于 2023年04月10日 08:15
收录于文集
共3篇

原文:

Evolutionary programming made faster  IEEE Transactions on Evolutionary Computation ( IF 11.554 ) Pub Date : 1999-07-01 , DOI: 10.1109/4235.771163

单峰测试函数

多峰测试函数

固定维测试函数

单峰测试函数

F1:Sphere Function

%0A%5Cbegin%7Baligned%7D%0Af_%7B1%7D(x)%3D%20%26%5Csum_%7Bi%3D1%7D%5E%7B30%7D%5Cleft(x_i%5Cright)%5E2%20%2C-100%20%5Cleq%20x_i%20%5Cleq%20100%5C%5C%0A%26%5Cquad%20%5Cmin%20%5Cleft(f_%7B1%7D%5Cright)%3Df_%7B1%7D(0%2C%20%5Cldots%2C%200)%3D0%0A%5Cend%7Baligned%7D%0A

代码块
Python
自动换行
复制代码
def fun1(X):
        O=np.sum(X*X)
        return O
复制成功

F2:Schwefel's Problem 2.22

代码块
Python
自动换行
复制代码
def fun2(X):
    O=np.sum(np.abs(X))+np.prod(np.abs(X))
    return O
复制成功

F3:Schwefel's Problem 1.2

代码块
Python
自动换行
复制代码
def fun3(X):
    O=0
    for i in range(len(X)):
        O=O+np.square(np.sum(X[0:i+1]))   
    return O
复制成功

F4:Schwefel's Problem 2.21

代码块
Python
自动换行
复制代码
def fun4(X):
    O=np.max(np.abs(X))
    return O
复制成功

F5:Generalized Rosenbrock's Function

代码块
Python
自动换行
复制代码
def fun5(X):
    X_len = len(X)
    O = np.sum(100 * np.square(X[1:X_len] - np.square(X[0:X_len - 1]))) + np.sum(np.square(X[0:X_len - 1] - 1))
    return O
复制成功

F6:Step Function

代码块
Python
自动换行
复制代码
def fun6(X):
    O=np.sum(np.square(np.abs(X+0.5)))
    return O
复制成功

F7:Quartic Function i.e. Noise

代码块
Python
自动换行
复制代码
def fun7(X):
    i = np.arange(1,len(X)+1)
    O=np.sum(i*(X**4))+np.random.random()
    return O
复制成功

多峰测试函数

F8:Generalized Schwefel's Problem 2.26

代码块
Python
自动换行
复制代码
def fun8(X):
    O=np.sum(-X*np.sin(np.sqrt(np.abs(X))))
    return O
复制成功

F9:Generalized Rastrigin's Function

代码块
Python
自动换行
复制代码
def fun9(X):
    dim=len(X)
    O=np.sum(X**2-10*np.cos(2*np.pi*X))+10*dim
    return O
复制成功

F10:Ackley's Function

代码块
Python
自动换行
复制代码
def fun10(X):
    dim=len(X)
    a, b, c = 20, 0.2, 2 * np.pi
    sum_1 = -a * np.exp(-b * np.sqrt(np.sum(X ** 2) / dim))
    sum_2 = np.exp(np.sum(np.cos(c * X)) / dim)
    O= sum_1 - sum_2 + a + np.exp(1)
    return O
复制成功

F11:Generalized Griewank's Function

代码块
Python
自动换行
复制代码
def fun11(X):
    dim=len(X)
    i = np.arange(1,dim+1)
    O=np.sum(X**2)/4000-np.prod(np.cos(X/np.sqrt(i)))+1
    return O
复制成功

F12:Generalized Penalized Function 1

%0A%5Cbegin%7Baligned%7D%0A%26%20u%5Cleft(x_i%2C%20a%2C%20k%2C%20m%5Cright)%3D%20%5Cbegin%7Bcases%7Dk%5Cleft(x_i-a%5Cright)%5Em%2C%20%26%20x_i%3Ea%2C%20%5C%5C%0A0%2C%20%26%20-a%20%5Cleq%20x_i%20%5Cleq%20a%2C%20%5C%5C%0Ak%5Cleft(-x_i-a%5Cright)%5Em%2C%20%26%20x_i%3C-a%20.%5Cend%7Bcases%7D%20%5C%5C%0A%5Cend%7Baligned%7D

代码块
Python
自动换行
复制代码
def Ufun(X,a,k,m):
    dim =len(X)
    U = np.zeros(dim)
    for i in range(len(X)):
        if X[i]>a:
            U[i]=k*((X[i]-a)**m)
        elif X[i]<-a:
            U[i]=k*((-X[i]-a)**m)
        else:
            U[i]=0
    return U
           
复制成功

%5Cbegin%7Baligned%7D%0Af_%7B12%7D(x)%3D%20%26%20%5Cfrac%7B%5Cpi%7D%7B30%7D%20%5Cleft%5C%7B10%20%5Csin%20%5E2%5Cleft(%5Cpi%20y_1%5Cright)%2B%20%5Csum_%7Bi%3D1%7D%5E%7B29%7D%5Cleft(y_i-1%5Cright)%5E2%20%5Ccdot%5Cleft%5B1%2B10%20%5Csin%20%5E2%5Cleft(%5Cpi%20y_%7Bi%2B1%7D%5Cright)%5Cright%5D%2B%5Cleft(y_n-1%5Cright)%5E2%5Cright%5C%7D%2B%5Csum_%7Bi%3D1%7D%5E%7B30%7D%20u%5Cleft(x_i%2C%2010%2C100%2C4%5Cright)%20%5C%5C%0A%26-50%20%5Cleq%20x_i%20%5Cleq%2050%2C%20%5Cquad%20%5Cmin%20%5Cleft(f_%7B12%7D%5Cright)%3Df_%7B12%7D(1%2C%20%5Cldots%2C%201)%3D0%5C%5C%0A%20%5Ctext%20%7B%20where%20%7D%20%5C%5C%0A%26y_i%3D1%2B%5Cfrac%7B1%7D%7B4%7D%5Cleft(x_i%2B1%5Cright)%20%5Ctext%20%7B.%20%7D%20%5C%5C%0A%5Cend%7Baligned%7D

代码块
Python
自动换行
复制代码
def fun12(X):
    dim=len(X) 
    pi=np.pi
    sum_1 = (np.pi/dim)*(10*((np.sin(pi*(1+(X[0]+1)/4)))**2)
                         +np.sum((((X[:dim-2]+1)/4)**2)*
                                 (1+10*((np.sin(pi*(1+(X[1:dim-1]+1)/4))))**2))
                         +((X[dim-1])/4)**2)
    sum_2 = np.sum(Ufun(X,10,100,4))
    O=sum_1 + sum_2
    return O
复制成功

F13:Generalized Penalized Function 2

%5Cbegin%7Baligned%7D%0A%26%20f_%7B13%7D(x)%3D0.1%5Cleft%5C%7B%5Csin%20%5E2%5Cleft(%5Cpi%203%20x_1%5Cright)%2B%5Csum_%7Bi%3D1%7D%5E%7B29%7D%5Cleft(x_i-1%5Cright)%5E2%5Cleft%5B1%2B%5Csin%20%5E2%5Ccdot%5Cleft(3%20%5Cpi%20x_%7Bi%2B1%7D%5Cright)%5Cright%5D%2B%5Cleft(x_n-1%5Cright)%5E2%5Cleft%5B1%2B%5Csin%20%5E2%5Cleft(2%20%5Cpi%20x_%7B30%7D%5Cright)%5Cright%5D%5Cright%5C%7D%2B%5Csum_%7Bi%3D1%7D%5E%7B30%7D%20u%5Cleft(x_i%2C%205%2C100%2C4%5Cright)%20%5C%5C%0A%26%20-50%20%5Cleq%20x_i%20%5Cleq%2050%2C%20%5Cquad%20%5Cmin%20%5Cleft(f_%7B13%7D%5Cright)%3Df_%7B13%7D(1%2C%20%5Cldots%2C%201)%3D0%20%5C%5C%0A%5Cend%7Baligned%7D

代码块
Python
自动换行
复制代码
def fun13(X):
    dim=len(X) 
    pi=np.pi
    O=0.1*((np.sin(3*pi*X[0]))**2+np.sum(((X[0:dim-2])-1)**2*(1+(np.sin(3*pi*X[1:dim-1]))**2)))
    +((X[dim-1]-1)**2)*(1+(np.sin(2*pi*X[dim-1]))**2)+np.sum(Ufun(X,5,100,4))
    return O
复制成功

固定维多峰测试函数

F14:Shekel's Foxholes Function

固定2维

代码块
Python
自动换行
复制代码
def fun14(X):
    aS=np.array([[-32,-16,0,16,32,-32,-16,0,16,32,-32,-16,0,16,32,-32,-16,0,16,32,-32,-16,0,16,32],
                [-32,-32,-32,-32,-32,-16,-16,-16,-16,-16,0,0,0,0,0,16,16,16,16,16,32,32,32,32,32]])
    bS=np.zeros(25)
    for j in range(0,25):
        bS[j]=np.sum((X.T-aS[:,j])**6)

    O=(1/500+np.sum(1/(np.arange(1,25+1)+bS)))**(-1)
    return O
复制成功

F15:Kowalik's Function

固定4维

代码块
Python
自动换行
复制代码
def fun15(X):
    aK=np.array([0.1957,0.1947,0.1735,0.16,0.0844,0.0627,0.0456,0.0342,0.0323,0.0235,0.0246])
    bK=np.array([0.25,0.5,1,2,4,6,8,10,12,14,16])
    bK=1/bK
    O=np.sum((aK-((X[0]*(bK**2+X[1]*bK))/(bK**2+X[2]*bK+X[3])))**2)
    return O
复制成功

F16:Six-Hump Camel-Back Function

固定2维

代码块
Python
自动换行
复制代码
def fun16(X):
    O=4*(X[0]**2)-2.1*(X[0]**4)+(X[0]**6)/3+X[0]*X[1]-4*(X[1]**2)+4*(X[1]**4)
    return O
复制成功

F17:Branin Function

固定2维

代码块
Python
自动换行
复制代码
def fun17(X):
    pi=np.pi
    O=((X[1])-(X[0]**2)*5.1/(4*(pi**2))+5/pi*X[0]-6)**2+10*(1-1/(8*pi))*np.cos(X[0])+10
    return O
复制成功

F18:Goldstein-Price Function

固定2维

代码块
Python
自动换行
复制代码
def fun18(X):
    O=(1+((X[0]+X[1]+1)**2)*(19-14*X[0]+3*(X[0]**2)-14*X[1]+6*X[0]*X[1]+3*(X[1]**2)))*(30+(2*X[0]-3*X[1])**2*(18-32*X[0]+12*(X[0]**2)+48*X[1]-36*X[0]*X[1]+27*(X[1]**2))) 
    return O
复制成功

F19&F20:Hartman's Family

固定3维及6维

代码块
Python
自动换行
复制代码
def fun19(X):
    aH=np.array([[3,10,30],[0.1,10,35],[3,10,30],[0.1,10,35]])
    cH=np.array([1,1.2,3,3.2])
    pH=np.array([[0.3689,0.117,0.2673],[0.4699,0.4387,0.747],
                [0.1091,0.8732,0.5547],[0.03815,0.5743,0.8828]])
    O=0
    for i in range(0,4):
        O=O-cH[i]*np.exp(-(np.sum(aH[i]*((X-pH[i])**2))))
    return O 

def fun20(X):
    aH=np.array([[10,3,17,3.5,1.7,8],[0.05,10,17,0.1,8,14],[3,3.5,1.7,10,17,8],[17,8,0.05,10,0.1,14]])
    cH=np.array([1,1.2,3,3.2])
    pH=np.array([[0.1312,0.1696,0.5569,0.0124,0.8283,0.5886],[0.2329,0.413,0.8307,0.3736,0.1004,0.9991],
    [0.2348,0.1415,0.3522,0.2883,0.3047,0.6650],[0.4047,0.8828,0.8732,0.5743,0.1091,0.0381]]) 
    O=0
    for i in range(0,4):
        O=O-cH[i]*np.exp(-(np.sum(aH[i]*((X-pH[i])**2))))    
    return O 
复制成功

F21&F22&F23:Shekel's Family

固定4维

代码块
Python
自动换行
复制代码
def fun21(X):
    aSH=np.array([[4,4,4,4],[1,1,1,1],[8,8,8,8],[6,6,6,6],[3,7,3,7],
                  [2,9,2,9],[5,5,3,3],[8,1,8,1],[6,2,6,2],[7,3.6,7,3.6]])
    cSH=np.array([[0.1],[0.2],[0.2],[0.4],[0.4],
                  [0.6],[0.3],[0.7],[0.5],[0.5]])
    O=0
    for i in range(0,5):
        O=O-(np.sum((X-aSH[i])**2)+cSH[i])**(-1)
    return O 

X=np.arange(4)
fun21(X)


def fun22(X):
    aSH=np.array([[4,4,4,4],[1,1,1,1],[8,8,8,8],[6,6,6,6],[3,7,3,7],
                  [2,9,2,9],[5,5,3,3],[8,1,8,1],[6,2,6,2],[7,3.6,7,3.6]])
    cSH=np.array([[0.1],[0.2],[0.2],[0.4],[0.4],
                  [0.6],[0.3],[0.7],[0.5],[0.5]])
    O=0
    for i in range(0,7):
        O=O-(np.sum((X-aSH[i])**2)+cSH[i])**(-1)        
    return O 


def fun23(X):
    aSH=np.array([[4,4,4,4],[1,1,1,1],[8,8,8,8],[6,6,6,6],[3,7,3,7],
                  [2,9,2,9],[5,5,3,3],[8,1,8,1],[6,2,6,2],[7,3.6,7,3.6]])
    cSH=np.array([[0.1],[0.2],[0.2],[0.4],[0.4],
                  [0.6],[0.3],[0.7],[0.5],[0.5]])
    O=0
    for i in range(0,10):  
        O=O-(np.sum((X-aSH[i])**2)+cSH[i])**(-1)        
    return O 
复制成功

该代码主要用于自用记录,若有纰漏错误,是本人能力有限或是疏忽在此提前表达歉意,感谢批评指正。

参考来自知乎用户valley的matlab程序(地址如下)

https://zhuanlan.zhihu.com/p/397505364