模拟退火的旅行商问题

satsp的Python项目详细描述


模拟退火的旅行商问题

该软件包利用模拟退火(sa)方法解决了旅行商问题(tsp)。

所需库

  • 努比
  • 熊猫
  • matplotlib
  • 数学

安装

可以使用pip安装satsp包:

pip install satsp

用法

基本用法:

from satsp import solver

cities = [[1, 6.0, 7.0],
          [2, 4.0, 9.0],
	  [3, 7.0, 1.0]]

solver.Solve(cities)
solver.PrintSolution()

城市中的三列表示id、x坐标和y坐标。

高级用法:

solver.Solve(city_list = None, dist_matrix = None, start_temp = None, \
          stop_temp = None, alpha = None, epochs = None, epoch_length = None, \
          epoch_length_factor = 1.00, stopping_count = 100, screen_output = True)

solver.Solve()函数的参数:

city_list:一个n*3矩阵,包含表示n个城市的id、x坐标和y坐标的三列。可以是None

dist_matrix:包含n个城市之间距离的n*n矩阵。如果通过None并通过Nonecity_list,程序将计算城市之间的eclide距离。如果city_listdist_matrix都是None,那么将解决一个包含48个城市的测试实例。

start_temp:SA的初始温度。如果没有通过,程序将使用数据中的小样本估计初始温度。

stop_temp:SA的停止温度。可以是None

alpha:sa的冷却速率。如果None通过,程序将在给定stop_tempepochs时计算alpha。否则alpha设置为0.99。

epochs:sa的epochs数目。算法运行时间的决定因素。程序将在这段时间后终止。如果通过了None,并且给出了stop_tempalpha,则程序将计算历元数。否则,在经过一定数量的时间段后,停止条件将切换为“无改善”,时间段的数量由stopping_count决定。

epoch_length:每个epoch中的迭代次数。默认值为min(100,n*(n-1)/2)。

历元长度因子:历元长度在每个历元处增加的速率。应大于或等于1。默认值为1.00。对于大型实例,建议使用较小的值。

stopping_count:如果没有任何改进,程序将在此后停止的时间段数。只有当用户既不指定总里程数,也不能由程序计算总里程数时,才会激活此停止条件。默认值为100。 屏幕输出:如果设置为^{,将显示sa参数、算法进度和结果。默认值是True

solver提供的其他功能: solver.GetBestDist():返回最佳tsp旅行的总距离 solver.GetBestTour():返回最佳tsp旅游城市列表 solver.PrintBestTour():输出一张画出最佳tsp旅游的图片 solver.PrintConvergence():绘制每个历元结束时距离的收敛性

算法

该软件包实现了求解tsp问题的模拟退火(sa)元启发式算法。算法概述如下:

  1. 生成一个随机的初始巡更,并设置一个初始温度。
  2. 为要执行的迭代设置一个数字,由纪元长度确定。
  3. 在巡演中随机选择两个城市并执行“2-opt”操作,即在两个城市之间反转巡演。
  4. 如果获得距离较短的旅行,请接受新的旅行。否则,以一定的概率接受新的旅行,概率取决于新旧距离和当前温度的差异。
  5. 对2中确定的迭代次数重复3-4次。
  6. 如果满足停止条件,则终止。否则转到7。
  7. 降低温度,重复2-5次。

参考文献

柯克帕特里克、斯科特、C丹尼尔·格拉特和马里奥·P·ve“CCHI。”模拟退火优化〉,《科学》220.4598(1983):671-680。

朴智星、月圆和杨大金。”模拟退火算法中参数设定的系统程序〉,《计算机与运筹学》25.3(1998):207-217。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何运行一个在播放歌曲的同时创建和更改UI的方法?   eclipse错误:无法找到或加载主类Java,因为类文件anme和类名不同?   两个数字相加得到一个值的java算法   java我可以更改字符串吗?   java Hibernate 5.2:以编程方式从其他jar加载映射   java如何访问随机跳转到固定位置的二进制文件   java是解析器实现中文档的功能   Javasocket的两端齐平   java查找将两个非常大的整数之和除以相等块的步骤   java如何在Restlet中调用带超时的异步HTTP客户端   java如何从servlet请求将hashmap传递给jsp。塞塔提布特   java Spring MVC HTTP状态500–内部服务器错误,Servlet。servlet[dispatcher]的init()引发异常   java即使没有alpha通道,如何将PNGFiles加载为ARGB_8888?   java将subscribe的返回类型映射到其他类型   javascript如何在安卓 WebView中启用longpress操作下载图像?   java将字符串作为hashmap值的一部分添加到StringList中   JavaSpringAOP:代表类型声明其他方法或字段   Java将二进制序列转换为字符   java使用ApachePOI获取最后一行值   为什么要在FPS(每秒帧数)跟踪器中添加时间?(爪哇)