智能优化算法之蚁群算法ACO

news2024/9/21 19:03:14

蚁群算法(Ant Colony Optimization, ACO)由意大利学者马尔科·多里戈(Marco Dorigo)于1992年在其博士论文中首次提出。灵感来自于自然界中的蚂蚁群体行为,特别是蚂蚁在寻找食物过程中所展示的路径优化能力。蚁群算法属于一种基于群体智能的优化算法,通过模拟蚂蚁在路径上释放信息素的行为来解决复杂的优化问题。

数学原理

蚁群算法的基本思想是通过模拟蚂蚁在路径上释放和挥发信息素的过程,逐步找到问题的最优解。其核心步骤如下:

  1. 初始化信息素矩阵:为所有路径初始化相同量的信息素。

  2. 路径选择:蚂蚁根据路径上的信息素浓度和启发式信息(如距离)选择下一步要走的路径。路径选择概率公式为:

    其中,是路径 上的信息素浓度,是启发式信息(通常是路径的倒数), 和 分别是信息素和启发式信息的相对重要性参数。

  3. 信息素更新:蚂蚁完成路径后,根据路径长度更新信息素。信息素更新公式为:

    其中, 是信息素挥发系数,是蚂蚁在路径上释放的信息素量,通常与路径长度成反比。

  4. 迭代:重复路径选择和信息素更新步骤,直到满足终止条件(如达到最大迭代次数或路径长度不再显著变化)。

应用场景

蚁群算法具有广泛的应用场景,主要包括但不限于以下领域:

  1. 旅行商问题(TSP):最初被用于解决TSP问题,即在给定一组城市中找到最短的巡回路径。

  1. 物流和交通:用于优化物流配送路径、车辆路径规划和交通信号控制等问题。

  2. 网络路由:在计算机网络和通信网络中,用于动态路由选择以提高网络效率。

  3. 生产调度:在制造业中,用于优化生产计划和调度,减少生产成本和时间。

  4. 图像处理:用于图像分割、边缘检测等图像处理任务。

Python 可视化实现

下面是一个使用Python实现蚁群算法解决旅行商问题并进行可视化的示例:

import numpy as np
import matplotlib.pyplot as plt
import random

# 定义城市坐标
cities = np.array([
    [0, 0], [1, 5], [5, 6], [7, 8], [8, 8], [9, 5],
    [8, 0], [6, 1], [3, 2], [1, 1]
])

# 计算距离矩阵
def calculate_distance_matrix(cities):
    num_cities = len(cities)
    distance_matrix = np.zeros((num_cities, num_cities))
    for i in range(num_cities):
        for j in range(num_cities):
            if i != j:
                distance_matrix[i, j] = np.linalg.norm(cities[i] - cities[j])
    return distance_matrix

# 初始化参数
num_ants = 10
num_iterations = 100
alpha = 1.0  # 信息素重要性
beta = 2.0  # 启发式因子重要性
rho = 0.1  # 信息素挥发系数
Q = 1.0  # 信息素强度

# 初始化信息素矩阵
num_cities = len(cities)
pheromone = np.ones((num_cities, num_cities))

# 路径选择函数
def choose_next_city(pheromone, visibility, current_city, visited):
    probabilities = []
    for i in range(num_cities):
        if i not in visited:
            probabilities.append((pheromone[current_city, i] ** alpha) * (visibility[current_city, i] ** beta))
        else:
            probabilities.append(0)
    probabilities = probabilities / np.sum(probabilities)
    return np.random.choice(range(num_cities), p=probabilities)

# 主循环
distance_matrix = calculate_distance_matrix(cities)
visibility = 1 / (distance_matrix + np.diag([np.inf] * num_cities))

best_path = None
best_distance = np.inf

for iteration in range(num_iterations):
    all_paths = []
    all_distances = []
    for ant in range(num_ants):
        path = [random.randint(0, num_cities - 1)]
        visited = set(path)
        while len(visited) < num_cities:
            next_city = choose_next_city(pheromone, visibility, path[-1], visited)
            path.append(next_city)
            visited.add(next_city)
        distance = np.sum([distance_matrix[path[i], path[i + 1]] for i in range(num_cities - 1)])
        distance += distance_matrix[path[-1], path[0]]  # 回到起点
        all_paths.append(path)
        all_distances.append(distance)
        if distance < best_distance:
            best_path = path
            best_distance = distance

    # 更新信息素
    pheromone = (1 - rho) * pheromone
    for path, distance in zip(all_paths, all_distances):
        for i in range(num_cities - 1):
            pheromone[path[i], path[i + 1]] += Q / distance
        pheromone[path[-1], path[0]] += Q / distance

# 可视化最优路径
plt.figure(figsize=(10, 10))
for i in range(num_cities):
    plt.scatter(cities[i, 0], cities[i, 1], color='red')
    plt.text(cities[i, 0], cities[i, 1], str(i), fontsize=12, color='blue')
for i in range(num_cities - 1):
    plt.plot([cities[best_path[i], 0], cities[best_path[i + 1], 0]],
             [cities[best_path[i], 1], cities[best_path[i + 1], 1]], color='green')
plt.plot([cities[best_path[-1], 0], cities[best_path[0], 0]],
         [cities[best_path[-1], 1], cities[best_path[0], 1]], color='green')
plt.title(f'Best Path: {best_path}\nDistance: {best_distance:.2f}')
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.grid(True)
plt.show()

以上代码实现了蚁群算法解决旅行商问题的基本流程,并通过可视化展示了最优路径和总距离。蚂蚁根据路径上的信息素浓度和启发式信息选择下一步城市,通过不断迭代更新信息素,逐步找到最优解。

图着色问题要求用最少的颜色给图的每个顶点着色,使得相邻顶点颜色不同。

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import random

# 图着色问题的蚁群算法实现
class AntColonyOptimizationForGraphColoring:
    def __init__(self, graph, num_colors, num_ants, num_iterations, alpha=1.0, beta=2.0, evaporation_rate=0.5, pheromone_init=0.1):
        self.graph = graph
        self.num_colors = num_colors
        self.num_ants = num_ants
        self.num_iterations = num_iterations
        self.alpha = alpha
        self.beta = beta
        self.evaporation_rate = evaporation_rate
        self.pheromone = pheromone_init * np.ones((len(graph.nodes), num_colors))
        self.best_coloring = None
        self.best_score = float('inf')

    def solve(self):
        for iteration in range(self.num_iterations):
            all_colorings = []
            for _ in range(self.num_ants):
                coloring = self.construct_solution()
                all_colorings.append(coloring)
                score = self.evaluate_coloring(coloring)
                if score < self.best_score:
                    self.best_score = score
                    self.best_coloring = coloring
            self.update_pheromone(all_colorings)
            print(f"Iteration {iteration+1}/{self.num_iterations}, Best Score: {self.best_score}")

        return self.best_coloring

    def construct_solution(self):
        coloring = [-1] * len(self.graph.nodes)
        for node in self.graph.nodes:
            probabilities = self.compute_probabilities(node, coloring)
            if np.isnan(probabilities).any():
                probabilities = np.ones(self.num_colors) / self.num_colors
            color = np.random.choice(range(self.num_colors), p=probabilities)
            coloring[node] = color
        return coloring

    def compute_probabilities(self, node, coloring):
        pheromone = self.pheromone[node]
        heuristic = np.ones(self.num_colors)
        for neighbor in self.graph.neighbors(node):
            if coloring[neighbor] != -1:
                heuristic[coloring[neighbor]] = 0
        probabilities = (pheromone ** self.alpha) * (heuristic ** self.beta)
        if probabilities.sum() == 0:
            probabilities = np.ones(self.num_colors)
        return probabilities / probabilities.sum()

    def evaluate_coloring(self, coloring):
        conflicts = 0
        for edge in self.graph.edges:
            if coloring[edge[0]] == coloring[edge[1]]:
                conflicts += 1
        return conflicts

    def update_pheromone(self, all_colorings):
        self.pheromone *= (1 - self.evaporation_rate)
        for coloring in all_colorings:
            score = self.evaluate_coloring(coloring)
            for node, color in enumerate(coloring):
                self.pheromone[node][color] += 1 / (1 + score)

# 生成随机图
def generate_random_graph(num_nodes, edge_prob):
    graph = nx.gnp_random_graph(num_nodes, edge_prob)
    return graph

# 可视化图结构
def visualize_graph_structure(graph, title):
    pos = nx.spring_layout(graph)
    nx.draw(graph, pos, with_labels=True, node_size=500, node_color='lightblue', edge_color='gray')
    plt.title(title)
    plt.show()

# 可视化着色结果
def visualize_graph_coloring(graph, coloring, title):
    pos = nx.spring_layout(graph)
    colors = [coloring[node] for node in graph.nodes]
    nx.draw(graph, pos, node_color=colors, with_labels=True, node_size=500, cmap=plt.cm.rainbow)
    plt.title(title)
    plt.show()

# 参数设置
num_nodes = 10
edge_prob = 0.3
num_colors = 3
num_ants = 10
num_iterations = 100

# 生成随机图
graph = generate_random_graph(num_nodes, edge_prob)

# 可视化原始图结构
visualize_graph_structure(graph, "Original Graph Structure")

# 蚁群算法求解图着色问题
aco = AntColonyOptimizationForGraphColoring(graph, num_colors, num_ants, num_iterations)
best_coloring = aco.solve()

# 可视化着色结果
visualize_graph_coloring(graph, best_coloring, f'Graph Coloring with Ant Colony Optimization (Conflicts: {aco.best_score})')

原始图结构:

图着色问题结果:

以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Snap Video:用于文本到视频合成的扩展时空变换器

图像生成模型的质量和多功能性的显著提升&#xff0c;研究界开始将其应用于视频生成领域。但是视频内容高度冗余&#xff0c;直接将图像模型技术应用于视频生成可能会降低运动的保真度和视觉质量&#xff0c;并影响可扩展性。来自 Snap 的研究团队及其合作者提出了 "Snap …

JAVA从入门到精通之入门初阶(二)

1. 自动类型转换 自动类型转换&#xff1a;类型范围小的变量可以赋值给类型范围大的变量 byte->int public class java_7_10 {public static void main(String[] args) {//自动类型转换//类型范围小的变量可以赋值给类型范围大的变量 byte->intbyte a 12;int b a;//自动…

MT6985(天玑9200)芯片性能参数_MTK联发科旗舰5G移动平台处理器

MT6985天玑 9200 旗舰移动平台拥有专业级影像、沉浸式游戏和先进移动显示技术&#xff0c;以及更快捷、覆盖更广的 5G 和 支持 Wi-Fi 7 连接&#xff0c;具有高性能、高能效、低功耗表现。率先采用 Armv9 性能核&#xff0c;全部支持纯 64 位应用&#xff0c;开启高能效架构设计…

华为OD机试 - 堆内存申请(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

nginx正向代理和反向代理

nginx正向代理和反向代理 正向代理以及缓存配置 代理&#xff1a;客户端不再是直接访问服务器&#xff0c;通过代理服务器访问服务端。 正向代理&#xff1a;面向客户端&#xff0c;我们通过代理服务器的IP地址访问目标服务端。 服务端只知道代理服务器的地址&#xff0c;真…

【RHCE】基于密钥的身份验证(Win-Linux)

目的&#xff1a;要提⾼系统安全性&#xff0c;通过在 OpenSSH 服务器上禁⽤密码⾝份验证来强制进⾏基于密钥的⾝份验证。 1、一台虚拟机无需密码连接另一台虚拟机 .ssh目录 > 保存了ssh相关的key和一些记录文件 &#xff08;1&#xff09;生成密钥对 使⽤这个流程在本地…

智慧港口可视化:提高运营效率与安全性

智慧港口通过图扑可视化技术&#xff0c;实时展示船舶停泊、货物装卸等关键数据&#xff0c;提高运营效率&#xff0c;保障港口的整体安全性与可靠性。

IT资产管理专题丨一文读懂什么是企业IT资产管理系统

在现代企业管理中&#xff0c;IT资产的管理变得越来越重要。随着信息技术的飞速发展&#xff0c;企业IT资产种类繁多&#xff0c;包括硬件设备、软件应用、许可证、合同等。 如何有效管理和利用这些资产成为企业面临的一大挑战。本文将通过人物对话的形式&#xff0c;详细解读企…

离线语音识别芯片在智能生活中的应用

离线语音识别芯片&#xff0c;这一技术正逐渐渗透到我们日常生活的每一个角落&#xff0c;为众多产品带来前所未有的智能体验。它能够应用到多种产品中&#xff0c;‌包括但不限于&#xff1a;‌ 1、智能音箱&#xff1a;‌语音识别芯片作为智能音箱的核心&#xff0c;‌使用户…

中霖教育:2024年中级经济师备考还来得及吗?

【中霖教育怎么样】【中霖教育口碑】 2024年的中级经济师考试还未开始报名&#xff0c;考试时间在11月16日-11月17日进行&#xff0c;考生目前距离考试还有半年的准备时间。不同的考生人群针对性的复习方法不同&#xff0c;以下内容可以作为大家的参考。 1、零基础考生&#…

【MySQL系列】VARCHAR的底层存储

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MSPM0G3507(三十六)——超声波PID控制小车固定距离

效果图&#xff1a; 波形图软件是VOFA&#xff0c;B站有教程 &#xff0c;虽然有缺点但是非常简单。 视频效果&#xff1a; PID控制距离 之前发过只有超声波测距的代码&#xff0c;MSPM0G3507&#xff08;三十二&#xff09;——超声波模块移植代码-CSDN博客 SYSCFG配置&#…

Nacos服务公网环境登陆报密码错误问题排查

作者&#xff1a;小丫 一、问题现象 nacos服务内网可以正常登录&#xff0c;如下&#xff1a; 走公网代理出来之后&#xff0c;无法正常登录&#xff0c;报错"用户名密码错误" 二、排查步骤 1、链路分析 首先确认公网代理的链路&#xff1a; 域名—>haprox…

扩散的魔法:如何打造未来生物打印?

生物打印技术正在快速发展&#xff0c;它允许我们将生物材料、细胞和生长因子等生物活性成分精确地打印成具有特定形状和功能的结构。而扩散现象在生物打印中扮演着至关重要的角色&#xff0c;它影响着打印结构的特性、机械性能、生物功能和形态。为了更好地利用扩散现象&#…

青年发展型城市成新青择地,期待与挑战并存

随着社会的发展和城市化进程的加快&#xff0c;青年人在选择未来定居地时面临着越来越多的选择。近日&#xff0c;中国青年报社社会调查中心联合问卷网对1500名青年进行的一项调查显示&#xff0c;74.8%的受访青年表示会优先考虑青年发展型城市。那么&#xff0c;青年在选择未来…

深耕一个领域存在的风险?

深耕一个领域存在的风险? 我们常常听到:要深耕一个领域/行业。 对于个人来说是选择一份职业深耕,还是在多个领域尝试? ​ 首先看看人才分类 人才的分类可以归纳为三种类型,I型,T型,X型,三种类型简称ITX “I” 型人才 “I” 型人才可以分为专才或者通才。横向放置…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《面向规模化分布式可再生能源并网的群网协同互动优化方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

ABAP调用BAPI时COMMIT WORK AND WAIT未按照预期同步提交问题分析

背景&#xff1a; 在做ABAP开发时&#xff0c;经常会有连续调用BAPI的需求&#xff0c;比如先创建销售订单&#xff0c;再依据销售订单创建交货单&#xff0c;再对交货单进行过账等类似的一连串调用&#xff0c;这种类似的场景往往需要前一步操作的数据完全写入数据库才能进行…

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用 关系抽取&#xff08;Relation Extraction&#xff09;就是从一段文本中抽取出&#xff08;主体&#xff0c;关系&#xff0c;客体&#xff09;这样的三元组&#xff0c;用英文表示是 (subject, relation, obj…