📜  鲸鱼优化算法的实现(1)

📅  最后修改于: 2023-12-03 14:58:52.595000             🧑  作者: Mango

鲸鱼优化算法的实现

简介

鲸鱼优化算法(Whale Optimization Algorithm,WOA)是一种仿生优化算法,模拟了鲸鱼群体寻找食物的行为。它可以用于解决各种优化问题,如函数优化、神经网络训练等。

算法原理

鲸鱼优化算法模拟了鲸鱼找食物的过程。它将优化问题看作是寻找食物的过程,优化变量则对应着寻找食物的位置。算法主要通过以下三种运动模式来实现寻优:

  1. 搜索模式:在搜索模式下,鲸鱼个体会随机地浮游一段距离,以期找到更好的食物。

  2. 包容性学习模式:当某个鲸鱼个体的适应度较优时,它将引领其他鲸鱼向它的位置靠近。

  3. 攻击模式:攻击模式表示某个鲸鱼此时已经找到了一个食物源,同时它又发现了一个更优的食物源,在攻击模式下,它会向更优的食物源移动。

算法实现

鲸鱼优化算法的实现主要包含以下几个步骤:

  1. 初始化种群:随机生成一组初始解,作为鲸鱼群体的初始位置。

  2. 计算各个个体的适应度。

  3. 根据当前适应度最好的个体,更新其他个体的位置。

  4. 根据一定的概率,进行搜索或攻击操作。

  5. 迭代以上步骤,直到满足停止条件。

下面是一个python实现的例子:

import random
import math

class WOA:
    def __init__(self, objective_func, lb, ub, dim, search_agent_num=30, max_iter=100):
        self.objective_func = objective_func  # 目标函数
        self.lb = lb  # 问题下界
        self.ub = ub  # 问题上界
        self.dim = dim  # 问题维度
        self.search_agent_num = search_agent_num  # 搜索代理数量
        self.max_iter = max_iter  # 最大迭代次数
        self.best_fitness = float('inf')  # 全局最优解适应度
        self.best_position = [0.0] * self.dim  # 全局最优解

    def _init_population(self):
        population = []
        for i in range(self.search_agent_num):
            agent = [random.uniform(self.lb, self.ub) for _ in range(self.dim)]  # 随机初始化位置
            population.append(agent)
        return population

    # 更新位置
    def _update_position(self, population, a, c, l, best_position):
        for i in range(self.search_agent_num):
            r1 = random.random()
            r2 = random.random()
            A = 2 * a * r1 - a  # a=2-r*|r| , r in [-1,1]
            C = 2 * r2  # c in [0,1]
            p = random.random()  # p in [0,1]
            distance_to_leader = [abs(p * x - x_leader) for x, x_leader in zip(population[i], best_position)]
            X_rand = [x_rand - C * dist * (1 - 2 * random.random()) for x_rand, dist in zip(population[i], distance_to_leader)]
            if random.random() < (1 / (1 + math.exp(-10 * (l - 0.5 * self.max_iter) / self.max_iter))):
                D = [abs(c * x_rand - x_leader) for x_rand, x_leader in zip(population[i], best_position)]
                X_new = [x_rand - A * d * (1 - 2 * random.random()) for x_rand, d in zip(population[i], D)]
                if self.objective_func(X_new) < self.objective_func(X_rand):
                    population[i] = X_new
                else:
                    population[i] = X_rand
            else:
                population[i] = X_rand
        return population

    # 获取最好的个体
    def _get_best_agent(self, population):
        best_fitness = float('inf')
        best_agent = None
        for agent in population:
            fitness = self.objective_func(agent)
            if fitness < best_fitness:
                best_fitness = fitness
                best_agent = agent
        return best_agent, best_fitness

    def optimize(self):
        population = self._init_population()

        for l in range(self.max_iter):
            a = 2 - 2 * l / self.max_iter  # Eq. (2.3) in the paper
            c = 2 * l / self.max_iter  # Eq. (2.4) in the paper

            # 更新位置
            population = self._update_position(population, a, c, l, self.best_position)

            # 获取最好的个体 && 更新全局最优解
            best_agent, best_fitness = self._get_best_agent(population)
            if best_fitness < self.best_fitness:
                self.best_fitness = best_fitness
                self.best_position = best_agent

        return self.best_position, self.best_fitness
使用示例

这里提供一个使用示例,假设我们要优化的目标函数为Rastrigin函数:

def rastrigin(x):
    A = 10
    n = len(x)
    return A * n + sum([xi ** 2 - A * math.cos(2 * math.pi * xi) for xi in x])

woa = WOA(rastrigin, -5.12, 5.12, 2, search_agent_num=30, max_iter=100)
best_position, best_fitness = woa.optimize()
print('best_position:', best_position)
print('best_fitness:', best_fitness)

以上代码将输出优化得到的最优解。