我目前正致力于以旅行商问题为中心的研究。更准确地说,我使用EUC_2D边缘权重类型处理样本数据。如下所示:
1 11003.611100 42102.500000
2 11108.611100 42373.888900
3 11133.333300 42885.833300
我可以制作巡演订单。例如,2-3-1。
我希望能够创建一些表示给定问题的点集的简单图形,然后创建一个顶部游览的点集。任何人都可以推荐一种实现这一目标的简单方法 - 我应该考虑使用哪种软件来实现这一目标。
由于
答案 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()
输出:
此代码基于以下格式的数据:
形状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%(可以看到右边的次优部分发生了一些交叉):
完整代码,包括假TSP数据和解决可用here。
答案 1 :(得分:0)
我将推荐Baby X.(它是我自己的窗口系统)。
它是一个可在Linux或MS Windows上运行的Windows系统,专为此类问题而设计 - 使用一些简单的图形快速对程序进行原型设计。
Baby X暴露了rgba表面。然后使用您自己的例程,Baby X基本例程(线和多边形)或Baby X图形上下文(完全成熟的基于Bezier的2D图形)绘制到缓冲区。设置起来非常快。您显然必须将图形缩放到像素空间,绘制城市的符号,然后在它们之间绘制线条来表示游览。
https://github.com/MalcolmMcLean/babyx
然而,有几个图形系统。您只需选择在硬件平台上运行的那个。