为欧几里德TSP实例创建图形

时间:2017-09-30 19:34:00

标签: algorithm plot graphics

我目前正致力于以旅行商问题为中心的研究。更准确地说,我使用EUC_2D边缘权重类型处理样本数据。如下所示:

1 11003.611100 42102.500000
2 11108.611100 42373.888900
3 11133.333300 42885.833300

我可以制作巡演订单。例如,2-3-1。

我希望能够创建一些表示给定问题的点集的简单图形,然后创建一个顶部游览的点集。任何人都可以推荐一种实现这一目标的简单方法 - 我应该考虑使用哪种软件来实现这一目标。

由于

2 个答案:

答案 0 :(得分:1)

只是为了给你一个关于通常的科学绘图工具如何工作的快速演示(假设我理解你的任务正确):

使用python&的绘图代码matplotlib

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, sharex=True, sharey=True)         # Prepare 2 plots
ax[0].set_title('Raw nodes')
ax[1].set_title('Optimized tour')
ax[0].scatter(positions[:, 0], positions[:, 1])             # plot A
ax[1].scatter(positions[:, 0], positions[:, 1])             # plot B
start_node = 0
distance = 0.
for i in range(N):
    start_pos = positions[start_node]
    next_node = np.argmax(x_sol[start_node]) # needed because of MIP-approach used for TSP
    end_pos = positions[next_node]
    ax[1].annotate("",
            xy=start_pos, xycoords='data',
            xytext=end_pos, textcoords='data',
            arrowprops=dict(arrowstyle="->",
                            connectionstyle="arc3"))
    distance += np.linalg.norm(end_pos - start_pos)
    start_node = next_node

textstr = "N nodes: %d\nTotal length: %.3f" % (N, distance)
props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)
ax[1].text(0.05, 0.95, textstr, transform=ax[1].transAxes, fontsize=14, # Textbox
        verticalalignment='top', bbox=props)

plt.tight_layout()
plt.show()

输出:

enter image description here

此代码基于以下格式的数据:

形状positions的二维数组(n_points, n_dimension),如:

[[  4.17022005e-01   7.20324493e-01]
 [  1.14374817e-04   3.02332573e-01]
 [  1.46755891e-01   9.23385948e-02]
 [  1.86260211e-01   3.45560727e-01]
 [  3.96767474e-01   5.38816734e-01]]

2d-array x_sol,这是我们的MIP解决方案标记~1,当我的解决方案之旅中节点x后跟y时,如:

[[  0.00000000e+00   1.00000000e+00  -3.01195977e-11   2.00760084e-11
    2.41495095e-11]
 [ -2.32741108e-11   1.00000000e+00   1.00000000e+00   5.31351363e-12
   -6.12644932e-12]
 [  1.18655962e-11   6.52816609e-12   0.00000000e+00   1.00000000e+00
    1.42473796e-11]
 [ -4.19937042e-12   3.40039727e-11   2.47921345e-12   0.00000000e+00
    1.00000000e+00]
 [  1.00000000e+00  -2.65096995e-11   3.55630808e-12   7.24755899e-12
    1.00000000e+00]]

更大的例子,用MIP-gap = 5%解决;意思是:解决方案保证最多比最佳值差5%(可以看到右边的次优部分发生了一些交叉):

enter image description here

完整代码,包括假TSP数据和解决可用here

答案 1 :(得分:0)

我将推荐Baby X.(它是我自己的窗口系统)。

它是一个可在Linux或MS Windows上运行的Windows系统,专为此类问题而设计 - 使用一些简单的图形快速对程序进行原型设计。

Baby X暴露了rgba表面。然后使用您自己的例程,Baby X基本例程(线和多边形)或Baby X图形上下文(完全成熟的基于Bezier的2D图形)绘制到缓冲区。设置起来非常快。您显然必须将图形缩放到像素空间,绘制城市的符号,然后在它们之间绘制线条来表示游览。

https://github.com/MalcolmMcLean/babyx

然而,有几个图形系统。您只需选择在硬件平台上运行的那个。