2016-10-18 3 views
0

Не технический вопрос, просто требующий точки в правильном направлении для моих исследований.Исследовательская помощь: алгоритм поиска траектории

Существуют ли какие-либо модели, которые обращаются со следующей проблемой:

Нахождение маршрута, начиная с X, проходящей через А, В, С в наиболее эффективном порядке. В приведенном ниже случае X, A, C, B - оптимальный путь (12).

Благодаря

+0

Offtopic. Не вопрос программирования. Это теория CS, поэтому попробуйте http://cs.stackexchange.com –

+2

[Проблема с продавцом комьюнити] (https://en.wikipedia.org/wiki/Travelling_salesman_problem) – amit

+0

интересно. Довольно близко к тому, что я ищу, за исключением того, что он возвращается в город происхождения. –

ответ

0

вы можете посмотреть на коммивояжера. Есть много ресурсов для того, как реализовать это, поскольку это очень распространенная проблема программирования. https://en.wikipedia.org/wiki/Travelling_salesman_problem

0

Это реализация Dijkstra's Algorithm в Python:

def find_all_paths(graph, start, end, path=[]): 
    required=('A', 'B', 'C') 
    path = path + [start] 
    if start == end: 
     return [path] 
    if start not in graph: 
     return [] 
    paths = [] 
    for node in graph[start]: 
     if node not in path: 
      newpaths = find_all_paths(graph, node, end, path) 
      for newpath in newpaths: 
       if all(e in newpath for e in required): 
        paths.append(newpath) 
    return paths  

def min_path(graph, start, end): 
    paths=find_all_paths(graph,start,end) 
    mt=10**99 
    mpath=[] 
    print '\tAll paths:',paths 
    for path in paths: 
     t=sum(graph[i][j] for i,j in zip(path,path[1::])) 
     print '\t\tevaluating:',path, t 
     if t<mt: 
      mt=t 
      mpath=path 

    e1=' '.join('{}->{}:{}'.format(i,j,graph[i][j]) for i,j in zip(mpath,mpath[1::])) 
    e2=str(sum(graph[i][j] for i,j in zip(mpath,mpath[1::]))) 
    print 'Best path: '+e1+' Total: '+e2+'\n' 

if __name__ == "__main__": 
    graph = {'X': {'A':5, 'B':8, 'C':10}, 
      'A': {'C':3, 'B':5}, 
      'C': {'A':3, 'B':4}, 
      'B': {'A':5, 'C':4}} 
    min_path(graph,'X','B') 

Печать:

All paths: [['X', 'A', 'C', 'B'], ['X', 'C', 'A', 'B']] 
     evaluating: ['X', 'A', 'C', 'B'] 12 
     evaluating: ['X', 'C', 'A', 'B'] 18 
Best path: X->A:5 A->C:3 C->B:4 Total: 12 

В «Кишки» рекурсивно найти все пути и фильтрации только теми путями, которые посещают искомая узлы ('A', 'B', 'C'). Затем пути суммируются, чтобы найти минимальный расход пути.

Есть, конечно, более эффективный подходит, но трудно быть проще. Вы попросили модель, так что вот работающая реализация.

+0

Это (1) Не отвечает на вопрос (который не спрашивает, как его реализовать) (2) неэффективен (есть значительно более эффективное решение) (3) код без объяснения ответа, который имеет очень мало значения imo. – amit

+0

@amit: Спасибо за отзыв. ОП запросил алгоритм поиска траектории Дейкстры. Это алгоритм Дейкстры. Он не просил * самых эффективных *. - просто модель. Я добавил объяснение, но запись в Википедии по алгоритму Дейкстры значительно лучше, чем кто-то найдет здесь. – dawg

+0

Это не алгоритм Дейкстры, если бы он не решал проблему, которая является TSP, а не указывает на самый короткий путь к точке. – amit

Смежные вопросы