基于改进的蚂蚁群算法求解最短路径问题、二次分配问题、背包问题【Matlab&Python代码实现】

👨‍🎓博主课外兴趣:中西方哲学,送予读者:

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。在我这个专栏记录我有空时的一些哲学思考和科研笔记:科研和哲思。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“真理”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

📋📋📋本文目录如下:⛳️⛳️⛳️

目录

1 知识点

 1.1 蚁群算法步骤

1.2 蚁群算法程序

2 蚂蚁算法求解最短路径问题——Python实现

2.1 源码实现

2.2  ACA_TSP实现

3 蚂蚁算法求解最短路径问题——运行结果

4 蚂蚁算法求解二次指派问题——运行结果

5 蚂蚁算法求解背包问题——运行结果

6 改进蚂蚁算法——BP神经网络蚂蚁优化算法

7 Matlab代码实现

1 知识点

详细知识点见:智能优化算法—蚁群算法(Python实现)

我们这一节知识点只讲蚁群算法求解最短路径步骤及流程。

 1.1 蚁群算法步骤

     设蚂蚁的数量为m,地点的数量为n,地点i与地点j之间相距Dij,t时刻地点i与地点j连接的路径上的信息素浓度为Sij,初始时刻每个地点间路径上的信息素浓度相等。

   蚂蚁k根据各个地点间连接路径上的信息素决定下一个目标地点,Pijk表示t时刻蚂蚁k从地点i转移的概率,概率计算公式如下:

上式中,为启发函数,,表示蚂蚁从地点i转移到地点j的期望程度;为蚂蚁k即将访问地点的集合,开始时中有n-1个元素(除出发地点),随时间的推移,蚂蚁每到达下一个地点,中的元素便减少一个,直至空集,即表示所有地点均访问完毕;a为信息素重要程度因子,值越大,表明信息素的浓度在转移中起到的作用越大,也就是说蚂蚁选择距离近的下一个地点的概率更大,β为启发函数重要程度因子。

 蚂蚁在释放信息素的同时,每个地点间连接路径上的信息素逐渐消失,用参数

 表示信息素的挥发程度。因此,当所有蚂蚁完成一次循环后,每个地点间连接路径上的信息素浓度需更新,也就是有蚂蚁路过并且留下信息素,有公式表示为:

其中,表示第k只蚂蚁在地点i与j连接路径上释放的信息素浓度;表示所有蚂蚁在地点i与j连接路径上释放的信息素浓度之和;Q为常数,表示蚂蚁循环一次所释放的信息素总量;Lk表示第k只蚂蚁经过路径的长度,总的来说,蚂蚁经过的路径越短,释放的信息素浓度越高,最终选出最短路径。 

1.2 蚁群算法程序

(1)参数初始化

在寻最短路钱,需对程序各个参数进行初始化,蚁群规模m、信息素重要程度因子α、启发函数重要程度因子β、信息素会发因子、最大迭代次数ddcs_max,初始迭代值为ddcs=1。

(2)构建解空间

将每只蚂蚁随机放置在不同的出发地点,对蚂蚁访问行为按照公式计算下一个访问的地点,直到所有蚂蚁访问完所有地点。

(3)更新信息素

计算每只蚂蚁经过的路径总长Lk,记录当前循环中的最优路径,同时根据公式对各个地点间连接路径上的信息素浓度进行更新。

(4)判断终止

迭代次数达到最大值前,清空蚂蚁经过的记录,并返回步骤(2)。

2 蚂蚁算法求解最短路径问题——Python实现

2.1 源码实现

智能优化算法—蚁群算法(Python实现)

2.2  ACA_TSP实现

补充知识点:scipy.spatial.distance.cdist

#============导入相关库=================
import numpy as np
from scipy import spatial
import pandas as pd
import matplotlib.pyplot as plt
from sko.ACA import ACA_TSP

num_points = 25

points_coordinate = np.random.rand(num_points, 2)  # 生成点的坐标
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')#函数用于计算两个输入集合的距离


def cal_total_distance(routine):
    num_points, = routine.shape
    return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])


#=============ACA_TSP解决==================================

aca = ACA_TSP(func=cal_total_distance, n_dim=num_points,
              size_pop=50, max_iter=200,
              distance_matrix=distance_matrix)

best_x, best_y = aca.run()

#=============可视化=======================

fig, ax = plt.subplots(1, 2)
best_points_ = np.concatenate([best_x, [best_x[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
pd.DataFrame(aca.y_best_history).cummin().plot(ax=ax[1])
plt.show()

       

3 蚂蚁算法求解最短路径问题——运行结果

 

4 蚂蚁算法求解二次指派问题——运行结果

      在社会网络分析中,有一种方法用来研究关系之间的关系,通俗来讲,就是研究两个方阵的相关性和回归性。这种方法叫做QAP(Quadratic Assignment Procedure,二次指派程序)。它对两个方阵各个格值的相似性进行比较,给出两个矩阵之间的相关系数,同时对系数进行非参数检验,它以对矩阵数据的置换为基础。

          QAP与其他标准的统计程序的不同之处在于,矩阵的各个值之间不相互独立,因此用许多标准的统计程序就不能对其进行参数估计和统计检验,否则会计算出错误的标准差。对于这个问题,学者们利用一种随机化检验方法(randomization test)来检验,QAP属于其中一种。

 

5 蚂蚁算法求解背包问题——运行结果

6 改进蚂蚁算法——BP神经网络蚂蚁优化算法

7 Matlab代码实现

 

### 回答1: 以下是一个简单的任务指派问题Python 代码,使用贪心算法来解决: ```python def assign_tasks(workers, tasks): # 将任务按照难度排序 tasks = sorted(tasks) # 将工人按照能力值排序 workers = sorted(workers) assignments = [] i = 0 for task in tasks: while i < len(workers) and workers[i] < task: i += 1 if i == len(workers): break assignments.append((workers[i], task)) i += 1 return assignments ``` 该函数接受两个参数:一个工人列表和一个任务列表。每个工人都有一个能力值,每个任务都有一个难度值。函数返回一个元组列表,其中每个元组表示一个工人被分配了一个任务。 该函数首先将任务列表按照难度排序,将工人列表按照能力值排序。然后,它使用一个 while 循环遍历任务列表,对于每个任务,它从工人列表中找到第一个能力值大于等于该任务难度的工人,并将该工人分配给该任务。如果没有这样的工人,则跳出循环。 最后,函数返回一个元组列表,其中每个元组表示一个工人被分配了一个任务,按照任务难度的顺序排列。 ### 回答2: 任务指派问题是一个经典的优化问题,目标是通过合理地分配任务给工人,使得任务完成的总成本最低。下面是一个用Python解决任务指派问题的示例代码: ```python import numpy as np from scipy.optimize import linear_sum_assignment def assign_tasks(cost_matrix): # 使用linear_sum_assignment函数通过最小化总成本来分配任务 row_ind, col_ind = linear_sum_assignment(cost_matrix) # row_ind表示分配的任务,col_ind表示分配给的工人 assigned_tasks = [] for i in range(len(row_ind)): assigned_tasks.append((row_ind[i], col_ind[i])) return assigned_tasks # 测试代码 # 创建一个任务成本矩阵,行表示任务,列表示工人 cost_matrix = np.array([[4, 8, 5, 7], [9, 2, 6, 3], [5, 7, 3, 6], [8, 2, 1, 5]]) assigned_tasks = assign_tasks(cost_matrix) print("任务指派结果:") for task, worker in assigned_tasks: print("任务{} 分配给工人{}".format(task+1, worker+1)) ``` 以上代码使用了`numpy`库来创建任务成本矩阵,并调用`scipy.optimize`库中的`linear_sum_assignment`函数来解决任务指派问题。 任务成本矩阵的行表示任务,列表示工人,矩阵中的元素表示分配某个任务给某个工人的成本。 `linear_sum_assignment`函数返回的`row_ind`和`col_ind`数组表示最优解,即每个任务分配给哪个工人。 最后遍历`assigned_tasks`列表输出任务指派结果,其中任务和工人的索引需要加1,以符合常规的编号。 ### 回答3: 任务指派问题是一个经典的优化问题,涉及到将一组任务分配给一组工人,以最大限度地满足特定的目标函数。下面是一个用Python实现任务指派问题代码示例: ```python import numpy as np from scipy.optimize import linear_sum_assignment # 创建一个随机的任务-工人矩阵 cost_matrix = np.random.rand(5, 5) # 使用linear_sum_assignment函数获取最小化总成本的最优指派方案 row_ind, col_ind = linear_sum_assignment(cost_matrix) # 输出最优指派方案 for i in range(len(row_ind)): print(f"将任务 {row_ind[i]+1} 分配给工人 {col_ind[i]+1}") ``` 在上述代码中,我们使用了NumPy库创建了一个随机的5x5任务-工人矩阵,每个元素表示将任务分配给工人的成本。然后,我们使用scipy库中的`linear_sum_assignment`函数来解决线性和分配问题,找到一组最小化总成本的最优指派方案。 `linear_sum_assignment`函数返回两个数组`row_ind`和`col_ind`,分别表示任务和工人的指派方案。我们可以遍历这两个数组并输出最优指派方案。 需要注意的是,这只是一个简单的示例代码,实际应用中可以根据具体的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值