鲸鱼优化算法寻找函数最优解问题的python示例实现

发布时间:2024年01月23日

鲸鱼优化算法(Whale Optimization Algorithm,WOA)是一种基于仿生学的优化算法,灵感来源于鲸鱼的群体行为。该算法最初由Seyedali Mirjalili等人于2016年提出。

鲸鱼优化算法的基本思想是通过模拟鲸鱼的行为,来寻找最优解。在算法中,每条鲸鱼代表一个解,整个鲸群代表解空间。算法通过模拟鲸鱼的迁徙、呼吸和歌唱等行为,来更新每条鲸鱼的位置和速度,从而逐步逼近最优解。

具体来说,鲸鱼优化算法包括以下几个步骤:

  1. 初始化种群:随机生成一定数量的鲸鱼,每个鲸鱼代表一个解。

  2. 计算适应度:根据目标函数,计算每个鲸鱼的适应度。

  3. 更新最优解:记录当前最优解。

  4. 迁徙行为:通过模拟鲸鱼的迁徙行为,更新每条鲸鱼的位置和速度。

  5. 呼吸行为:通过模拟鲸鱼的呼吸行为,更新每条鲸鱼的位置和速度。

  6. 歌唱行为:通过模拟鲸鱼的歌唱行为,更新每条鲸鱼的位置和速度。

  7. 更新最优解:记录当前最优解。

  8. 终止条件:当满足一定的终止条件时,算法停止,并返回最优解。

鲸鱼优化算法具有收敛速度快、全局搜索能力强等优点,在许多优化问题中都有良好的表现。

以一个经典的优化问题——函数最小化为例。假设我们要找到函数 f(x) = x^2 的最小值。鲸鱼优化算法的Python示例代码:

import random
import math

# 定义目标函数
def objective_function(x):
    return x**2

# 定义鲸鱼优化算法
def whale_optimization_algorithm():
    # 初始化参数
    population_size = 10
    search_space = [-10, 10]
    max_iterations = 100
    a = 2  # 收缩系数

    # 初始化种群
    population = []
    for _ in range(population_size):
        x = random.uniform(search_space[0], search_space[1])
        population.append(x)

    # 迭代优化
    for iteration in range(max_iterations):
        best_fitness = float('inf')
        best_solution = None
        for i in range(population_size):
            # 计算适应度
            fitness = objective_function(population[i])

            # 更新最优解
            if fitness < best_fitness:
                best_fitness = fitness
                best_solution = population[i]

            # 迁徙行为
            r1 = random.random()
            r2 = random.random()
            A = 2 * a * r1 - a
            C = 2 * r2
            l = (a - 1) * random.random() + 1
            p = random.random()

            if p < 0.5:
                if abs(A) < 1:
                    new_solution = best_solution - A * abs(C * best_solution - population[i])
                else:
                    random_whale = random.randint(0, population_size - 1)
                    new_solution = population[random_whale] - A * abs(C * population[random_whale] - population[i])
            else:
                distance = abs(best_solution - population[i])
                new_solution = distance * math.exp(a * l) * math.cos(2 * math.pi * l) + best_solution

            # 更新位置
            if new_solution < search_space[0]:
                new_solution = search_space[0]
            elif new_solution > search_space[1]:
                new_solution = search_space[1]

            population[i] = new_solution

    # 返回最优解
    return best_solution

# 运行鲸鱼优化算法并输出结果
best_solution = whale_optimization_algorithm()
print("最优解:", best_solution)
print("最小值:", objective_function(best_solution))

输出:

最优解: -1.0055716558485628
最小值: 1.0111743550460204

算法的基本思想是通过随机生成一群鲸鱼个体,并根据其适应度(即目标函数值)来评估每个个体的优劣。然后,通过模拟鲸鱼的迁徙行为,将优秀个体的位置进行更新,以期望找到更优的解。

在函数 f(x) = x^2 的最小值问题中,算法通过不断迭代优化个体的位置,使得个体逐渐靠近最小值点。最终,算法收敛到最优解 -1.0055716558485628,对应的最小值为 1.0111743550460204。

解决一个二元函数的优化问题示例

import numpy as np

# 定义目标函数
def objective_function(x):
    return x[0]**2 + x[1]**2

# 定义WOA算法
def woa(objective_function, lb, ub, dim, search_agents, max_iter):
    # 初始化搜索代理
    positions = np.zeros((search_agents, dim))
    for i in range(search_agents):
        positions[i, :] = np.random.uniform(lb, ub, dim)
    
    # 初始化最优解
    best_position = np.zeros(dim)
    best_fitness = float("inf")
    
    # 开始迭代搜索
    for t in range(max_iter):
        # 更新领导者位置
        a = 2 - 2 * t / max_iter
        a2 = -1 + t * (-1) / max_iter
        for i in range(search_agents):
            r1 = np.random.random(dim)
            r2 = np.random.random(dim)
            A = 2 * a * r1 - a
            C = 2 * r2
            b = 1
            l = (a2 - 1) * np.random.random() + 1
            p = np.random.random()
            if p < 0.5:
                if (np.abs(A)).any() < 1:
                    D = np.abs(C * best_position - positions[i, :])
                    new_position = best_position - A * D
                else:
                    rand_leader_index = np.random.randint(0, search_agents)
                    X_rand = positions[rand_leader_index, :]
                    D = np.abs(C * X_rand - positions[i, :])
                    new_position = X_rand - A * D
            else:
                distance_to_leader = np.abs(best_position - positions[i, :])
                new_position = distance_to_leader * np.exp(b * l) * np.cos(2 * np.pi * l) + best_position
            
            # 边界处理
            new_position = np.clip(new_position, lb, ub)
            
            # 更新最优解
            fitness = objective_function(new_position)
            if fitness < best_fitness:
                best_fitness = fitness
                best_position = new_position
        
        # 更新搜索参数
        a = 2 * (1 - t / max_iter)
        
    return best_position, best_fitness

# 定义搜索空间
lb = -10
ub = 10
dim = 2

# 运行WOA算法
best_position, best_fitness = woa(objective_function, lb, ub, dim, search_agents=30, max_iter=100)

# 输出结果
print("最优解:", best_position)
print("最优解的适应度值:", best_fitness)

输出如下:

最优解: [ 0.00888308 -0.00933826]
最优解的适应度值: 0.00016611220185363835

在这个示例中,我们定义了一个目标函数?objective_function,它是一个简单的二元函数。然后使用WOA算法来寻找这个函数的最优解。在WOA算法中使用一些随机参数来更新搜索代理的位置,并使用边界处理来确保搜索代理的位置在搜索空间内。最后输出找到的最优解和最优解的适应度值。

文章来源:https://blog.csdn.net/qq_38563206/article/details/135776402
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。