为旅行推销员问题生成地图/图形(Python)

为旅行推销员问题生成地图/图形(Python),python,algorithm,list,Python,Algorithm,List,我将创建两个算法来解决旅行商问题,但首先我要创建一个包含n个节点的图/地图,每个节点都有一个边界。(如果n=100,则为99个边界)。每个节点之间的距离应为1到5之间的随机数 (我正在用python进行此操作) 我的第一个想法是每个节点都有一个列表(最终的地图将是列表中的列表),其中包含到其他节点的距离。 如果有10个节点,那么每个列表中都有9个整数 生成第一个列表后,其他列表将继承相应的距离。 前 下一步是用少一个元素生成一个新列表,将其放在已经存在的值后面,并执行与上面相同的操作(其余节点将

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

(我正在用python进行此操作) 我的第一个想法是每个节点都有一个列表(最终的地图将是列表中的列表),其中包含到其他节点的距离。 如果有10个节点,那么每个列表中都有9个整数

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

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

最终列表将如下所示:

[[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]]

我觉得你想得太多了。只需创建两个循环,首先填充距离当前节点的距离,然后内部循环将它们复制到目标节点

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]]
这种方法至少有几个问题:


  • 您的数据表示非常奇怪,以后的算法实现将更容易实际存储
    nxn
    距离矩阵,其中
    D[i,j]
    将表示“从第i个城市到第j个城市的距离”,这将使
    D[i,i]=0
    。你的表达意思是“从第i个城市到第j个城市的距离,如果
    jn你所说的边界是什么意思?它是一条边吗?”?
    
    [[5, 2, 1, 5], 
     [5, 1, 2, 3], 
     [2, 1, 4, 5], 
     [1, 2, 4, 5], 
     [5, 3, 5, 5]]
    
    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