当前位置:   article > 正文

无人机送药问题(用Python求解)_数学建模无人机配送问题

数学建模无人机配送问题

目录

 

        题目

        问题分析

        变量说明

        模型建立

        用python代码实现模型求解


 

题目

c3c045d9dccd4674b6d106cc6d619c40.png

问题分析

这是一个旅行商问题。一架无人机,从起点出发,需要依次经过50个不同的地点,最后返回起点。每个地点分别位于不同的坐标位置,无人机有且仅能经过一次。需要求得最短的遍历路径。

给公司编号为 0,目标依次编号为 1250

距离矩阵eq?%24D%3D%28d_%7Bij%7D%29_%7B51%5Ctimes51%7D%24,其中eq?d_%7Bij%7D表示表示eq?i%2Cj两点的距离,eq?i%2Cj = 0,1,…,50这里D为实对称矩阵。则问题是求一个从点0出发,走遍所有中间点,到达点0的一个最短路径。

变量说明

符号

说明

eq?%24x_i%24

i个地点的x坐标

eq?%24y_i%24

i个地点的y坐标

eq?%24d_%7Bij%7D%24

i个地点与第j个地点的直线距离

eq?%24%5Cpi%20_%7Bi%7D%24

最优路线中经过的第i个城市

模型建立

8d69bde3fed7430ab311a56b87d48eb0.png

用python代码实现模型求解

  1. import numpy as np
  2. import pandas as pd
  3. from scipy import spatial
  4. from matplotlib.ticker import FormatStrFormatter
  5. import matplotlib.pyplot as plt
  6. from sko.GA import GA_TSP
  7. from sko.SA import SA_TSP
  8. from sko.PSO import PSO_TSP
  9. plt.rcParams['font.sans-serif'] = ['SimHei']
  10. plt.rcParams['axes.unicode_minus'] = False
  11. def cal_total_distance(routine):
  12. num_points, = routine.shape
  13. return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])
  14. # 目标函数
  15. num_points = 51 # 地点个数 算上起点总共51个点
  16. data = pd.read_excel("data.xlsx")
  17. df_0 = pd.DataFrame({'x坐标': [0], 'y坐标': [0]})
  18. data = pd.concat([df_0, data], axis=0, ignore_index=True)
  19. points_coordinate = np.zeros((51, 2))
  20. for i in range(0, 51):
  21. points_coordinate[i][0] = data.loc[i][0]
  22. points_coordinate[i][1] = data.loc[i][1]
  23. distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')
  24. # 遗传算法
  25. ga_tsp = GA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=50, max_iter=500, prob_mut=1)
  26. best_points, best_distance = ga_tsp.run()
  27. print('遗传算法求解的结果:')
  28. print('最优路线:', best_points)
  29. print('最短距离', best_distance)
  30. fig, ax = plt.subplots(1, 2)
  31. best_points_ = np.concatenate([best_points, [best_points[0]]])
  32. best_points_coordinate = points_coordinate[best_points_, :]
  33. ax[0].plot(ga_tsp.generation_best_Y)
  34. ax[0].set_xlabel("迭代次数")
  35. ax[0].set_ylabel("距离")
  36. ax[0].set_title("遗传算法最优距离收敛图示")
  37. ax[1].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1],
  38. marker='o', markerfacecolor='b', color='c', linestyle='-')
  39. ax[1].xaxis.set_major_formatter(FormatStrFormatter('%.3f'))
  40. ax[1].yaxis.set_major_formatter(FormatStrFormatter('%.3f'))
  41. ax[1].set_xlabel("x坐标")
  42. ax[1].set_ylabel("y坐标")
  43. ax[1].set_title("遗传算法结果路线图示")
  44. plt.tight_layout()
  45. plt.show()
  46. # 模拟退火算法
  47. sa_tsp = SA_TSP(func=cal_total_distance, x0=range(num_points), T_max=100, T_min=1, L=10 * num_points)
  48. best_points, best_distance = sa_tsp.run()
  49. print('模拟退火算法求解的结果:')
  50. print('最优路线:', best_points)
  51. print('最短距离', best_distance)
  52. fig, ax = plt.subplots(1, 2)
  53. best_points_ = np.concatenate([best_points, [best_points[0]]])
  54. best_points_coordinate = points_coordinate[best_points_, :]
  55. ax[0].plot(sa_tsp.best_y_history)
  56. ax[0].set_xlabel("迭代次数")
  57. ax[0].set_ylabel("距离")
  58. ax[0].set_title("模拟退火算法最优距离收敛图示")
  59. ax[1].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1],
  60. marker='o', markerfacecolor='b', color='c', linestyle='-')
  61. ax[1].xaxis.set_major_formatter(FormatStrFormatter('%.3f'))
  62. ax[1].yaxis.set_major_formatter(FormatStrFormatter('%.3f'))
  63. ax[1].set_xlabel("x坐标")
  64. ax[1].set_ylabel("y坐标")
  65. ax[1].set_title("模拟退火算法结果路线图示")
  66. plt.tight_layout()
  67. plt.show()
  68. # 粒子群算法
  69. pso_tsp = PSO_TSP(func=cal_total_distance, n_dim=num_points, size_pop=200, max_iter=800, w=0.8, c1=0.1, c2=0.1)
  70. best_points, best_distance = pso_tsp.run()
  71. print('粒子群算法求解的结果:')
  72. print('最优路线:', best_points)
  73. print('最短距离', best_distance)
  74. fig, ax = plt.subplots(1, 2)
  75. best_points_ = np.concatenate([best_points, [best_points[0]]])
  76. best_points_coordinate = points_coordinate[best_points_, :]
  77. ax[0].plot(pso_tsp.gbest_y_hist)
  78. ax[0].set_xlabel("迭代次数")
  79. ax[0].set_ylabel("距离")
  80. ax[0].set_title("粒子群算法最优距离收敛图示")
  81. ax[1].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1],
  82. marker='o', markerfacecolor='b', color='c', linestyle='-')
  83. ax[1].xaxis.set_major_formatter(FormatStrFormatter('%.3f'))
  84. ax[1].yaxis.set_major_formatter(FormatStrFormatter('%.3f'))
  85. ax[1].set_xlabel("x坐标")
  86. ax[1].set_ylabel("y坐标")
  87. ax[1].set_title("粒子群算法结果路线图示")
  88. plt.tight_layout()
  89. plt.show()

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/601458
推荐阅读
相关标签
  

闽ICP备14008679号