基于螳螂优化算法的多种优化问题解决方案
使用螳螂优化算法来寻找目标函数$f(x) = x^2$的最小值。代码如下:
import numpy as np
class Mantis:
def __init__(self, n, func):
self.n = n
self.func = func
self.pop_size = 10 * n
self.p = np.zeros((self.pop_size, n))
self.f = np.zeros(self.pop_size)
self.gbest = np.zeros(n)
self.gbest_f = np.inf
def init_pop(self):
self.p = np.random.uniform(-5, 5, (self.pop_size, self.n))
def update_f(self):
for i in range(self.pop_size):
self.f[i] = self.func(self.p[i])
def update_gbest(self):
idx = np.argmin(self.f)
if self.f[idx] < self.gbest_f:
self.gbest = self.p[idx]
self.gbest_f = self.f[idx]
def prey(self):
c = np.random.randint(self.pop_size, size=self.pop_size)
for i in range(self.pop_size):
if self.f[i] < self.f[c[i]]:
self.p[i] = self.p[i] + np.random.uniform(0, 1) * (self.p[i] - self.p[c[i]])
def evasion(self):
for i in range(self.pop_size):
if np.random.uniform(0, 1) < 0.1:
self.p[i] = self.gbest + np.random.uniform(-1, 1) * np.linalg.norm(self.p[i] - self.gbest)
def migration(self):
for i in range(self.pop_size):
if np.random.uniform(0, 1) < 0.1:
j = np.random.randint(self.pop_size)
self.p[i] = self.p[i] + np.random.uniform(0, 1) * (self.p[j] - self.p[i])
def optimize(self):
self.init_pop()
for _ in range(1000):
self.update_f()
self.update_gbest()
self.prey()
self.evasion()
self.migration()
def func(x):
return x[0]**2
m = Mantis(1, func)
m.optimize()
print(m.gbest)
下载地址
用户评论