高级人工智能之群体智能:蚁群算法

群体智能

鸟群:

鱼群:

1.基本介绍

蚁群算法(Ant Colony Optimization, ACO)是一种模拟自然界蚂蚁觅食行为的优化算法。它通常用于解决路径优化问题,如旅行商问题(TSP)。

蚁群算法的基本步骤

初始化:设置蚂蚁数量、信息素重要程度、启发因子重要程度、信息素的挥发速率和信息素的初始量。

构建解:每只蚂蚁根据概率选择下一个城市,直到完成一次完整的路径。

更新信息素:在每条路径上更新信息素,通常新的信息素量与路径的质量成正比。

迭代:重复构建解和更新信息素的步骤,直到达到预设的迭代次数。

2.公式化蚁群算法

  1. 转移概率 P i j k P_{ij}^k Pijk 表示蚂蚁 k k k从城市 i i i转移到城市 j j j的概率。它是基于信息素强度 τ i j \tau_{ij} τij(信息素重要程度为 α \alpha α和启发式信息 η i j \eta_{ij} ηij)(启发式信息重要程度为 β \beta β )计算的:

    P i j k = [ τ i j ] α ⋅ [ η i j ] β ∑ l ∈ allowed k [ τ i l ] α ⋅ [ η i l ] β P_{ij}^k = \frac{[\tau_{ij}]^\alpha \cdot [\eta_{ij}]^\beta}{\sum_{l \in \text{allowed}_k} [\tau_{il}]^\alpha \cdot [\eta_{il}]^\beta} Pijk=lallowedk[τil]α[ηil]β[τij]α[ηij]β

    其中, allowed k \text{allowed}_k allowedk 是蚂蚁 k k k 可以选择的下一个城市集合。

  2. 信息素更新规则。在每次迭代结束后,所有路径上的信息素会更新。更新规则通常包括信息素的挥发和信息素的沉积:

    τ i j ← ( 1 − ρ ) ⋅ τ i j + Δ τ i j \tau_{ij} \leftarrow (1 - \rho) \cdot \tau_{ij} + \Delta \tau_{ij} τij(1ρ)τij+Δτij

    其中,( ρ \rho ρ ) 是信息素的挥发率,( Δ τ i j \Delta \tau_{ij} Δτij ) 是本次迭代中所有蚂蚁在路径 ( i , j ) (i, j) (i,j) 上留下的信息素总量,通常计算方式为_

    Δ τ i j = ∑ k = 1 m Δ τ i j k \Delta \tau_{ij} = \sum_{k=1}^{m} \Delta \tau_{ij}^k Δτij=k=1mΔτijk

    而对于每只蚂蚁 k k k ,在路径 ( i , j ) (i, j) (i,j) 上留下的信息素量 Δ τ i j k \Delta \tau_{ij}^k Δτijk 通常与其走过的路径长度成反比:

    Δ τ i j k = { Q L k , if ant  k  travels on edge  ( i , j ) 0 , otherwise \Delta \tau_{ij}^k= \begin{cases} \frac{Q}{L_k}, & \text{if ant } k \text{ travels on edge } (i, j) \\ 0, & \text{otherwise} \end{cases} Δτijk={LkQ,0,if ant k travels on edge (i,j)otherwise

    这里, Q Q Q是一个常数, L k L_k Lk是蚂蚁 k k k的路径长度。

  3. 启发式信息 ( η i j \eta_{ij} ηij ) 通常是目标函数的倒数,例如在TSP问题中,它可以是两城市间距离的倒数:

    η i j = 1 d i j \eta_{ij} = \frac{1}{d_{ij}} ηij=dij1

    其中, d i j d_{ij} dij 是城市 i i i j j j 之间的距离。

这些公式构成了蚁群算法的数学基础。通过调整参数 α \alpha α , β \beta β, 和 ρ \rho ρ,可以控制算法的搜索行为,从而适应不同的优化问题。

3.代码实现

import numpy as np
import matplotlib.pyplot as plt

class AntColonyOptimizer:
    def __init__(self, distances, n_ants, n_best, n_iterations, decay, alpha=1, beta=1):
        # 初始化参数
        self.distances = distances  # 城市间的距离矩阵
        self.pheromone = np.ones(self.distances.shape) / len(distances)  # 初始化信息素矩阵
        self.all_inds = range(len(distances))  # 所有城市的索引
        self.n_ants = n_ants  # 蚂蚁数量
        self.n_best = n_best  # 每轮保留的最佳路径数
        self.n_iterations = n_iterations  # 迭代次数
        self.decay = decay  # 信息素的挥发率
        self.alpha = alpha  # 信息素重要程度
        self.beta = beta  # 启发因子的重要程度

    def run(self):
        # 运行算法
        shortest_path = None
        shortest_path_length = float('inf')
        for iteration in range(self.n_iterations):  # 对每次迭代
            all_paths = self.gen_all_paths()  # 生成所有蚂蚁的路径
            self.spread_pheromone(all_paths, self.n_best, shortest_path_length)  # 更新信息素
            shortest_path, shortest_path_length = self.find_shortest_path(all_paths)  # 找到最短路径
            self.plot_paths(shortest_path, iteration, shortest_path_length)  # 绘制路径
        return shortest_path, shortest_path_length

    def gen_path_dist(self, path):
        # 计算路径长度
        total_dist = 0
        for i in range(len(path) - 1):
            total_dist += self.distances[path[i], path[i+1]]
        return total_dist

    def gen_all_paths(self):
        # 生成所有蚂蚁的路径
        all_paths = []
        for _ in range(self.n_ants):
            path = [np.random.randint(len(self.distances))]  # 选择一个随机起点
            while len(path) < len(self.distances):
                move_probs = self.gen_move_probs(path)  # 生成移动概率
                next_city = np_choice(self.all_inds, 1, p=move_probs)[0]  # 选择下一个城市
                path.append(next_city)
            all_paths.append((path, self.gen_path_dist(path)))  # 添加路径和长度
        return all_paths

    def spread_pheromone(self, all_paths, n_best, shortest_path_length):
        # 更新信息素
        sorted_paths = sorted(all_paths, key=lambda x: x[1])  # 按路径长度排序
        for path, dist in sorted_paths[:n_best]:  # 只取最好的n_best条路径
            for i in range(len(path) - 1):
                self.pheromone[path[i], path[i+1]] += 1.0 / self.distances[path[i], path[i+1]]

    def find_shortest_path(self, all_paths):
        # 寻找最短路径
        shortest_path = min(all_paths, key=lambda x: x[1])  # 根据路径长度找到最短的那条
        return shortest_path[0], shortest_path[1]

    def gen_move_probs(self, path):
        # 生成移动概率
        last_city = path[-1]
        probs = np.zeros(len(self.distances))
        for i in self.all_inds:
            if i not in path:
                pheromone = self.pheromone[last_city, i] ** self.alpha
                heuristic = (1.0 / self.distances[last_city, i]) ** self.beta
                probs[i] = pheromone * heuristic
        return probs / probs.sum()

    def plot_paths(self, best_path, iteration, path_length):
        # 绘制路径
        plt.figure(figsize=(10, 6))
        for i in range(len(coords)):  # 绘制所有可能的路径
            for j in range(i+1, len(coords)):
                plt.plot([coords[i][0], coords[j][0]], [coords[i][1], coords[j][1]], 'k:', alpha=0.5)
        for i in range(len(best_path) - 1):  # 绘制最短路径
            start_city = best_path[i]
            end_city = best_path[i+1]
            plt.plot([coords[start_city][0], coords[end_city][0]], [coords[start_city][1], coords[end_city][1]], 'b-', linewidth=2)
        plt.scatter(*zip(*coords), color='red')  # 标记城市位置
        for i, coord in enumerate(coords):  # 添加城市标签
            plt.text(coord[0], coord[1], str(i), color='green')
        plt.title(f'Iteration: {iteration}, Shortest Path Length: {round(path_length, 2)}')
        plt.xlabel('X Coordinate')
        plt.ylabel('Y Coordinate')
        plt.show()

def np_choice(a, size, replace=True, p=None):
    # numpy的随机选择函数
    return np.array(np.random.choice(a, size=size, replace=replace, p=p))

# 城市坐标
coords = np.random.rand(10, 2)  # 假设有10个城市

# 计算距离矩阵
distances = np.zeros((10, 10))
for i in range(10):
    for j in range(10):
        distances[i, j] = np.linalg.norm(coords[i] - coords[j])  # 使用欧几里得距离

# 运行蚁群算法
aco = AntColonyOptimizer(distances, n_ants=10, n_best=5, n_iterations=100, decay=0.5, alpha=1, beta=2)
path, dist = aco.run()

执行结果:


. . . . . . ...... ......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C->Cpp】深度解析#由C迈向Cpp(2)

目录 &#xff08;一&#xff09;缺省参数 全缺省参数 半缺省参数 缺省参数只能在函数的声明中出现&#xff1a; 小结&#xff1a; &#xff08;二&#xff09;函数重载 函数重载的定义 三种重载 在上一篇中&#xff0c;我们从第一个Cpp程序为切入&#xff0c;讲解了Cpp的…

Topaz Video AI 视频修复工具(内附安装压缩包win+Mac)

目录 一、Topaz Video AI 简介 二、Topaz Video AI 安装下载 三、Topaz Video AI 使用 最近玩上了pika1.0和runway的图片转视频&#xff0c;发现生成出来的视频都是有点糊的&#xff0c;然后就找到这款AI修复视频工具 Topaz Video AI。 一、Topaz Video AI 简介 Topaz Video…

Openai的openai新版本调用方式

最近大家有没有发现Openai的openai已经更新到1.6.1了,而且API的调用方式发生了巨大的变化,下面来看看openai新的调用方式吧。 欢迎关注公众号 module ‘openai’ has no attribute ChatCompletion. 提示openai的版本过低。(pip install -U openai) 1. Chat API from openai…

【MySQL学习笔记008】多表查询

1、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上可分为三种&a…

freeRTOS实时操作系统学习笔记

温馨提示&#xff1a;点击图片查看大图更清晰 —————————————————————————————↑↑↑上方资源下载后可获取xmind原文件。 1、freeRTOS移植和配置脑图 2、内核源码学习

网络安全行业术语

病毒 是在计算机程序中插入的破坏计算机功能或者数据的代码&#xff0c;能影响计算机使用&#xff0c;能自我复制的一组计算机指令或者程序代码。 抓鸡 利用使用大量的程序的漏洞&#xff0c;使用自动化方式获取肉鸡的行为&#xff0c;即设法控制电脑&#xff0c;将其沦为肉…

Redis-实践知识

转自极客时间Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义&#xff0c;但是最好遵循下面几个实践的约定&#xff1a; 格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…

多维时序 | MATLAB实CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测预测效果基本介…

服装店管理系统打造门店拓客、促活、存留营销方案

打造门店拓客、促活和存留营销方案对于服装店的管理系统来说是非常重要的。以下是一些可行的方案&#xff1a; 1. 会员管理系统&#xff1a;引入会员管理功能&#xff0c;建立会员档案&#xff0c;跟踪会员消费记录和偏好。通过会员系统&#xff0c;可以实施积分制度、生日礼品…

堆与二叉树(下)

接着上次的&#xff0c;这里主要介绍的是堆排序&#xff0c;二叉树的遍历&#xff0c;以及之前讲题时答应过的简单二叉树问题求解 堆排序 给一组数据&#xff0c;升序&#xff08;降序&#xff09;排列 思路 思考&#xff1a;如果排列升序&#xff0c;我们应该建什么堆&#x…

boss app sig及sp参数,魔改base64

前言 大家好呀,欢迎来到我的博客.2023年12月4日,boss web上线了最新的zp_token,环境检测点又增加了,与此同时app端的关键加密so从32位换成了64位,两者ida反编译so的时候都有反调试,无法直接f5,需要手动调整让ida重新识别.google了一下几乎找不到任何有关boss app的文章,所以这…

luceda ipkiss教程 53:在版图上加中文

要在版图上加中文&#xff0c;如&#xff1a; 可以通过如下方法实现&#xff1a; 首先&#xff0c;可以在ppt中加入文本框&#xff0c;在文本框中输入想要加到版图上的中文内容&#xff0c;如&#xff0c;复旦大学&#xff0c;并将文本框存为windows位图。 其次&#xff0c;通…

java八股 mysql优化

数据库篇-01-MySQL篇-课程介绍_哔哩哔哩_bilibili 1.定位慢查询 2.分析优化慢查询 3.索引概念及结构 3.1 红黑树&#xff08;一种自平衡的二叉排序树&#xff09; 节点可以自动平衡保证log2 n的查找复杂度. 但因为是二叉树&#xff0c;数据多了层数还会多。 所以找一个多叉树 3…

【MCAL】TC397+EB-treso之MCU配置实战 - 芯片时钟

本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程&#xff0c;主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分&#xff0c;帮助读者了解TC397芯片的时钟树结构&#xff0c;在后续计算配置不同外设模块诸如通信速率&#xff0c;定时器周期等&…

项目管理4321方法论

文章目录 一、项目立项准备&#xff08;4步&#xff09;case1、识别价值---解决背后痛点的才是价值&#xff0c;价值是做任何事情的出发点case2、明确目标---支撑价值实现的&#xff0c;目标是 具体/可衡量/可达到/相关性/有时限的case3、识别干系人---找对人才能做对事&#x…

Android画布Canvas裁剪clipRect,Kotlin

Android画布Canvas裁剪clipRect&#xff0c;Kotlin private fun mydraw() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.A…

差生文具多之(二): perf

栈回溯和符号解析是使用 perf 的两大阻力&#xff0c;本文以应用程序 fio 的观测为例子&#xff0c;提供一些处理它们的经验法则&#xff0c;希望帮助大家无痛使用 perf。 前言 系统级性能优化通常包括两个阶段&#xff1a;性能剖析和代码优化&#xff1a; 性能剖析的目标是寻…

[Unity]接入Firebase 并且关联支付埋点

首先 在这个下一下FireBase的资源 firebase11.0.6 然后导入Analytics Auth Crashlytics 其他的看着加就行 然后直接丢到Unity里面 接下来需要去Firebase里面下载 Google json 丢到 这个下面 然后就是脚本代码了 using System.Collections; using System.Collection…

从mice到missForest:常用数据插值方法优缺点

一、引言 数据插值方法在数据处理和分析中扮演着至关重要的角色。它们可以帮助我们处理缺失数据&#xff0c;使得数据分析更加准确和可靠。数据插值方法被广泛应用于金融、医疗、社会科学等领域&#xff0c;以及工程和环境监测等实际应用中。 在本文中&#xff0c;我们将探讨三…

【教学类-42-02】20231224 X-Y 之间加法题判断题2.0(按2:8比例抽取正确题和错误题)

作品展示&#xff1a; 0-5&#xff1a; 21题&#xff0c;正确21题&#xff0c;错误21题42题 。小于44格子&#xff0c;都写上&#xff0c;哪怕输入2:8&#xff0c;实际也是5:5 0-10 66题&#xff0c;正确66题&#xff0c;错误66题132题 大于44格子&#xff0c;正确66题抽取44*…