인공 지능 에서 DFS, A * 검색과 관련하여 그래프 검색 과 트리 검색 버전 의 차이점은 무엇입니까 ?
인공 지능 에서 DFS, A * 검색과 관련하여 그래프 검색 과 트리 검색 버전 의 차이점은 무엇입니까 ?
답변:
기존 답변으로 볼 때이 개념에 대해 많은 혼란이있는 것 같습니다.
트리 검색과 그래프 검색의 차이는 문제 그래프가 트리인지 일반 그래프인지에 근거하지 않습니다. 항상 일반적인 그래프를 다루고 있다고 가정합니다. 차이점은 그래프를 검색하는 데 사용되는 순회 패턴 ( 그래프 모양 또는 나무 모양 일 수 있음)에 있습니다.
나무 모양의 문제를 처리하는 경우 두 알고리즘 변형 모두 동일한 결과로 이어집니다. 따라서 더 간단한 트리 검색 변형을 선택할 수 있습니다.
기본 그래프 검색 알고리즘은 다음과 같습니다. 시작 노드 start
, 방향 간선 successors
및 goal
루프 조건에 사용되는 사양. open
현재 고려중인 메모리에있는 노드를 공개 목록 . 다음 의사 코드는 모든 측면에서 정확하지 않습니다 (2).
open <- []
next <- start
while next is not goal {
add all successors of next to open
next <- select one node from open
remove next from open
}
return next
구현 방법에 따라 select from open
깊이 우선 검색 (DFS) (최신 요소 선택), 폭 우선 검색 (BFS) (가장 오래된 요소 선택) 또는 균일 비용 검색 (가장 낮은 경로 비용으로 요소 선택)과 같은 다양한 검색 알고리즘 변형을 얻을 수 있습니다. ), 가장 낮은 비용과 경험적 가치를 가진 노드를 선택하여 인기있는 A-star 검색 등 .
위에서 언급 한 알고리즘을 실제로 트리 검색 이라고 합니다 . 시작 상태에서 루팅되는 경로가 여러 개있는 경우 기본 문제 그래프의 상태를 여러 번 방문합니다. 상태가 방향성 루프에 있으면 무한한 횟수로 상태를 방문하는 것도 가능합니다. 그러나 각 방문은 검색 알고리즘에 의해 생성 된 트리 의 다른 노드 에 해당합니다. 이 명백한 비 효율성은 나중에 설명하는 것처럼 때때로 원합니다.
우리가 보았 듯이 트리 검색은 상태를 여러 번 방문 할 수 있습니다. 따라서이 상태 이후에 발견 된 "하위 트리"를 여러 번 탐색 할 것입니다. 비용이 많이들 수 있습니다. 그래프 검색은 닫힌 목록 에서 방문한 모든 상태를 추적하여이 문제를 해결 합니다 . 새로 찾은 후속 작업 next
이 이미 알려진 경우 공개 목록에 삽입되지 않습니다.
open <- []
closed <- []
next <- start
while next is not goal {
add next to closed
add all successors of next to open, which are not in closed
remove next from open
next <- select from open
}
return next
그래프 검색은 모든 방문 상태를 추적하기 때문에 더 많은 메모리가 필요합니다. 이것은 더 작은 공개 목록으로 보상 될 수 있으며, 검색 효율성이 향상됩니다.
일부 구현 방법은 select
최적의 솔루션을 반환하도록 보장 할 수 있습니다. 즉, 최단 경로 또는 최소 비용 의 경로 (가장자리에 비용이 추가 된 그래프의 경우). 이것은 기본적으로 비용이 증가하는 순서로 노드가 확장 될 때마다 또는 비용이 0이 아닌 양의 상수 일 때 유지됩니다. 이러한 종류의 선택을 구현하는 일반적인 알고리즘은 균일 비용 검색 또는 단계 비용이 동일한 경우 BFS 또는 IDDFS 입니다. IDDFS는 BFS의 공격적인 메모리 소비를 방지하며 일반적으로 단계 크기가 일정 할 때 정보가없는 검색 (무차별 대입)에 권장됩니다.
또한 (매우 인기있는) A * 트리 검색 알고리즘은 허용 가능한 휴리스틱 과 함께 사용할 때 최적의 솔루션을 제공합니다 . 그러나 A * 그래프 검색 알고리즘은 일관된 (또는 "단조") 휴리스틱 (허용 성보다 더 강력한 조건 ) 과 함께 사용할 때만이 보장을합니다 .
단순화를 위해 제시된 코드는 다음을 수행하지 않습니다.
state
또는 node
의 꼭지점에 더 적합하다 기초 순회 그래프 달리 문맥에 따라, 문제 그래프. 그러나 state
문제 그래프 정점과 node
순회 그래프에 사용하면 답의 명확성을 확실히 향상시킬 수 있습니다. 곧 다시 써보도록하겠습니다. 감사합니다.
트리는 그래프의 특별한 경우이므로 일반 그래프에서 작동하는 모든 것이 트리에서 작동합니다. 트리는 각 노드 쌍 사이에 정확히 하나의 경로가있는 그래프입니다. 이것은 이전 답변에서 알 수 있듯이 어떤 순환도 포함하지 않지만 순환이없는 방향성 그래프 (DAG, 방향성 비순환 그래프)는 반드시 트리가 아니라는 것을 의미합니다.
그러나 그래프에 몇 가지 제한 사항이 있다는 것을 알고있는 경우 (예 : 트리 또는 DAG) 일반적으로 제한되지 않은 그래프보다 더 효율적인 검색 알고리즘을 찾을 수 있습니다. 예를 들어, A * 또는 휴리스틱이 아닌 "Dijkstra의 알고리즘"을 트리 (어쨌든 선택할 경로가 하나 뿐이며 DFS 또는 BFS에서 찾을 수 있음)에서 사용하는 것은 의미가 없습니다. DAG (토폴로지 정렬에서 얻은 순서대로 정점을 고려하여 최적의 경로를 찾을 수 있음)
방향성이 대 지시에 관해서는 무향 그래프는 관한 하나의 엣지 (링크 전환)이 있으면 규칙 "다음 즉 케이스의 특별한 경우이다 U 에 브이 에서 에지도 존재 V 에 유 .
업데이트 : 그래프 자체의 구조가 아닌 검색 의 순회 패턴에 관심이 있다면 이것은 답이 아닙니다. 예를 들어 @ziggystar의 답변을 참조하십시오.
그래프와 트리의 유일한 차이점은 순환 입니다. 그래프에는주기가 포함될 수 있지만 트리에는 포함될 수 없습니다. 따라서 트리에서 검색 알고리즘을 구현할 때는주기의 존재를 고려할 필요가 없지만 임의의 그래프로 작업 할 때는이를 고려해야합니다. 주기를 처리하지 않으면 알고리즘이 결국 무한 루프 또는 끝없는 재귀에 빠질 수 있습니다.
생각해야 할 또 다른 요점은 다루고있는 그래프의 방향 속성입니다. 대부분의 경우 각 가장자리에서 부모-자식 관계를 나타내는 트리를 다룹니다. DAG (방향성 비순환 그래프)도 유사한 특성을 보여줍니다. 그러나 양방향 그래프는 다릅니다. 양방향 그래프의 각 간선은 두 개의 이웃을 나타냅니다. 따라서 알고리즘 접근 방식은이 두 가지 유형의 그래프에 대해 약간 달라야합니다.
그래프 대 나무
하지만 AI Graph-search vs Tree-search의 경우
그래프 검색에는 알고리즘이 새 노드를 탐색하고 방문한 것으로 표시 할 때마다 "사용 된 알고리즘에 관계없이"알고리즘이 일반적으로 현재 노드에서 도달 할 수있는 다른 모든 노드를 탐색하는 좋은 속성이 있습니다.
예를 들어 3 개의 정점 AB와 C가있는 다음 그래프를 고려하고 다음 모서리를 고려하십시오.
AB, BC, CA, C에서 A 로의 순환이 있습니다.
그리고 DFS가 A에서 시작하면 A는 새로운 상태 B를 생성하고 B는 새로운 상태 C를 생성하지만 C가 탐색되면 알고리즘은 새로운 상태 A를 생성하려고 시도하지만 A는 이미 방문되었으므로 무시됩니다. 멋있는!
하지만 나무는 어떻습니까? well trees 알고리즘은 방문한 노드를 방문한 것으로 표시하지 않지만 나무에는 순환이 없습니다. 어떻게 무한 루프에 빠질까요?
3 개의 정점이있는이 나무를 고려하고 다음 가장자리를 고려하십시오.
A-B-C는 A에 뿌리를두고 아래쪽을 향합니다. 그리고 DFS 알고리즘을 사용하고 있다고 가정 해 봅시다.
A는 새로운 상태 B를 생성하고, B는 두 개의 상태 A와 C를 생성합니다. 트리에는 "탐색 된 경우 방문한 노드 표시"가 없기 때문에 DFS 알고리즘이 A를 다시 탐색하여 새로운 상태 B를 생성하므로 우리는 무한 루프에 들어갑니다.
하지만 뭔가 알아 차리 셨나요? 우리는 방향이 지정되지 않은 가장자리에 대해 작업하고 있습니다. 즉 AB와 BA가 연결되어 있습니다. 물론 이것은주기가 아닙니다. 왜냐하면주기는 꼭지점이 3 이상이어야하고 첫 번째 노드와 마지막 노드를 제외한 모든 꼭지점이 구별된다는 것을 의미하기 때문입니다.
ST A-> B-> A-> B-> A 순환 특성> = 3을 위반하므로 순환이 아닙니다. 그러나 실제로 A-> B-> C-> A는 순환> = 3 개의 개별 노드입니다. 첫 번째 노드와 마지막 노드가 동일합니다.
다시 한 번 트리 가장자리 A-> B-> C-> B-> A를 고려하십시오. 물론 순환이 아닙니다. 두 개의 B가 있기 때문에 모든 노드가 구별되지는 않습니다.
마지막으로 동일한 노드를 두 번 탐색하지 않도록 트리 검색 알고리즘을 구현할 수 있습니다. 그러나 그것은 결과를 가져옵니다.