그래프 검색과 트리 검색의 차이점은 무엇입니까?
인공 지능 에서 DFS, A * 검색과 관련하여 그래프 검색 과 트리 검색 버전 의 차이점은 무엇입니까?
기존 답변으로 볼 때이 개념에 대해 많은 혼란이있는 것입니다.
문제는 항상 그래프
트리 검색과 그래프 검색의 차이는 문제 그래프가 트리인지 일반 그래프인지 근거하지 않습니다. 항상 일반적인 그래프를 다루고 가정합니다. 차이점은 그래프를 검색하는 데 사용되는 순회 패턴 ( 그래프 모양 또는 나무 모양 일 수 있음)에 있습니다.
나무 모양의 문제를 처리하는 경우 두 알고리즘 변형 모두 동일한 결과로 이어집니다. 따라서 더 간단한 트리 검색 변형을 선택할 수 있습니다.
그래프와 트리 검색의 차이점
기본 그래프 검색 알고리즘은 다음과 가변합니다. 시작 노드 start
, 방향 간선 successors
및 goal
루프 조건에 사용되는 사양. open
현재 고려중인 메모리에있는 노드를 공개 목록 . 다음 의사 코드는 모든 것을 말하지 않습니다.
나무 검색
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 * 그래프 검색 알고리즘은 일관된 (또는 "단조") 휴리스틱 (허용 성보다 더 강력한 조건 ) 과 함께 사용할 때만이 보장을합니다 .
(2) 의사 코드의 결함
단순화를 위해 제시된 코드는 다음을 수행하지 않습니다.
- 실패한 검색 처리, 즉 솔루션을 찾을 수있는 경우에만 작동합니다.
트리는 그래프의 특별한 경우이므로 일반 그래프에서 작동하는 모든 것이 트리에서 작동합니다. 트리는 각 노드 쌍 사이에 정확히 하나의 경로가있는 그래프입니다. 이것은 이전 답변에서 알 수 있듯이 어떤 주기도 포함하지 않지만주기가없는 방향성 그래프 (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는 이미 방문되었으므로 무시됩니다. 멋있는!
하지만 나무는 어떻습니까? 잘 나무 알고리즘은 방문한 노드를 방문한 것으로 표시하지 않지만 나무에는 순환이 없습니다. 어떻게 무한 루프에 빠질까요?
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가 있기 때문에 모든 노드가 구별되지는 않습니다.
마지막으로 동일한 노드를 두 번 탐색하는 것을 방지하기 위해 트리 검색 알고리즘을 구현할 수 있습니다. 그러나 그것은 결과를 가져옵니다.
'IT' 카테고리의 다른 글
CSS 나는 div가 모든 것 위에 있기를 원합니다. (0) | 2020.09.05 |
---|---|
Junit 단위 테스트 용 JVM 매개 변수를 설정하는 방법은 무엇입니까? (0) | 2020.09.05 |
Java 한 번에 (또는 가장 쉬운 방법으로) 여러 개의 여러 개의 하위 계층 (0) | 2020.09.05 |
패키지 복원을 사용할 때 .nuget 폴더의 nuget.exe를 자동으로 업데이트하는 방법이? (0) | 2020.09.05 |
정규식 :? : 표기법 (물음표 및 콜론 표기법) (0) | 2020.09.05 |