문제

여기에 내가 하려 비교는 두 가지 간단한 가능한 알고리즘 해결,대칭 여행 salesman 문제,최적의 솔루션을 찾을 지원하지 않는 휴리스틱.을 나타(또는 그냥 참조)의 코드는 모두 알고리즘을 더 나은 지정합 구현 정보가 될 수 있는 관련 대한 비교입니다.내가 쓴 나 F#코드 를 해결하의 도래 코드 일 18 1 부.그것은 BFS 에 적응하는 최적의 솔루션을 찾을 수 있중 그래프(마지막 버전은 후 편집되는 원래 질문이었고 여기에 게시하고,그러나,이미 말했듯이,이 류의 상세정보).는 잘 동작하는 것 같으로 다른 간단한 데모를 입력,그것을 모든 기기에서 통과 함께 영원히 다음과 같은 입력이 있습니다.

#################
#i.G..c...e..H.p#
########.########
#j.A..b...f..D.o#
########@########
#k.E..a...g..B.n#
########.########
#l.F..d...h..C.m#
#################

그것의 목록을 나타내는 소문자 char 정점을 대문자로 제한된 선행하고 가장자리를 가중치에 의해 다른 점이 있습니다.그래서 여기에서 내가 찾는 것은 비교 기반으로 시간 복잡도 알고리즘에 관한 분석 경우에는 모서리의 수가 증가,고정 수의 꼭지점입니다.가 참조 솔루션에서는 파이썬 는 정확하고 빠른하지만,내가 실패하시는 근본적인 차이를 두고리즘 뒤에,다른 작은 코드의 차이점(도 있기 때문에 언어가 다르다).

해봤으로 재귀 vs 큐, 으로, 트리 vs 그리드/지도 (나 github 기록)하지만 행운과 함께 지금까지.

주요 부분의 코드는 아래에 설명되어 있습니다.그것은 가을해야에서 폭넓은 첫 번째 검색(BFS)알고리즘의 구현 세부 사항을 보고 아래만을 완료하는 이론적 설명이 주어진 이미하기 때문에,표준 BFS 에 적응하고있다에 여러 대상,가중 가장자리 및 임시 나무 가지치기.

여기에 내가 어떻게 생산하여,하나의 단계는 정교한 솔루션입니다.

1 single step receives as input which is the move index i
2 then it updates the distance of the current solution draft by summing the distance to the vertex i
3 it updates the current position as of vertex i
4 it also updates the list of predecessors by including vertex i
5 it computes the new tree of reachable vertices starting from the `fullGrid` and taking into account the newly updated list of predecessors

이것은 제한된 버전의 술 각 정점을 가질 수 있습으로 제약 조건의 목록이 됩니다.

fullGrid 가 포함되어 있을 것으로 예상되는 매트릭스의 거리와 그것은 나에게 잘 보이는 측면에서의 값을 포함 때 나는 디버그습니다.포장 솔버는 단순히 재귀 또는 큐반 버전의 BFS.또,내가 관심이 없는 프로그래밍 내에서 이해하고,개념적 수준에서는 이유는 기본 알고리즘에는 해당하지 않습니다 분명히 온순한 입력된 경우("는"16 노드).

Start by receiving the graph topology and starting point
    Define a mindistance variable
    and a list of completed solutions, initially empty

    Start looping at the queue of partial solutions
        So a single partial solution is dequeued
        It computes possible vertices based on current predecessors
        Check if nothing remains and adds it to the completed alternatives updating mindistance
        Otherwise loop as in classical BFS
        For all possible moves = reachable vertices

                For each one applies above said single step
                If done updates mindistance and completed alternatives 
                Otherwise enqueue such partial solution 


    Finally select the min alternative by distance.
도움이 되었습니까?

해결책

내가 찾는 개념적 문제입니다.에는 대금의 종류를 검색할 때 최적화가 필요하기 때문에 길이의 큐 에서 성장 중요한 속도를 가지고,당신을 추적 항목입니다.

의 목표는 추가하지 않은 다른 항목 큐 때 이미 존재하는 a 더 나은 항목 다.

분은 코드만을 명확히하는 개념입니다.

내 경우에는 방문한 지도

let mutable visited = Map.empty<char,((char list) * int) list>

고 나의 대기열을 넣는 더 나은 항목:

if visited.ContainsKey(solutionNext.tree.area) 
    && (visited.[solutionNext.tree.area] 
        |> List.exists (
            fun (keys, distance) -> 
            distance <= solutionNext.tree.distance
            && solutionNext.keys |> List.forall(fun k -> keys |> List.contains k)
        ))
then () 
else 
    solution_queue <- enqueue solution_queue solutionNext
    let previous = if visited.ContainsKey(solutionNext.tree.area) then visited.[solutionNext.tree.area] else []
    visited <- Map.add solutionNext.tree.area ((solutionNext.keys, solutionNext.tree.distance) :: previous)  visited

고 건너뛰거

while (MyQueue.length solution_queue > 0) do
    let solution = dequeue &solution_queue
    if visited.ContainsKey(solution.tree.area) 
        && (visited.[solution.tree.area] 
            |> List.exists (
                fun (keys, distance) -> 
                distance < solution.tree.distance
                && solution.keys |> List.forall(fun k -> keys |> List.contains k)
            ))
    then () else

비용 함수

이론적인 관점에서,BFS 다는 것을 보장할 수 있습니다 첫째 솔루션 반환되는 것으로 는 경우에만 가정할 수 있습니다 모든 행동은 비용 1.을 줄일 수 있는 위의 예에는,그러나 제일 적합 남 그래프비용 함수 은 represeted 의 가장자리에 의해 다른 길이.가 진짜 비용이 기능 가장 짧은 경로를 찾기가 더 많은 참여:이 경우 여기에.특히 때문에 당신은 또한 최적화 공간 복잡도 (이전 절을 보십시오)을 피하는 최악의 경우 시간의 복잡성 $O(b^d)$, 으로, $b$ 는 분기 요인과 $d$ 깊이의 첫 번째 솔루션입니다.당신이 설명하는 시나리오 $d$ 은 잘 알려진에 시작(수 키의 미로에서)는 동안 가장자리의 경우는 당신이 언급에 의해 얻어진 크 $b$ (수의 횡단은 미로의)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top