2017年数学建模国赛D题(巡检路径规划)优秀论文.doc

本博客下载链接包含修改的word版本, 可免费下载阅览学习, 也可作为数学建模相关课程作业修改上交:

链接:https://pan.baidu.com/s/1HxzDk3q0p6y2xpuJyxPgvw?pwd=qtnc

提取码:qtnc

本文主要研究化工厂巡检路径规划与排班问题。为提高巡检效率,优化资源分配,需制定科学合理的巡检路径。通过对化工厂巡检工作内容和特点分析,并制定相应的目标体系及约束条件,建立了最短路径的多目标规划模型,使用lingo 和 Excel 求解,得到巡检人员最少的优化方案。

针对问题一:以每班需巡检人员尽可能少,工作量尽可能平衡为目标,以固时上班、无休息时间、每条线路周期不超过 35min、每天三班制、每班 8 小时左右为约束,建立多目标规划模型,用图论法求解。先考虑分区,以线路周期内包含尽可能多巡检点与最短路径为目标,将所给巡检点连通图分组,得到共 5 条巡检路线,最少需 5 名巡检人员,如路线:

22-21-4-2-1-3-6-14-21

(具体巡检路线见正文图 6,巡检时间表见附录表 1、2、3)。为使每条路线在一段时间内的总行走时间均衡,引入均衡度,越小越合理。该模型均衡度为 0.35 较大,为满足要求,故采用五线三班轮倒制。考虑到该模型在巡检人员每个周期的回程中浪费大量时间,所以不分区处理,利用最短路径和巡检耗时,得到将巡检点全部巡检的最少用时。用巡检一周的最少用时与 35min 的比值,得到最少巡检人数 4 名,该优化模型在固时上班条件下,第二班次巡检人员无法在指定时间到达指定点,无法形成班次循环,但可在错时上班条件下应用。

针对问题二:在第一问模型基础上,新增每 2 小时左右巡检人员休息 5-10min、在中午 12 时和下午 6 时需进餐 30 分钟的约束,经分析,巡检人员每 2 小时的休息时间,可通过减少巡检周期大于 35min 的巡检点巡检次数得到,若线路中无大于 35min 周期的巡检点或压缩时间太少,可将线路分段并增加巡检人员。最终得到共 6 条路线,最少需要 6 名巡检人员,如路线:

22-21-4-2-1-2-3-6-14-21。

(具体巡检路线见正文图 8,巡检时间表见附录表 4、5、6)为使进餐时能正常工作,给需进餐的班次增加人员,轮换进餐,维持正常巡检。经分析,将两次进餐时间段都放入同一班次的上班时间内,可最大减少人力资源浪费,且 6 条巡检路线中有一条可在进餐后仍在指定时间到达指定地点。因此,得到第一班次共需11人,第二、三班次分别需 6 人。该模型均衡度较大,所以采用三班轮倒制。

针对问题三:对于问题一,在错时上班条件下,可利用问题一中建立的优化模型直接进行求解,得到巡检路线 1 条,共需巡检人员 4 人。与问题一结果比较, 减少了人力资源浪费。对于问题二,在错时上班条件下,调整各班次上下班时间即可减少人力资源浪费,可得到每班次巡检人员 6 人,且线路不变,仍为 6 条巡检线路。与问题二结果比较,减少了资源浪费。

关键词:多目标规划 巡检路径 最短路径 图论法 均衡度

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2017年全国大学生数学建模竞赛D巡检线路排班问,以下是详细答案和论文。 一、目描述 在一个城市中,有 $n$ 个巡检点,需要巡检员进行巡视。已知每个巡检点的巡视时间和需要巡视的频次,以及每个巡检员的工作时间和数量。假设每个巡视员每天工作时间固定为 $8$ 小时。 请设计一种合理的巡检线路,并安排巡视员的工作时间表,使得所有巡检点均能按照频次进行巡视,且每个巡视员的工作时间不超过 $8$ 小时。其中,巡检线路的设计应当尽可能地短。 二、解思路 本需要设计一种巡检线路,并将巡检员分配到各个巡检点上,使得所有巡检点能够按照频次进行巡视,并且每个巡视员的工作时间不超过 $8$ 小时。 为了最小化巡检线路的长度,我们可以采用贪心算法。具体地,我们可以将巡检点按照优先级排序,然后依次将巡检点加入巡检线路中,直到所有巡检点都被加入为止。 在巡检员分配方面,我们可以采用动态规划算法。具体地,我们将所有巡检点作为背包中的物品集合,将所有可用的巡检员作为背包的容量限制。然后,使用0/1背包算法求解背包问,得到一个最优的巡检任务分配方案。最后,根据巡检任务分配方案,将巡检员分配到各个巡检点,完成排班问的求解。 三、论文 以下是本的论文,供参考。 [PDF] 2017全国大学生数学建模竞赛D巡检线路排班问 四、代码实现 以下是 Python 实现本的代码,供参考。 ```python import heapq def schedule(patrol_points, patrol_staff): n = len(patrol_points) # 巡检点数量 m = len(patrol_staff) # 巡检人员数量 dp = [[0] * (m+1) for _ in range(n+1)] # 初始化动态规划表 # 计算巡检任务量 patrol_tasks = [sum(p) for p in patrol_points] # 0/1背包算法 for i in range(1, n+1): for j in range(1, m+1): if patrol_tasks[i-1] <= patrol_staff[j-1]: dp[i][j] = max(dp[i-1][j], dp[i-1][j-1] + patrol_tasks[i-1]) else: dp[i][j] = dp[i-1][j] # 回溯得到最优巡检任务分配方案 schedule = [0] * n j = m for i in range(n, 0, -1): if dp[i][j] > dp[i-1][j]: schedule[i-1] = 1 j -= 1 # 返回最优巡检任务分配方案 return schedule def shortest_path(graph, start): """ Dijkstra's algorithm for shortest path. """ heap = [(0, start)] visited = set() dist = {start: 0} while heap: (d, u) = heapq.heappop(heap) if u in visited: continue visited.add(u) for v, w in graph[u].items(): if v in visited: continue vw = d + w if v not in dist or vw < dist[v]: dist[v] = vw heapq.heappush(heap, (vw, v)) return dist def get_schedule(patrol_points, patrol_staff): n = len(patrol_points) m = len(patrol_staff) schedule_list = [] for i in range(n): priority = sum(patrol_points[i]) schedule_list.append((priority, i)) schedule_list.sort(reverse=True) schedules = [] for _, i in schedule_list: point = patrol_points[i] staff = schedule(patrol_points, patrol_staff) if staff[i] == 0: for j in range(m): if patrol_staff[j] >= sum(point) and staff[j] == 0: staff[j] = 1 break schedules.append((i, staff)) patrol_staff = [patrol_staff[j] - point[j] if staff[j] else patrol_staff[j] for j in range(m)] return schedules def solve(patrol_points, patrol_staff, graph): schedules = get_schedule(patrol_points, patrol_staff) paths = [] for i, staff in schedules: dist = shortest_path(graph, i) path = [i] while len(path) < len(patrol_points): next_point = min((p for p in patrol_points if p not in path), key=lambda p: dist[p]) path.append(next_point) paths.append(path) return paths # 测试数据 patrol_points = [ [1, 0, 1, 0, 0], [0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [0, 0, 1, 0, 1], [0, 0, 0, 1, 0] ] patrol_staff = [8, 8, 8, 8, 8] graph = { 0: {1: 2, 2: 1, 4: 3}, 1: {0: 2, 2: 3, 3: 4}, 2: {0: 1, 1: 3, 3: 1, 4: 2}, 3: {1: 4, 2: 1, 5: 5}, 4: {0: 3, 2: 2, 5: 3}, 5: {3: 5, 4: 3} } paths = solve(patrol_points, patrol_staff, graph) print(paths) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值