Gå til innhold

Regne ut lengste rute mellom 5-10punkt(gps kordinater)


Anbefalte innlegg

Videoannonse
Annonse

regner med du kun kan gå innom et punk en gang? Dette høres ut som enkel graf-teori. Sett opp en vektet graf som beskriver problemet; og siden det er så få punkter kan man da gjøre et enkelt breddeførst eller dybdeførst søk gjennom grafen og ta den veien som var lengst. Vil selv anbefale dybde-først-søk her.

 

http://en.wikipedia.org/wiki/Depth-first_search

http://www.algolist.net/Algorithms/Graph/Undirected/Depth-first_search

 

Om det hadde vært flere punkter ville andre graf-algoritmer vært bedre.

 

Jeg ser du la dette i .NET delen, men du får gjøre den delen selv. Kan gi deg et eksempel skrevet i python.

La oss forutsette at du har følgende punkter hvor tallet i mellom dem er avstanden mellom punktene. Dette kan beskrive f.eks. mulige kjøreruter mellom forskjellige byer.

200px-Prim_Algorithm_0.svg.png

 

Setter opp en nabo-matrise som beskriver denne grafen:

889995.jpeg

 

# -*- coding: cp1252 -*-
matrix = [
[0,7,0,5,0,0,0],
[7,0,8,9,7,0,0],
[0,8,0,0,5,0,0],
[5,9,0,0,15,6,0],
[0,7,5,15,0,8,9],
[0,0,0,6,8,0,11],
[0,0,0,0,9,11,0]]

# Finner den lengste stien fra et gitt startpunkt
def dfs(start):
   fringe = [(start,0,[])]
   longest = ([], -1)
   while len(fringe) > 0:
       node, length, path = fringe.pop()
       if length > longest[1]:
           longest = (path+[node], length)

       neighbours = get_neighbours(node)
       for vertex,distance in neighbours:
           if vertex not in path:
               fringe.append( (vertex, length+distance, path+[node]) )
   return longest

# Gir alle naboene til en gitt node, og avstanden
def get_neighbours(vertex):
   neighbours = list()
   for x in xrange(len(matrix)):
       if x == vertex:
           continue
       if matrix[vertex][x] != 0:
           neighbours.append((x, matrix[vertex][x]))
   return neighbours

def print_path(path):
   for x in xrange(len(path[0])):
       print chr(path[0][x]+65),
       if x < len(path[0])-1:
           print " -> ",
   print
   print "Total length:",path[1]

if __name__ == '__main__':
   longest_path = ([], 0) # ([path], length)

   # Vi prøver alle mulige veier fra alle mulige startpunkter
   for x in xrange(len(matrix)):
       path = dfs(x)
       if path[1] > longest_path[1]:
           longest_path = path
   print_path(longest_path)

 

Output:

C -> B -> A -> D -> E -> G -> F

Total length: 55

Endret av etse
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...