【问题标题】:Generating a map/graph for a traveling salesmanproblem (Python)为旅行商问题生成地图/图形(Python)
【发布时间】:2013-09-06 07:06:19
【问题描述】:

我将创建几个算法来解决旅行商问题,但首先我要创建一个包含 n 个节点的图形/地图,每个节点都有一个边框。 (如果 n=100 则为 99 个边界)。每个节点之间的距离应该是1到5之间的随机数。

(我在 python 中这样做) 我的第一个想法是每个节点都有一个列表(最终地图将是列表中的列表),其中包含与其他节点的距离。 如果有 10 个节点,那么每个列表将有 9 个整数。

生成第一个列表后,其他列表将继承相应的距离。 前任。

A: [5, 5, 3]
B: [5]
C: [5]
D: [3]

下一步是生成一个少一个元素的新列表,将其放在已经存在的值后面并执行与上述相同的操作(其余节点将继承相应的距离)。这将递归完成,直到所有列表都已满。

最终的列表会是这样的:

[[5, 5, 3],
 [5, 2, 1],
 [5, 2, 4],
 [3, 1, 4]

有人可以告诉我应该如何实施这个吗? 或者,如果有更简单的方法。谢谢!

随机导入

def main():
    graph_map = []
    max_nodes = 10
    i = 0
    generate_map(graph_map, max_nodes, i)
    print graph_map

def generate_map(graph_map, max, i):
    temp_list = []
    for j in range(max-1):
        temp_list.append(random.randint(1, 5))
    if i > 0:
        graph_map[i].append(temp_list)
    else:
        graph_map.append(temp_list)

    for j in range(1, max):
        graph_map.append([temp_list[j-1]])





if __name__ == '__main__':
    main()

这段代码将为我提供我想要的示例输出:

[[4, 5, 5, 2, 1, 3, 3, 3, 2], [4], [5], [5], [2], [1], [3], [3], [3], [2]]

【问题讨论】:

  • 边框是什么意思?是边缘吗?

标签: python algorithm list


【解决方案1】:

我认为你想多了。简单地做两个循环,首先填充与当前节点的距离,内循环将它们复制到目标节点

import random

def main():
    graph_map = []
    max_nodes = 5
    for i in range(max_nodes):
        graph_map.append([])
    for i in range(max_nodes):
        for j in range(max_nodes-1-i):
            d = random.randint(1,5)
            graph_map[i].append(d) 
            graph_map[i+j+1].append(d)    

    print graph_map

if __name__ == '__main__':
    main()

打印

[[5, 2, 1, 5], 
 [5, 1, 2, 3], 
 [2, 1, 4, 5], 
 [1, 2, 4, 5], 
 [5, 3, 5, 5]]

这种方法至少存在一些问题:

  1. 你的数据表示很奇怪,后面的算法实现会更容易实际存储n x n距离矩阵,其中D[i,j]表示“从第i个城市到第j个城市的距离”,即只会有D[i,i]=0。您的表示意味着“如果j<i,则从第i个城市到第j个城市的距离,否则到j-1'th
  2. 这(在大多数情况下)将不会生成平面图,这意味着您不能将n 点放置在平面上,它们之间的距离如此之大。所以数据是相当“不切实际的”,许多启发式 TSP 解决方案都假设平面数据(或三角不等式)。更好的方法是在平面上生成随机的n 点,然后计算它们的距离。

[0,m]^2 上的平面生成器示例:

import math
import random 
n=5
m=100
def dist(a,b):
    return math.sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 )
points = [ [random.randint(0,m), random.randint(0,m) ] for i in range(n) ]
D = [ [ dist( points[i], points[j] ) for i in range(n) ] for j in range(n) ]
print points
print D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2017-07-21
    • 2020-07-15
    • 2021-07-09
    • 2021-08-27
    • 2018-03-26
    相关资源
    最近更新 更多