团队作业:灾后大规模救援物资分配车辆路径优化与
高效启发式函数设计
背景:
在个人作业中,我们对多车辆路径规划问题进行了一些基础扩展。现在,作为团
队,你们将面临更复杂的场景和更大的问题规模,核心挑战在于设计和评估更智能
的启发式函数,以提高A*搜索算法的效率和解的质量。
作业目标:
1. 在个人作业的基础上,引入“优先村庄”的概念,并调整算法以适应新的优
化考量。
2. 设计、实现并评估至少两种新的、可能更有效的启发式函数。
3. 处理并解决一个预定义的大规模车辆路径规划问题。
4. 通过实验对比不同启发式函数在解决大规模问题时的性能。
问题描述与扩展要求:
1. 优先村庄 (Priority Villages):
o 某些村庄可能由于其重要性或紧急性,需要优先得到配送。
o 修改:
在问题定义中(例如,demands 字典或一个单独的列表)标识
出哪些村庄是“优先村庄”。
调整优化目标或约束:
方案A (硬约束): 所有优先村庄的需求必须在某个较
早的全局时间上限 priority_deadline 内得到完全满
足,否则该路径无效。
方案B (软目标/启发式引导): 在启发式函数或状态比
较 (State.__lt__) 中给予优先村庄的未满足需求更高
的权重,或者在满足优先村庄需求方面取得进展的状态
更高的优先级。
你需要选择一种方案(或提出自己的方案)来实现对优先村庄
的处理,并在报告中阐述理由。相应地,你可能需要修改
is_goal (如果采用硬约束方案A)、successors (如果需要检
查 priority_deadline)、heuristic 和 State.__lt__ 方
法。
2. 大规模问题实例:
o 提供的大规模测试算例: 你们在开发和初步测试时,应使用以下固
定的算例。请将这些数据结构复制到你们的Python代码的起始部分
或一个单独的配置文件中。
# 大规模算例数据
nodes_data_large = {
1: (0, 0), 2: (5, 149), 3: (118, 103), 4: (140, 132), 5:
(102, 108),
6: (90, 63), 7: (110, 140), 8: (18, 137), 9: (109, 130),
10: (100, 137),
11: (142, 145), 12: (61, 12), 13: (40, 118), 14: (111,
10), 15: (147, 36),
16: (123, 129), 17: (128, 81), 18: (13, 132), 19: (10,
80), 20: (70, 140),
21: (28, 50), 22: (11, 138), 23: (111, 113), 24: (148,
108), 25: (93, 14),
26: (149, 78), 27: (1, 104), 28: (102, 3), 29: (12, 13),
30: (81, 118),
31: (110, 11), 32: (122, 117), 33: (136, 101), 34: (13,
101), 35: (141, 14)
}
graph_data_large = {
1: [(2, 149.1, 6), (35, 141.0, 3), (29, 17.7, 7), (25,
94.0, 3), (21, 57.3, 7), (12, 62.2, 6)],
2: [(1, 149.1, 6), (3, 120.0, 7), (8, 13.9, 7), (20,
65.2, 7), (22, 6.1, 6), (27, 45.1, 3)],
3: [(2, 120.0, 7), (4, 30.4, 3), (5, 17.0, 5), (10,
37.6, 7), (16, 10.0, 6), (23, 7.1, 4)],
4: [(3, 30.4, 3), (5, 41.8, 8), (7, 31.6, 5), (11, 13.3,
7), (16, 17.7, 5), (24, 24.7, 6)],
5: [(3, 17.0, 5), (4, 41.8, 8), (6, 47.4, 8), (9, 23.0,
6), (17, 30.0, 7), (23, 10.2, 7)],
6: [(5, 47.4, 8), (7, 54.1, 5), (12, 59.1, 7), (17,
38.0, 3), (19, 82.0, 4), (25, 49.2, 7)],
7: [(4, 31.6, 5), (6, 54.1, 5), (8, 92.0, 5), (11, 32.0,
5), (16, 18.4, 6), (20, 40.0, 7)],
8: [(2, 13.9, 7), (7, 92.0, 5), (9, 91.0, 5), (13, 28.6,
6), (18, 5.8, 5), (22, 7.1, 6)],
9: [(5, 23.0, 6), (8, 91.0, 5), (10, 11.4, 6), (16,
13.0, 7), (23, 19.2, 5), (30, 30.5, 6)],
10: [(3, 37.6, 7), (9, 11.4, 6), (11, 42.8, 7), (16,
26.4, 4), (20, 30.2, 3), (30, 24.2, 7)],
11: [(4, 13.3, 7), (7, 32.0, 5), (10, 42.8, 7), (16,
19.9, 5), (20, 32.8, 7), (32, 33.9, 6)],
12: [(1, 62.2, 6), (6, 59.1, 7), (14, 50.0, 6), (19,
53.1, 7), (21, 53.1, 6), (29, 49.0, 8)],
13: [(8, 28.6, 6), (18, 27.0, 8), (19, 46.1, 5), (27,
40.8, 6), (30, 7.1, 6), (34, 27.9, 4)],
14: [(12, 50.0, 6), (15, 43.2, 6), (17, 72.8, 5), (25,
18.4, 6), (28, 12.0, 7), (31, 0.0, 5)],
15: [(14, 43.2, 6), (17, 50.1, 7), (26, 42.2, 4), (28,
51.1, 4), (31, 41.1, 8), (35, 23.3, 7)],
16: [(3, 10.0, 6), (4, 17.7, 5), (7, 18.4, 6), (9, 13.0,
7), (10, 26.4, 4), (11, 19.9, 5)], # Degree 6
17: [(5, 30.0, 7), (6, 38.0, 3), (14, 72.8, 5), (15,
50.1, 7), (23, 34.0, 3), (26, 21.2, 7)],
18: [(8, 5.8, 5), (13, 27.0, 8), (19, 52.0, 7), (22,
7.8, 6), (27, 13.3, 6), (34, 31.0, 3)],
19: [(6, 82.0, 4), (12, 53.1, 7), (13, 46.1, 5), (18,
52.0, 7), (21, 34.5, 5), (27, 26.0, 7)],
20: [(2, 65.2, 7), (7, 40.0, 7), (10, 30.2, 3), (11,
32.8, 7), (22, 59.0, 7), (30, 30.5, 3)],
21: [(1, 57.3, 7), (12, 53.1, 6), (19, 34.5, 5), (29,
39.8, 7), (34, 53.2, 8)],
22: [(2, 6.1, 6), (8, 7.1, 6), (18, 7.8, 6), (20, 59.0,
7), (27, 10.0, 6)],
23: [(3, 7.1, 4), (5, 10.2, 7), (9, 19.2, 5), (17, 34.0,
3), (30, 31.0, 8), (32, 11.0, 5)],
24: [(4, 24.7, 6), (26, 43.2, 3), (32, 29.7, 7), (33,
14.6, 6), (35, 94.6, 5)],
25: [(1, 94.0, 3), (6, 49.2, 7), (14, 18.4, 6), (28,
9.9, 3), (31, 18.0, 7)],
26: [(15, 42.2, 4), (17, 21.2, 7), (24, 43.2, 3), (28,
76.2, 7), (33, 26.0, 7), (35, 20.0, 6)],
27: [(2, 45.1, 3), (13, 40.8, 6), (18, 13.3, 6), (19,
26.0, 7), (22, 10.0, 6), (34, 12.0, 8)],
28: [(1, 102.0, 6), (14, 12.0, 7), (15, 51.1, 4), (25,
9.9, 3), (26, 76.2, 7), (31, 7.1, 6)],
29: [(1, 17.7, 7), (12, 49.0, 8), (21, 39.8, 7), (34,
88.1, 5)],
30: [(9, 30.5, 6), (10, 24.2, 7), (13, 7.1, 6), (20,
30.5, 3), (23, 31.0, 8), (32, 42.0, 6)],
31: [(14, 0.0, 5), (15, 41.1, 8), (25, 18.0, 7), (28,
7.1, 6), (35, 6.1, 6)],
32: [(11, 33.9, 6), (23, 11.0, 5), (24, 29.7, 7), (30,
42.0, 6), (33, 18.4, 8)],
33: [(24, 14.6, 6), (26, 26.0, 7), (32, 18.4, 8), (35,
87.4, 5)],
34: [(13, 27.9, 4), (18, 31.0, 3), (21, 53.2, 8), (27,
12.0, 8), (29, 88.1, 5)],
35: [(1, 141.0, 3), (15, 23.3, 7), (24, 94.6, 5), (26,
20.0, 6), (31, 6.1, 6), (33, 87.4, 5)]
}
demands_data_large = {
18: 58, 20: 38, 22: 36, 34: 22, 27: 52, 8: 35, 21: 41
} # 8 demand points
priority_village_ids_large = [20, 8, 18] # 示例优先村庄
# 估算 priority_deadline (基于上述优先村庄和节点1)
# nodes_concrete[1]=(0,0), nodes_concrete[20]=(70,140) ->
dist 156.5
# nodes_concrete[8]=(18,137) -> dist 138.2
# nodes_concrete[18]=(13,132) -> dist 132.6
# max_dist_priority = 156.5, avg_speed = 5
# priority_deadline = (156.5 / 5) * 2.5 = 31.3 * 2.5 = 78.25
# 在估算时间下采取更严格的限制
priority_deadline_large = 30.0
vehicle_props_large = [
(78, 153.4), (86, 139.2), (52, 229.5), (70, 169.8)
]
# 容量和个体最大行驶时间限制示例
# (容量, 个体最大行驶时间)
o 重要说明: 你们将使用按上述描述生成的算例进行开发和测试。最
终评价你们算法有效性时,将会使用另一个未公布的、但结构和规
模与此描述类似的算例。
3. 高效启发式函数设计:
o 核心任务: 基于对问题特性和A*算法的理解,设计并实现至少两种
新的启发式函数。
o 目标: 这些新的启发式函数应该旨在比课程中提供的基础启发式函
数更“智能”,能够更准确地估计到达目标的剩余成本,从而引导
A*搜索更快地找到优质解,或者在相同时间内探索更少的状态。
o 要求:
清晰描述每个新启发式函数的设计思路和计算方法。
如果可能,分析你的启发式函数是否是“可接受
的”(admissible),即是否会低估或等于实际的最小剩余成
本。如果不是严格可接受的,讨论其可能带来的影响。
任务与要求:
1. 代码实现:
o 在你们个人作业完成的代码基础上进行修改和扩展。
o 实现对“优先村庄”的处理逻辑。
o 实现你们设计的至少两种新的启发式函数。在 MultiVehiclePlanner
中可以提供一个机制来选择使用哪个启发式函数进行搜索(例如,通
过构造函数参数传递一个启发式函数名或函数本身)。
2. 实验与分析:
o 使用上面提供的特定大规模算例进行开发和初步测试。
o 分别使用以下启发式函数运行你们的A*算法:
课程中提供的原始(或个人作业中使用的)启发式函数。
你们设计的新的启发式函数1。
你们设计的新的启发式函数2。
o 对于每次运行,记录并比较以下性能指标:
是否找到了解决方案。
最终解的质量(例如,最慢车辆的总用时 max_time,所有车
辆的总行驶距离)。
A*算法探索的状态总数 (explored_count)。
算法的实际运行时间。
o 注意: (1)由于大规模算例的状态空间可能非常大,你们可能需
要为A*搜索设置一个合理的探索状态上限 (max_explored_limit)
或运行时间上限,以确保实验可以在可接受的时间内完成。如果达到
上限仍未找到解,也应记录此情况;(2)为了进一步起到“剪枝”
效果,必要时也可对successors方法进行改造,避免无价值状态进
入优先队列。
提交内容:
1. 一份团队Python文件 (.py): 包含所有成员贡献的、完整的、可运行的
代码。代码中应包含对优先村庄的处理逻辑和所有实现的启发式函数。请
不要在提交的代码中包含用于生成上述大规模算例的脚本,直接使用提供
的数据即可。
2. 一份团队PDF格式报告(约5-10页):
o **引言:**简述团队作业的目标和挑战。
o 优先村庄处理: 详细说明你们是如何定义和实现“优先村庄”逻辑
的,以及选择该方案的理由。
o 大规模算例说明: 简要提及你们使用了文档中提供的固定大规模算
例。
o 启发式函数设计:
对你们设计的每一种新启发式函数,详细描述其:
设计思想和直觉。
具体的计算公式或算法步骤。
对其可接受性 (admissibility) 的分析或讨论。
预期的优点和潜在的缺点。
o 实验设置: 描述你们的实验环境和A*搜索的任何特定参数设置(如
探索上限)。
o 结果与分析:
以表格或图表形式清晰展示不同启发式函数在提供的大规模算
例上的性能指标对比结果。
深入分析和讨论这些结果。例如:哪种启发式表现最好?为什
么?它们在解的质量和搜索效率之间是如何权衡的?启发式函
数的计算复杂度与其带来的搜索效率提升之间有何关系?
o 遇到的挑战与解决方案: 描述团队在完成作业过程中遇到的主要技
术挑战以及你们是如何克服的。
o 总结与展望: 总结你们的主要发现,并对未来可能的研究或改进方
向提出展望。
o 团队成员贡献说明: 简要说明每位团队成员在本次作业中的主要贡
献。
评分标准:
代码实现质量 (40%)
o 正确且有效地实现优先村庄逻辑。
o 清晰、正确地实现至少两种新的启发式函数。
o 代码结构良好,可读性强,能够处理提供的大规模算例。
启发式函数设计与分析 (30%)
o 启发式函数设计的创新性、合理性和有效性。
o 对启发式函数特性(如可接受性)的分析深度。
实验结果与报告质量 (30%)
o 实验设计的合理性和结果呈现的清晰性。
o 对实验结果分析的深度和洞察力。
o 报告的整体结构、逻辑流畅性和书写规范性。
提示与建议:
分工协作: 合理分配团队任务,例如,部分成员专注于优先村庄逻辑的实
现,其他成员专注于不同启发式函数的设计与实现,共同进行测试和报告撰
写。
从小处着手测试启发式: 在将新启发式应用于大规模问题之前,先在较小
规模的算例上进行测试和调试。
文献参考: 可以查阅相关的车辆路径问题 (VRP) 和启发式搜索的文献,
以获取设计更高级启发式函数的灵感(但需确保最终提交的是团队独立思考
和实现的工作)。
代码版本控制: 建议使用Git等工具进行代码版本管理。
最新发布