生成tsp实例并对其进行假设测试

opentsp的Python项目详细描述


打开TSP


这个库的目的是尽可能容易地生成和测试tsp实例,并根据假设进行测试,以及使用蛮力解决它们进行比较。
这是我的第一个主要项目,在过去的六个月里学习了python,所以如果你有风格方面的建议,我很想听听。

我们的目标是使这个库更易于使用,请随时通过电子邮件向我发送您认为有帮助的任何功能。

如果你想贡献解决算法的实现,那么我很高兴听到你!目前我已经实现了蛮力凸壳。不过,我希望在库中包含一长串算法,如christofidesbranch 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
  • xy值,例如:
>>> 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,它有两列xy坐标值。最上面一行必须有标题"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的唯一必需参数是节点数。在这种情况下,默认值是生成随机节点。

解算器

包含解决实例的方法。

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

推荐PyPI第三方库


热门话题
如何在javaswing中使用进度条,同时函数在繁重的进程中工作   SWIG(Java):如何调用带有void*out参数的函数?   java帮助解决算法问题   java,但我不想用try/catch块来包围语句!   可以从java类调用安卓类吗?   java流拆分器实现细节   java组织。莫基托。例外情况。滥用。无效使用MatcherException   java如何显示接收到的字符串?   java为什么这段代码不像JSR133建议的那样进入无限循环?   java BufferedReader readLine()从socket获取数据时冻结   java如何使用html表单发送的XML?   java RxJava与观察者代码的并行执行   我想使用CoreJava基于文本输入动态创建一个jpg图像   java如何在Mockito中模拟注入的bean?   java我的程序突然停止工作,我没有改变我记得的任何东西,现在它给出了第二个错误:javafx。fxml。加载异常   java树集排序错误   java RSA加密解密AES密钥并存储在文件中   Java将变量字符串[]与字符串混合在一个字符串数组中   如何在鼠标移动时重新绘制Java SWT应用程序?