旅行推销员python

时间:2012-05-03 16:27:22

标签: python traveling-salesman

我正在尝试创建一个python脚本来计算一组学院周围的最短路程。我需要添加一个起点,但是我已经超出了我的信念而无法回归。任何人都可以帮我弄清楚从哪里开始

    from Tkinter import *
import tkMessageBox, tkFileDialog
import json
import re
from urllib import urlopen
import math
class Application(Frame):
    collegelist = []
    collegelist1 = []
    def __init__(self,master=None):
        Frame.__init__(self,master)
        self.pack()
        self.createWidgets()
    def createWidgets(self):
        self.top_frame = Frame(self)
        self.mid_frame = Frame(self)
        self.bot_frame = Frame(self, bg = 'red')
        self.top_frame.pack(side = 'top')
        self.mid_frame.pack(side = 'top')
        self.bot_frame.pack(side = 'top')
        #top frame

        self.label1 = Label(self.top_frame, text = "Your College Choices", bg ='red')
        self.label1.pack(side = 'left', padx='40', pady='0')
        self.label2 = Label(self.top_frame, text = "Your Tour Selections", bg ='green')
        self.label2.pack(side = 'right', padx='40')

        #mid frame
        self.mylist = Listbox(self.mid_frame,
                              bg = 'black',
                              fg = 'gold')
        self.mylist.pack(side='left')
        self.my_button1 = Button(self.mid_frame, text = '>>>', command=self.getlist)
        self.my_button2 = Button(self.mid_frame, text = '<<<', command=self.returnlist)
        self.my_button1.pack(side="left")
        self.my_button2.pack(side="left")
        self.mylist1 = Listbox(self.mid_frame, 
                              selectmode=DISABLED,
                              bg = 'black',
                              fg = 'gold')
        self.mylist1.pack(side='right')
        #bottom frame
        self.openbutton = Button(self.bot_frame, text='Open File', command=self.openfile, fg ='green')
        self.openbutton.pack(side='left')
        self.my_button = Button(self.bot_frame, text = 'Route', fg ='green', command=self.collegeroute)
        self.my_button.pack(side='left')
        self.quit_button = Button(self.bot_frame, text = 'Quit', 
                                  command = self.quit, fg = 'green')
        self.quit_button.pack(side='left')

    def openfile(self):
        filename = tkFileDialog.askopenfilename(title='Choose a file')
        if filename:
            clist = open(filename, "r")
        for line in clist.readlines():
            for i in line.split():
                self.collegelist.append(i)
        for college in self.collegelist:
            self.mylist.insert(1,college)
    def getlist(self):
    # get selected line index
        index = [int(x) for x in self.mylist.curselection()]
        print index
        for i in index:
            seltext = self.mylist.get(i)
            self.mylist.delete(i)
            self.mylist1.insert(1,seltext)
            self.collegelist1.append(seltext)
            print seltext
    def returnlist(self):
    # get selected line index
        index = [int(x) for x in self.mylist1.curselection()]
        for i in index:
            seltext = self.mylist1.get(i)
            self.mylist1.delete(i)
            seltext = seltext.strip()
            seltext = seltext.replace(' ', '')
            self.mylist.insert(0,seltext)
            self.collegelist1.remove(seltext)
    def collegeroute(self):
    # get selected line index
        global tuplist
        self.tuplist =[]
        for college in self.collegelist1:
            f = urlopen('http://graph.facebook.com/%s' % college) #load in the events
            d = json.load(f)
            longitude = d["location"]["longitude"]
            latitude = d["location"]["latitude"]
            name = d['name']
            self.tuplist.append((latitude, longitude))
        cartesian_matrix(self.tuplist)


def cartesian_matrix(coords):
    '''create a distance matrix for the city coords
      that uses straight line distance'''
    matrix={}
    for i,(x1,y1) in enumerate(coords):
        for j,(x2,y2) in enumerate(coords):
            dx,dy=x1-x2,y1-y2
            dist=math.sqrt(dx*dx + dy*dy)
            matrix[i,j]=dist
        tour_length(matrix,collegelist1)
        return matrix
def tour_length(matrix,tour):
    total=0
    num_cities=len(tour)
    print tour
    print num_cities
    for i in range(num_cities):
        j=(i+1)%num_cities
        city_i=tour[i]
        city_j=tour[j]
        total+=matrix[city_i,city_j]
    print total
def getRad(x):
    return float(x) * (math.pi/180.0)
def main():
    app = Application()
    app.master.title("My Application")
    app.mainloop()

if __name__ == "__main__":
    main()

无法让tour_length工作

2 个答案:

答案 0 :(得分:0)

  

无法让tour_length工作

我看到tour_length唯一明显的问题是你没有返回结果。最后添加以下内容:

return total

经过仔细检查,以下情况也令人怀疑:

    tour_length(matrix,collegelist1)
    return matrix

首先,它是错误的缩进。其次,你忽略了tour_length的返回值。

错误缩进可能是导致异常的原因(在完全初始化tour_length之前,您正在调用matrix)。

答案 1 :(得分:0)

您正在调用tour_length并从错误的地方返回cartesian_matrix。你只做一行矩阵,然后调用tour_length并返回。