生成tsp实例并对其进行假设测试
opentsp的Python项目详细描述
打开TSP
这个库的目的是尽可能容易地生成和测试tsp实例,并根据假设进行测试,以及使用蛮力解决它们进行比较。
这是我的第一个主要项目,在过去的六个月里学习了python,所以如果你有风格方面的建议,我很想听听。
我们的目标是使这个库更易于使用,请随时通过电子邮件向我发送您认为有帮助的任何功能。
如果你想贡献解决算法的实现,那么我很高兴听到你!目前我已经实现了蛮力和凸壳。不过,我希望在库中包含一长串算法,如christofides和branch and bound。不过,我自己并不具备实现这些目标的知识。
这就是为什么我要把opentsp制作成一个开源库,希望其他发现它有用的人能加入进来。如果您有建议或代码,请在github页面上创建一个pull请求,我会很快将链接放到上面。
开始
使用pip在本地环境中安装opentsp
pip install opentsp
然后,在模块顶部:
from opentsp.objects import Generator
创建TSP实例
要创建包含八个节点的随机tsp实例,请使用控制台:
>>> from opentsp.objects import Generator
>>> gen = Generator()
>>> instance = gen.new_instance(8)
如果要获得与这些示例中相同的值,请使用以下输入:
>>> instance = gen.new_instance(8, source='seed', seed=1234)
要查看这会产生什么效果:
>>> instance
Seed: 1234
Node count: 8
Edge count: 56
Nodes: {1: (47, 83), 2: (38, 53), 3: (76, 24), 4: (15, 49), 5: (23, 26), 6: (30, 43), 7: (30, 26), 8: (58, 92)}
Edges: {1: ((47, 83), (38, 53), None, False, 0, good, 0), 2: ((47, 83), (76, 24), None, False, 0, good, 0), 3:...}
Distance matrix: None
Solve time: None
Results: None
它有一个种子,用于生成随机节点。节点和边的数量不是对象属性,它们来自两个类方法,我发现将这些信息作为打印表示的一部分很方便。
然后显示实际的节点和边、距离矩阵(如果生成)、求解时间(如果强制执行)和结果。
结果是算法的字典,它们的结果作为节点的路径。
这里需要注意的是,边的长度只在第一次需要时计算,并且只计算一次。所以在边上可以看到一个"none"值,因为长度还没有计算出来。稍后我将更详细地介绍边缘类属性。
该实例有一系列方法用于访问tsp问题的不同属性,例如:
- 节点数
>>> instance.num_nodes
8
- 边数
>>> instance.num_edges
56
- x和y值,例如:
>>> instance.x_values
[47, 38, 76, 15, 23, 30, 30, 58]
- 边缘长度:
>>> instance.edge_lengths_as_list
[7.0, 7.0, 12.806248474865697, 12.806248474865697, 14.212670...]
- 最短边:
pip install opentsp
0
- <等><李>
实例也可以解决,目前默认的解决方法是蛮力。
然后,您可以打印实例的结果
字典来查看结果。
pip install opentsp
1
实例可以从多种来源生成,目前这些来源是:
- 随机
将为该实例生成一个随机8位种子,并由此种子生成具有随机值的节点。 - 种子
传入一个整数用作种子。当您想要重现一系列随机实例时,这主要是有帮助的。当传入您自己的种子时,请确保设置source=seed
,否则将忽略您传递的种子。
例如,inst=generate.generator.new_实例(5,source=,seed=123)
- csv
目前,这需要一个csv,它有两列x和y坐标值。最上面一行必须有标题"x"和"y"。
也可以通过matplotlib查看任何实例,请尝试下面的两个命令:
pip install opentsp
2
(以上结果参数中传递的字符串应与实例的实例.results
字典中的键匹配。如果问题在不需要暴力的情况下解决,那么"暴力"键将不存在。然而,"最优解"如果找到解决方案,则始终存在"操作"键。)
假设检验算法示例
下面是一个示例算法,它利用open tsp的特性,根据一个假设生成并测试许多实例:
pip install opentsp
3
此函数将生成多达一百万个实例,对每个实例进行测试,以查看解决方案中是否存在最短边,或者是否在第13行使用if
测试:if shortest_edge in edge路径:
当测试失败时,它显示使用matplotlibem>失败的实例,并突出显示最短边p.view(plot_se=true)
正如您所看到的,在19行代码中,只需几行代码就可以测试一个假设,实际上这几行代码只涉及生成tsp实例并获取其属性。
此外,如上例所示,您可以使用solve=true
作为生成实例的一部分来求解实例。请记住,这很可能是一个强力的解决方案,因此,如果不在功能强大的超级计算机上运行代码,尝试在20节点的问题上执行此操作将需要相当长的时间。
使用自己的算法
若要使用自己的算法,请使用适当的名称定义函数,并将实例
作为参数。
pip install opentsp
4
在函数中编写算法。
然后,在函数中,您可以传入正在使用的实例,并使用它的任何属性或属性。
例如,在我的蛮力算法中:
pip install opentsp
5
要查看完整的蛮力算法,请查看github repo中的solvers
类。
课程概述
节点
用于定义节点的基本点类型类。
我把tsp中的点称为"节点",而不是"城市"。城市对我来说太特殊了,它也可以是城镇,或者是猫,真的。我更喜欢更抽象的"节点"。
必要参数:x,y
边
将边定义为具有两个节点和一个长度。这两个节点固有地限制了长度。
必要参数:节点1,节点2
路径
路径是一系列节点,有方法来确定路径的长度等。
必要参数:节点对象列表
每个实例本质上都是节点、边和算法结果的容器。 必要参数:无
这个类并不是直接创建的,因为这需要很多代码,特别是生成边的代码,如果必须编写所有这些代码,它将破坏这个库的整个目的。因此, 包含创建实例的主要方法- 包含解决实例的方法。实例
生成器
类用于通过包含所有这些功能的new_instance
方法创建实例。发电机
新建实例
new_instance
的唯一必需参数是节点数。在这种情况下,默认值是生成随机节点。解算器
推荐PyPI第三方库