智能算法系列之蚁群算法

这篇具有很好参考价值的文章主要介绍了智能算法系列之蚁群算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

智能算法系列之蚁群算法

  本博客封面由ChatGPT + DALL·E 2共同创作而成。

前言

  本篇是智能算法(Python复现)专栏的第五篇文章,主要介绍蚁群算法(Ant Colony Optimization, ACO)的思想,python实现及相关应用场景模拟。

  蚁群优化算法,简称蚁群算法,是一种模拟蚂蚁群体智能行为的随机优化算法,它试图模仿蚂蚁在觅食活动中找到最短路径的过程。

1. 算法思想

  众所周知,蚂蚁是一种群居动物,设想一个蚂蚁觅食的情景,假设蚁巢到食物是一条直线,那么蚂蚁将在这条直线上来回移动搬运食物,如下图所示:

智能算法系列之蚁群算法

  如果在蚂蚁的觅食路径上放置一个障碍物,蚂蚁的觅食大队就会一分为二,如下图所示:

智能算法系列之蚁群算法
  随着时间的推移,蚁群会在最短的路径上持续进行食物的搬运,而较长的路径将不会有蚂蚁移动,示意图如下:

智能算法系列之蚁群算法
  虽然蚂蚁们不具备像人类的视力和智慧,它们无法从远处看到食物源,也无法计划一个合适的路径来搬运食物,但是他们却能够寻找到一条最佳的路线。蚂蚁们采用的方法是全体在周围区域进行地毯式搜索,而它们之间的联系方式是在爬过的路径上分泌化学物质,这种化学物质叫信息素
  大量研究表明,蚂蚁在寻找食物的过程中,会在所经过的路径上释放信息素,当它们碰到一个还没有走过的路口时,会随机地挑选一条路径前行,与此同时释放出与路径长度有关的信息素。路径越长,释放的激素浓度越低。后来的蚂蚁通过感知这种物质以及强度,会倾向于朝信息素浓度高的方向移动,同时移动留下的信息素会对原有的信息素进行加强。
  由于较短路径积累的信息素快、浓度值高,这样经过一段时间后,利用整个群体的自组织就能够发现最短的路径。蚂蚁个体之间就是通过这种间接的通信机制达到协同搜索食物最短路径的目的。

2. 算法流程

  蚁群算法开始随机地选择搜索路径,在寻优过程中通过增强较好解,使搜索过程逐渐变得规律,从而逐渐逼近直至最终达到全局最优解。蚁群算法通过适应阶段和协作阶段这两个阶段进行寻优:
  (1) 在初步的适应阶段,一群人工蚁按照虚拟信息素和启发式信息的指引,在解空间不断地寻求外界信息来构造问题的解,同时它们根据解的质量在其路径上留下相应浓度的信息素;
  (2) 在后期的协作阶段,其他人工蚁选择信息素浓度高的路径前进,同时在这段路径上留下自己的信息素,通过这种正反馈的信息交流机制找到解决问题的高质量的解。
  算法流程图如下:

智能算法系列之蚁群算法

3. 细节梳理

  为了避免蚁群算法出现早熟现象,算法利用信息素的挥发实现负反馈机制。但是挥发的强度不能太弱,否则无法防止早熟现象的产生;挥发强度也不能太强,否则将抑制个体间的协作过程。
  信息素的更新公式如下: τ ( t + 1 ) = ( 1 − ρ ) × τ ( t ) + Δ τ ( t ) \tau (t+1) = (1 - \rho) \times \tau (t) + \Delta \tau (t) τ(t+1)=(1ρ)×τ(t)+Δτ(t)  其中, τ \tau τ为信息素, ρ \rho ρ为信息素蒸发系数。

4. 算法实现

4.1 问题场景

  最值问题,求解 f ( x ) = x s i n ( 5 x ) − x c o s ( 2 x ) f(x) = xsin(5x) - xcos(2x) f(x)=xsin(5x)xcos(2x)在定义域[0, 5]上的最小值。我们先手动计算一下:

f ′ ( x ) = 2 x s i n ( 2 x ) + s i n ( 5 x ) − c o s ( 2 x ) + 5 x c o s ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2 x) + 5 x cos(5 x) f(x)=2xsin(2x)+sin(5x)cos(2x)+5xcos(5x)  令 f ′ ( x ) = 0 f^\prime (x) = 0 f(x)=0之后,理论上可以求得驻点,但又不太好计算。。。

4.2 代码实现

# -*- coding:utf-8 -*-
# Author:   liyanpeng
# Email:    liyanpeng@tsingmicro.com
# Datetime: 2023/5/6 14:59
# Filename: ant_colony_optimization.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from base_algorithm import BaseAlgorithm


__all__ = ['AntColonyOptimization']


class Ant:
    def __init__(self):
        self.position = None    # 蚂蚁的位置
        self.tau = None         # 蚂蚁的信息素
        self.tran_prob = None   # 状态转移概率


class AntColonyOptimization(BaseAlgorithm):
    def __init__(self, population_size=20, max_iter=200, alpha=1.5, beta=0.8, rho=0.9, q=1.0, p0=0.2, step=0.1, x_range=(0, 5), seed=10086):
        super(AntColonyOptimization, self).__init__()
        self.__population_size = population_size  # 蚂蚁种群大小
        self.__max_iter = max_iter  # 最大迭代次数
        self.__alpha = alpha        # 信息素重要程度因子
        self.__beta = beta          # 启发函数重要程度因子
        self.__rho = rho            # 信息素蒸发系数
        self.__q = q                # 信息素释放增量系数
        self.__p0 = p0              # 转移概率常数
        self.__step = step          # 局部搜索步长
        self.__x_range = x_range    # 变量x的定义域
        self.__population = []      # 蚁群
        self.__best_tau = np.inf
        self.__seed = seed
        self.optimal_solution = None

        np.random.seed(seed)

    def init_population(self):
        for i in range(self.__population_size):
            ant = Ant()
            ant.position = np.random.uniform(*self.__x_range)   # 随机初始化位置
            ant.tau = self.problem_function(ant.position)       # 初始信息素值
            if ant.tau < self.__best_tau:
                self.__best_tau = ant.tau
            self.__population.append(ant)

        for ant in self.__population:
            # 初始蚂蚁的状态转移概率
            ant.tran_prob = (self.__best_tau - ant.tau) / self.__best_tau

    def update_population(self, coef):
        for ant in self.__population:
            if ant.tran_prob < self.__p0:   # 局部搜索
                new_pos = ant.position + (2 * np.random.randn() - 1) * self.__step * coef
            else:                           # 全局搜索
                new_pos = ant.position + (self.__x_range[1] - self.__x_range[0]) * (np.random.randn() - 0.5)
            new_pos = np.clip(new_pos, *self.__x_range)

            if self.problem_function(new_pos) < self.problem_function(ant.position):
                # 更新蚂蚁的位置
                ant.position = new_pos

        for ant in self.__population:
            # 更新蚂蚁的信息素
            ant.tau = (1 - self.__rho) * ant.tau + self.problem_function(ant.position)
            if ant.tau < self.__best_tau:
                self.__best_tau = ant.tau
                self.optimal_solution = (ant.position, self.problem_function(ant.position))

    def solution(self):
        self.init_population()
        for i in range(self.__max_iter):
            coef = 1 / (i+1)
            self.update_population(coef)

        print('the optimal solution is', self.optimal_solution)


if __name__ == '__main__':
    algo = AntColonyOptimization()
    algo.solution()

  得到的最优解如下:

the optimal solution is (3.432996771226036, -6.277079745038137)

代码仓库:IALib[GitHub]

  本篇代码已同步至【智能算法(Python复现)】专栏专属仓库:IALib
  运行IALib库中的ACO算法:文章来源地址https://www.toymoban.com/news/detail-436243.html

git clone git@github.com:xiayouran/IALib.git
cd examples
python main.py -algo aco

到了这里,关于智能算法系列之蚁群算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 常见算法思想——蚁群算法

    蚁群算法(Ant Colony Optimization,ACO)是一种模拟蚂蚁觅食行为的优化算法,用于解决组合优化问题。它通过模拟蚂蚁在寻找食物的过程中留下的信息素轨迹来寻找最优解。蚁群算法通常应用于旅行商问题(Traveling Salesman Problem,TSP)等需要求解最短路径的问题。 初始化:设置

    2024年02月13日
    浏览(10)
  • 蚁群算法、模拟退火算法、遗传算法优缺点

    1.可以突破爬山算法的局限性,获得全局最优解(以一 定的概率接受较差解,从而跳出局部最;优解)。 2.初始解与最终解都是随机选取的,它们毫无关联,因此具有很好的鲁棒性,即抵御外界不稳定因素的能力。 3.其最优解常常受迭代次数k的影响,若k值越大,则搜索时间越长

    2024年02月01日
    浏览(10)
  • Daftart.ai:人工智能专辑封面生成器

    Daftart.ai:人工智能专辑封面生成器

    前言          Daft Art AI是一款使用人工智能技术来帮助您制作专辑封面的软件,它可以让您在几分钟内,用简单的编辑器和精选的美学风格,为您的专辑或歌曲创建出惊艳的高质量的艺术品。Daft Art AI有以下几个特点:简单易用:您只需要输入您的专辑或歌曲的名称,就

    2024年02月04日
    浏览(7)
  • 机器学习之蚁群算法

    机器学习中的蚁群算法是一种启发式算法,灵感来源于蚁群在寻找食物时的行为。这种算法模拟了蚂蚁群体的集体智慧,通过多个个体之间的相互合作来解决问题。蚁群算法通常用于解决优化问题,例如路径规划、任务分配和调度等。 基本思想是通过模拟蚂蚁在搜索过程中释

    2024年01月19日
    浏览(8)
  • 智能安防与人工智能:如何共同打造更安全的城市

    随着人工智能技术的不断发展,智能安防领域也逐渐进入了人工智能时代。人工智能技术为安防行业带来了更高的准确性、更高的效率和更高的安全性。在这篇文章中,我们将探讨人工智能在安防领域的应用,以及如何通过人工智能技术来打造更安全的城市。 人工智能技术可

    2024年02月22日
    浏览(13)
  • 蚁群算法小结及算法实例(附Matlab代码)

    蚁群算法小结及算法实例(附Matlab代码)

    目录 1、基本蚁群算法 2、基本蚁群算法的流程 3、关键参数说明 3.1 信息素启发式因子 α 3.2 期望启发因子 β 3.3 信息素蒸发系数 ρ 3.4 蚂蚁数目 m 3.5 信息素强度 Q 对算法性能的影响 3.6 最大进化代数 G 4、MATLAB仿真实例 4.1 蚁群算法求解旅行商问题(TSP) 蚁群算法求解旅行

    2023年04月08日
    浏览(10)
  • 【数学建模】 MATLAB 蚁群算法

    【数学建模】 MATLAB 蚁群算法

    MATLAB–基于蚁群算法的机器人最短路径规划 * https://blog.csdn.net/woai210shiyanshi/article/details/104712540?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168853912916800215023827%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257Drequest_id=168853912916800215023827biz_id=0utm_medium=distribute.pc_search_result.

    2024年02月15日
    浏览(9)
  • 集货运输优化:数学建模步骤,Python实现蚁群算法(解决最短路径问题), 蚁群算法解决旅行商问题(最优路径问题),节约里程算法

    目录 数学建模步骤 Python实现蚁群算法(解决最短路径问题)  蚁群算法解决旅行商问题(最优路径问题)

    2024年02月09日
    浏览(41)
  • 蚁群算法的三维路径规划【Matlab】

    蚁群算法的三维路径规划【Matlab】

    本篇文章主要记录了蚁群算法在三维路径规划中实现的过程 1 引言 在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法。其中, 模拟蚁群觅食过程的蚁群优化算法(Ant Colony Opti

    2023年04月21日
    浏览(15)
  • Matlab蚁群算法求解旅行商问题

    Matlab蚁群算法求解旅行商问题

    目录 问题展现 解决代码 代码1 输出结果 代码2 输出结果 代码3 输出结果 假设有一个旅行商人要拜访全国 31 个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择要求是:所选路径的路程为所有路径之中的

    2023年04月15日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包