繁体   English   中英

为什么会出现此openopt索引错误?

[英]Why am I getting this openopt index error?

一,错误:

Traceback (most recent call last):
  File "tsp_solver.py", line 57, in <module>
    solvetTSP(inputData)
NameError: name 'solvetTSP' is not defined
new-host:tsp Jonathan$ python tsp_solver.py data/tsp_51_1
Traceback (most recent call last):
  File "tsp_solver.py", line 57, in <module>
    solveTSP(inputData)
  File "tsp_solver.py", line 36, in solveTSP
    r = p.solve('sa')
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-    packages/openopt-0.506-py2.7.egg/openopt/kernel/TSP.py", line 150, in solve
    EdgesCoords.append((node, Out_nodes[i]))
IndexError: index 1 is out of bounds for axis 0 with size 1

我真的不知道为什么我得到这个错误。 我这里有一个非常基本的OpenOpt TSP求解程序实例,它完全不起作用。 我正在使用networkx绘制图形,并仅以权重=距离逐边添加。 当我将TSP实例传递给求解器时,会发生错误,但我显然不知道为什么。 这是我的代码,任何帮助将不胜感激。

from openopt import *
import networkx as nx
import math

def length(point1, point2):
    return math.sqrt((point1[0] - point2[0])**2 + (point1[1] - point2[1])**2)

def solveTSP(inputData):
    inputData = inputData.split('\n')
    inputData.pop(len(inputData) - 1)

    N = int(inputData.pop(0))
    points = []


    for i in inputData:
        point = i.split(" ")
        point = [float(x) for x in point]
        point = tuple(point)
        points.append(point)


    G = nx.Graph()
    prev_point = None

    for cur_point in points:
        assert(len(cur_point) == 2)
        if prev_point != None:
            a = length(cur_point, prev_point)
            G.add_edge(cur_point, prev_point, weight = a)
        else:
            G.add_node(cur_point)
        prev_point = cur_point

    p = TSP(G, objective = 'weight', start = 0)
    r = p.solve('sa')
    r.nodes.pop(len(r.nodes)-1)

    distance = r.ff
    path = r.nodes

    print distance
    print path

import sys

if __name__ == '__main__':
    if len(sys.argv) > 1:
        fileLocation = sys.argv[1].strip()
        inputDataFile = open(fileLocation, 'r')
        inputData = ''.join(inputDataFile.readlines())
        inputDataFile.close()
        solveTSP(inputData)

您的图具有n个节点和n-1条边,而对于TSP图则必须至少具有n条边。 我提出的解决方案具有从最后一点到起点的更多优势:

points = ((1, 2), (3, 4), (5, 6), (9, 10))
G = nx.Graph()
prev_point = None

for i, cur_point in enumerate(points):
    assert(len(cur_point) == 2)
    if i != 0:
        a = length(cur_point, prev_point)
        G.add_edge(i, i-1, weight = a)
    prev_point = cur_point
G.add_edge(0, len(points)-1, weight = length(points[0], points[-1]))

p = TSP(G, objective = 'weight', start = 0)
r = p.solve('sa')
r.nodes.pop(len(r.nodes)-1)

distance = r.ff
path = r.nodes

print distance # 22.627416998
print path # [0, 3, 2, 1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM