logo

A* 인공지능 검색 알고리즘

AI의 A* 검색 알고리즘 소개

A*('A-스타'로 발음)는 인공 지능과 컴퓨터 과학에서 널리 사용되는 강력한 그래프 탐색 및 경로 찾기 알고리즘입니다. 현재 노드에서 목적지 노드까지의 예상 비용을 고려하여 그래프에서 두 노드 사이의 최단 경로를 찾는 데 주로 사용됩니다. 알고리즘의 가장 큰 장점은 Dijkstra 알고리즘과 같은 기존 검색 알고리즘에 비해 더 많은 정보를 바탕으로 그래프를 탐색하여 최적의 경로를 제공할 수 있다는 것입니다.

알고리즘 A*는 Dijkstra 알고리즘과 Greedy Best-First Search라는 두 가지 다른 검색 알고리즘의 장점을 결합합니다. Dijkstra의 알고리즘과 마찬가지로 A*는 발견된 경로가 가능한 한 짧도록 보장하지만 Greedy Best-First Search와 유사한 휴리스틱을 통해 검색을 지시하여 보다 효율적으로 수행합니다. h(n)으로 표시된 휴리스틱 함수는 특정 노드 n에서 대상 노드까지 이동하는 데 드는 비용을 추정합니다.

A*의 주요 아이디어는 두 가지 매개변수를 기반으로 각 노드를 평가하는 것입니다.

언제나 모키토
    g(n):초기 노드에서 노드 n까지 이동하는 데 드는 실제 비용입니다. 이는 노드 n에서 나가는 가장자리 비용의 합을 나타냅니다.h(n):노드 n에서 대상 노드 n까지의 경험적 비용('추정 비용'이라고도 함)입니다. 이 문제별 휴리스틱 기능은 허용 가능해야 합니다. 즉, 목표 달성에 드는 실제 비용을 과대평가하지 않는다는 의미입니다. 노드 n의 평가 함수는 f(n) = g(n) h(n)으로 정의됩니다.

알고리즘 A*는 f(n)의 가장 낮은 값을 기반으로 탐색할 노드를 선택하며, 목표를 달성하기 위해 예상 총 비용이 가장 낮은 노드를 선호합니다. A* 알고리즘은 다음과 같이 작동합니다.

  1. 발견되었지만 탐색되지 않은 노드의 공개 목록을 만듭니다.
  2. 이미 탐색한 노드를 보관할 닫힌 목록을 만듭니다.
  3. 초기 값 g를 사용하여 열린 목록에 시작 노드를 추가합니다.
  4. 열린 목록이 비어 있거나 대상 노드에 도달할 때까지 다음 단계를 반복합니다.
    1. 열린 목록에서 f-값이 가장 작은 노드(즉, 작은 g(n) h(n)를 갖는 노드)를 찾습니다.
    2. 선택한 노드를 열린 목록에서 닫힌 목록으로 이동합니다.
    3. 선택한 노드의 유효한 하위 항목을 모두 만듭니다.
    4. 각 후속 노드에 대해 현재 노드의 g 값과 현재 노드에서 후속 노드로 이동하는 비용의 합으로 g 값을 계산합니다. 더 나은 경로가 발견되면 추적기의 g 값을 업데이트합니다.
    5. 팔로어가 열린 목록에 없으면 계산된 g-값을 추가하고 h-값을 계산합니다. 이미 열려 있는 목록에 있는 경우 새 경로가 더 좋으면 g 값을 업데이트하세요.
    6. 주기를 반복하십시오. 알고리즘 A*는 대상 노드에 도달하거나 열린 목록이 비워지면 종료되어 시작 노드에서 대상 노드까지의 경로가 없음을 나타냅니다. A* 검색 알고리즘은 효율적이고 그래프나 네트워크에서 최적의 경로를 찾을 수 있기 때문에 로봇 공학, 비디오 게임, 네트워크 라우팅, 설계 문제 등 다양한 분야에서 널리 사용됩니다.

그러나 알고리즘이 올바르게 수행되고 최적의 솔루션을 제공하려면 적합하고 수용 가능한 휴리스틱 기능을 선택하는 것이 필수적입니다.

정보 검색 알고리즘

인공지능의 A* 검색 알고리즘의 역사

이는 스탠포드 연구소(현재 SRI International)의 Peter Hart, Nils Nilsson 및 Bertram Raphael에 의해 Dijkstra 알고리즘 및 당시의 기타 검색 알고리즘의 확장으로 개발되었습니다. A*는 1968년에 처음 출판되었으며 인공 지능 및 컴퓨터 과학 커뮤니티에서 그 중요성과 효율성에 대해 빠르게 인정을 받았습니다. 다음은 검색 알고리즘 A*의 역사에서 가장 중요한 이정표에 대한 간략한 개요입니다.

    조기 검색 알고리즘:A* 개발 이전에는 DFS(Depth First Search), BFS(Breadth First Search) 등 다양한 그래프 검색 알고리즘이 존재했습니다. 이러한 알고리즘은 경로를 찾는 데 도움이 되었지만 최적성을 보장하거나 검색을 안내하기 위한 경험적 방법을 고려하지 않았습니다.Dijkstra의 알고리즘:1959년 네덜란드 컴퓨터 과학자 Edsger W. Dijkstra는 음수가 아닌 간선 가중치를 갖는 가중치 그래프에서 최단 경로를 찾는 Dijkstra 알고리즘을 도입했습니다. Dijkstra의 알고리즘은 효율적이었지만, 철저한 특성으로 인해 더 큰 그래프나 큰 그래프에 사용하는 데에는 한계가 있었습니다.정보 검색:지식 기반 검색 알고리즘(휴리스틱 검색이라고도 함)은 예상 비용과 같은 휴리스틱 정보를 통합하여 검색 프로세스를 효율적으로 안내하도록 개발되었습니다. Greedy Best-First Search는 그러한 알고리즘 중 하나이지만 최단 경로를 찾는 최적성을 보장하지는 않습니다.A* 개발:1968년 Peter Hart, Nils Nilsson 및 Bertram Raphael은 Dijkstra 알고리즘과 Greedy Best-First Search를 결합하여 A* 알고리즘을 도입했습니다. A*는 휴리스틱 함수를 사용하여 현재 노드에 도달하는 실제 비용과 결합하여 현재 노드에서 대상 노드까지의 비용을 추정했습니다. 이를 통해 A*는 불필요한 경로를 피하고 최적의 솔루션을 보장하면서 그래프를 보다 의식적으로 탐색할 수 있었습니다.의로움과 완전함:A*의 저자는 특정 조건에서 알고리즘이 완벽하고(해가 있는 경우 항상 솔루션 찾기) 최적(최단 경로 찾기)임을 보여주었습니다.광범위한 채택 및 진행:A*는 효율성으로 인해 AI 및 IT 커뮤니티에서 빠르게 인기를 얻었으며 연구원과 개발자는 A* 알고리즘을 로봇 공학, 비디오 게임, 엔지니어링 및 네트워크 라우팅을 포함한 다양한 분야로 확장하고 적용했습니다. Incremental A* 및 Parallel A*와 같은 A* 알고리즘의 여러 변형 및 최적화가 수년에 걸쳐 제안되었습니다. 오늘날 A* 검색 알고리즘은 여전히 ​​인공지능 및 그래프 탐색에서 기본적이고 널리 사용되는 알고리즘입니다. 다양한 응용 및 연구 분야에서 계속해서 필수적인 역할을 하고 있습니다. 인공 지능에 대한 영향과 경로 찾기 및 최적화 문제에 대한 기여로 인해 지능형 시스템 연구의 초석 알고리즘이 되었습니다.

A* 검색 알고리즘은 인공 지능에서 어떻게 작동합니까?

A*('문자 A'로 발음) 검색 알고리즘은 인공 지능과 컴퓨터 과학에서 인기 있고 널리 사용되는 그래프 탐색 알고리즘입니다. 가중치 그래프에서 시작 노드부터 목표 노드까지의 최단 경로를 찾는 데 사용됩니다. A*는 휴리스틱을 사용하여 검색을 효율적으로 안내하는 정보 검색 알고리즘입니다. 검색 알고리즘 A*는 다음과 같이 작동합니다.

알고리즘은 탐색할 노드를 저장하는 우선순위 큐로 시작합니다. 또한 두 가지 데이터 구조 g(n), 즉 시작 노드에서 노드 n까지의 최단 경로 비용과 h(n), 노드 n에서 대상 노드까지의 추정 비용(휴리스틱)을 인스턴스화합니다. 이는 합리적인 경험적 방법인 경우가 많습니다. 즉, 목표 달성에 드는 실제 비용을 결코 과대평가하지 않는다는 의미입니다. 초기 노드를 우선순위 큐에 넣고 g(n)을 0으로 설정합니다. 우선순위 큐가 비어 있지 않으면 f(n)이 가장 낮은 노드를 우선순위 큐에서 제거합니다. f(n) = g(n) h(n). 삭제된 노드가 대상 노드이면 알고리즘이 종료되고 경로를 찾습니다. 그렇지 않으면 노드를 확장하고 이웃을 만듭니다. 각 이웃 노드에 대해 현재 노드의 g 값과 현재 노드에서 이웃 노드로 이동하는 비용의 합인 초기 g(n) 값을 계산합니다. 이웃 노드의 우선순위가 없거나 원래 g(n) 값이 현재 g 값보다 작은 경우 해당 g 값을 업데이트하고 상위 노드를 현재 노드로 설정합니다. 이웃 노드로부터 f(n) 값을 계산하여 우선순위 큐에 추가합니다.

대상 노드를 찾지 못한 채 순환이 끝나면 그래프에는 처음부터 끝까지 경로가 없습니다. A*의 효율성에 대한 핵심은 모든 노드의 목표에 도달하는 데 남은 비용에 대한 추정치를 제공하는 휴리스틱 함수 h(n)를 사용하는 것입니다. 실제 비용 g(n)와 경험적 비용 h(n)를 결합함으로써 알고리즘은 유망한 경로를 효과적으로 탐색하고 최단 경로로 이어질 가능성이 있는 노드의 우선 순위를 지정합니다. A* 알고리즘의 효율성은 휴리스틱 기능의 선택에 크게 좌우된다는 점에 유의하는 것이 중요합니다. 허용 가능한 휴리스틱은 알고리즘이 항상 최단 경로를 찾도록 보장하지만, 더 많은 정보와 정확한 휴리스틱을 사용하면 수렴 속도가 빨라지고 검색 공간이 줄어들 수 있습니다.

인공지능에서 A* 검색 알고리즘의 장점

A* 검색 알고리즘은 인공 지능 및 문제 해결 시나리오에서 여러 가지 이점을 제공합니다.

    최적의 솔루션:A*는 허용 가능한 휴리스틱 기능이 주어진 경우 가중치 그래프에서 시작 노드에서 대상 노드까지 최적의(최단) 경로를 찾는 것을 보장합니다. 이러한 최적성은 최단 경로를 찾는 것이 필수적인 많은 응용 분야에서 결정적인 이점입니다.완전성:솔루션이 존재하는 경우 그래프에 무한한 비용이 없다면 A*는 이를 찾을 것입니다. 이 완전성 속성은 솔루션이 존재하는 경우 A*가 솔루션을 활용할 수 있음을 보장합니다.능률:A*는 효율적이고 허용 가능한 휴리스틱 함수가 사용되면 효율적입니다. 휴리스틱은 유망한 경로에 집중하고 불필요한 탐색을 피함으로써 탐색을 목표로 안내하므로 너비 우선 탐색이나 깊이 우선 탐색과 같은 비인식 탐색 알고리즘보다 A*가 더 효율적입니다.다재:A*는 길 찾기, 경로 계획, 로봇공학, 게임 개발 등 다양한 문제 영역에 폭넓게 적용 가능합니다. A*는 의미 있는 경험적 방법이 정의될 수 있는 한 최적의 솔루션을 효율적으로 찾는 데 사용될 수 있습니다.최적화된 검색:A*는 확장을 위해 작은 f(n) 값(g(n) 및 h(n))을 갖는 노드를 선택하는 우선순위를 유지합니다. 이를 통해 유망한 경로를 먼저 탐색할 수 있게 되어 검색 공간이 줄어들고 더 빠른 수렴이 가능해집니다.메모리 효율성:너비 우선 검색과 같은 일부 다른 검색 알고리즘과 달리 A*는 우선 순위 큐에 제한된 수의 노드만 저장하므로 특히 큰 그래프의 경우 메모리가 효율적입니다.조정 가능한 휴리스틱:A*의 성능은 다양한 휴리스틱 기능을 선택하여 미세 조정할 수 있습니다. 더 많은 교육을 받은 경험적 방법을 사용하면 수렴 속도가 빨라지고 노드 확장이 줄어들 수 있습니다.광범위하게 연구된 내용:A*는 수십 년간의 연구와 실제 적용을 통해 잘 확립된 알고리즘입니다. 많은 최적화와 변형이 개발되어 안정적이고 이해하기 쉬운 문제 해결 도구가 되었습니다.웹 서핑:A*는 환경 변화나 새로운 출현에 따라 알고리즘이 지속적으로 경로를 업데이트하는 웹 기반 경로 검색에 사용될 수 있습니다. 동적 시나리오에서 실시간 의사결정을 가능하게 합니다.

인공지능에서 A* 검색 알고리즘의 단점

A*(문자 A) 검색 알고리즘은 AI 경로 찾기 및 그래프 탐색 문제를 해결하기 위해 널리 사용되는 강력한 기술이지만 단점과 한계가 있습니다. 검색 알고리즘의 주요 단점은 다음과 같습니다.

    경험적 정확성:A* 알고리즘의 성능은 현재 노드에서 비용을 추정하는 데 사용되는 휴리스틱 함수의 정확성에 크게 좌우됩니다. 휴리스틱이 허용되지 않거나(실제 비용을 과대평가하지 않음) 일관성이 없는 경우(삼각형 부등식을 충족함) A* 최적의 경로를 찾지 못하거나 필요한 것보다 더 많은 노드를 탐색하여 효율성과 정확성에 영향을 미칠 수 있습니다.메모리 사용량:A*에서는 탐색된 경로를 추적하기 위해 방문한 모든 노드를 메모리에 보관해야 합니다. 특히 충분한 검색 공간이나 제한된 메모리 리소스를 처리할 때 메모리 사용량이 심각한 문제가 될 수 있습니다.시간 복잡도:A*는 일반적으로 효율적이지만 방대한 검색 공간이나 그래프에서는 시간 복잡성이 문제가 될 수 있습니다. 최악의 경우, 휴리스틱이 문제에 적합하지 않은 경우 A*는 최적의 경로를 찾는 데 기하급수적으로 더 오랜 시간이 걸릴 수 있습니다.목적지의 병목 현상:특정 시나리오에서 A* 알고리즘은 최종적으로 대상 지역에 도달하기 전에 대상에서 멀리 떨어진 노드를 탐색해야 합니다. 이 문제는 휴리스틱이 효율적으로 목표를 조기에 검색해야 할 때 발생합니다.비용 바인딩:A*는 여러 노드가 동일한 f 값(실제 비용과 경험적 비용의 합)을 가질 때 어려움을 겪습니다. 사용된 전략은 검색된 경로의 최적성과 효율성에 영향을 미칠 수 있습니다. 올바르게 처리하지 않으면 불필요한 노드가 탐색되어 알고리즘 속도가 느려질 수 있습니다.동적 환경의 복잡성:검색 중에 에지나 노드의 비용이 변경될 수 있는 동적 환경에서는 A*가 이러한 변경에 잘 적응하지 못하기 때문에 적합하지 않을 수 있습니다. 처음부터 다시 공식화하면 계산 비용이 많이 들 수 있으며 D*(동적 A*) 알고리즘은 이 문제를 해결하기 위해 설계되었습니다.무한한 공간에서의 완벽함 :A*는 무한 상태 공간에서 해를 찾지 못할 수도 있습니다. 이러한 경우 솔루션을 찾지 않고도 계속해서 증가하는 노드를 탐색하면서 무한정 실행될 수 있습니다. 이러한 단점에도 불구하고 A*는 휴리스틱 기능이 잘 설계되고 검색 공간이 관리 가능하다면 많은 실제 상황에서 효과적으로 최적의 경로를 찾을 수 있기 때문에 여전히 강력하고 널리 사용되는 알고리즘입니다. A*의 일부 제한 사항을 완화하기 위해 다양한 변형 및 변형이 제안되었습니다.

인공지능에 A* 검색 알고리즘 적용

검색 알고리즘 A*(문자 A)는 인공 지능 및 컴퓨터 과학에서 널리 사용되는 강력한 길 찾기 알고리즘입니다. 효율성과 최적성으로 인해 다양한 응용 분야에 적합합니다. 인공 지능에서 A* 검색 알고리즘의 몇 가지 일반적인 응용 프로그램은 다음과 같습니다.

    게임에서의 길찾기:A*는 비디오 게임에서 캐릭터 이동, 적 AI 탐색, 게임 맵의 한 위치에서 다른 위치로의 최단 경로 찾기 등을 위해 자주 사용됩니다. 비용과 경험적 방법을 기반으로 최적의 경로를 찾는 능력은 게임과 같은 실시간 애플리케이션에 이상적입니다.로봇공학 및 자율주행차:A*는 장애물을 피하고 지형 비용을 고려하여 로봇이 목적지에 도달할 수 있는 최적의 경로를 계획하기 위해 로봇 공학 및 자율 차량 내비게이션에 사용됩니다. 이는 자연 환경에서 효율적이고 안전한 이동을 위해 매우 중요합니다.미로 해결:A*는 미로를 통해 최단 경로를 효율적으로 찾을 수 있으므로 퍼즐 풀기 또는 복잡한 구조 탐색과 같은 많은 미로 해결 응용 프로그램에서 유용합니다.경로 계획 및 탐색:GPS 시스템 및 매핑 애플리케이션에서 A*는 거리, 교통 상황, 도로 네트워크 토폴로지 등의 요소를 고려하여 지도의 두 지점 사이의 최적 경로를 찾는 데 사용할 수 있습니다.퍼즐 풀기:A*는 슬라이딩 퍼즐, 스도쿠, 8퍼즐 문제 등 다양한 다이어그램 퍼즐을 풀 수 있습니다. 리소스 할당: 리소스를 최적으로 할당해야 하는 시나리오에서 A*는 가장 효율적인 할당 경로를 찾아 비용을 최소화하고 효율성을 최대화하는 데 도움을 줄 수 있습니다.네트워크 라우팅:A*는 컴퓨터 네트워크에서 소스에서 대상 노드까지의 데이터 패킷에 대한 가장 효율적인 경로를 찾는 데 사용될 수 있습니다.자연어 처리(NLP):일부 NLP 작업에서 A*는 가능성과 관련성을 기반으로 가능한 단어 시퀀스를 검색하여 일관되고 상황에 맞는 응답을 생성할 수 있습니다.로봇 공학의 경로 계획:A*는 장애물을 피하거나 에너지 소비를 최소화하는 등 다양한 제약 조건을 고려하여 한 지점에서 다른 지점으로 로봇의 경로를 계획하는 데 사용할 수 있습니다.게임 AI:A*는 팀 기반 게임에서 목표에 도달하거나 움직임을 조정하는 가장 좋은 방법을 결정하는 등 NPC(비플레이어 캐릭터)에 대한 지능적인 결정을 내리는 데에도 사용됩니다.

이는 A* 검색 알고리즘이 인공 지능의 다양한 영역에서 응용 프로그램을 찾는 방법에 대한 몇 가지 예일 뿐입니다. 유연성, 효율성 및 최적화로 인해 많은 문제에 대한 귀중한 도구가 됩니다.

인공지능의 A* 검색 알고리즘을 위한 C 프로그램

 #include #include #define ROWS 5 #define COLS 5 // Define a structure for a grid cell typedef struct { int row, col; } Cell; // Define a structure for a node in the A* algorithm typedef struct { Cell position; int g, h, f; struct Node* parent; } Node; // Function to calculate the Manhattan distance between two cells int heuristic(Cell current, Cell goal) { return abs(current.row - goal.row) + abs(current.col - goal.col); } // Function to check if a cell is valid (within the grid and not an obstacle) int isValid(int row, int col, int grid[ROWS][COLS]) { return (row &gt;= 0) &amp;&amp; (row = 0) &amp;&amp; (col <cols) && (grid[row][col]="=" 0); } function to check if a cell is the goal int isgoal(cell cell, goal) { return (cell.row="=" goal.row) (cell.col="=" goal.col); perform a* search algorithm void astarsearch(int grid[rows][cols], start, todo: implement here main() grid[rows][cols]="{" {0, 1, 0, 0}, 0} }; start="{0," 0}; - cols 1}; astarsearch (grid, goal); 0; < pre> <p> <strong>Explanation:</strong> </p> <ol class="points"> <tr><td>Data Structures:</td> A cell structure represents a grid cell with a row and a column. The node structure stores information about a cell during an A* lookup, including its location, cost (g, h, f), and a reference to its parent. </tr><tr><td>Heuristic function (heuristic):</td> This function calculates the Manhattan distance (also known as a &apos;cab ride&apos;) between two cells. It is used as a heuristic to estimate the cost from the current cell to the target cell. The Manhattan distance is the sum of the absolute differences between rows and columns. </tr><tr><td>Validation function (isValid):</td> This function checks if the given cell is valid, i.e., whether it is within the grid boundaries and is not an obstacle (indicated by a grid value of 1). </tr><tr><td>Goal check function (isGoal):</td> This function checks if the given cell is a target cell, i.e., does it match the coordinates of the target cell. </tr><tr><td>Search function* (AStarSearch):</td> This is the main function where the A* search algorithm should be applied. It takes a grid, a source cell, and a target cell as inputs. This activity aims to find the shortest path from the beginning to the end, avoiding the obstacles on the grid. The main function initializes a grid representing the environment, a start, and a target cell. It then calls the AStarSearch function with those inputs. </tr></ol> <p> <strong>Sample Output</strong> </p> <pre> (0, 0) (1, 0) (2, 0) (3, 0) (4, 0) (4, 1) (4, 2) (4, 3) (4, 4) </pre> <h3>C++ program for A* Search Algorithm in Artificial Intelligence</h3> <pre> #include #include #include using namespace std; struct Node { int x, y; // Coordinates of the node int g; // Cost from the start node to this node int h; // Heuristic value (estimated cost from this node to the goal node) Node* parent; // Parent node in the path Node (int x, int y): x(x), y(y), g(0), h(0), parent(nullptr) {} // Calculate the total cost (f = g + h) int f () const { return g + h; } }; // Heuristic function (Euclidean distance) int calculateHeuristic (int x, int y, int goals, int goal) { return static cast (sqrt (pow (goals - x, 2) + pow (goal - y, 2))); } // A* search algorithm vector<pair> AStarSearch (int startX, int startY, int goals, int goal, vector<vector>&amp; grid) { vector<pair> path; int rows = grid. size (); int cols = grid [0].size (); // Create the open and closed lists Priority queue <node*, vector, function> open List([](Node* lhs, Node* rhs) { return lhs-&gt;f() &gt; rhs-&gt;f(); }); vector<vector> closed List (rows, vector (cols, false)); // Push the start node to the open list openList.push(start Node); // Main A* search loop while (! Open-list. Empty ()) { // Get the node with the lowest f value from the open list Node* current = open-list. Top (); openest. pop (); // Check if the current node is the goal node if (current-&gt;x == goals &amp;&amp; current-&gt;y == goal) { // Reconstruct the path while (current! = nullptr) { path. push_back(make_pair(current-&gt;x, current-&gt;y)); current = current-&gt;parent; } Reverse (path. Begin(), path.end ()); break; } // Mark the current node as visited (in the closed list) Closed-list [current-&gt;x] [current-&gt;y] = true; // Generate successors (adjacent nodes) int dx [] = {1, 0, -1, 0}; int dy [] = {0, 1, 0, -1}; for (int i = 0; i x + dx [i]; int new Y = current-&gt;y + dy [i]; } break; } successor-&gt;parent = current; open List.push(successor); } // Cleanup memory for (Node* node: open List) { delete node; } return path; } int main () { int rows, cols; cout &lt;&gt; rows; cout &lt;&gt; cols; vector<vector> grid (rows, vector(cols)); cout &lt;&lt; &apos;Enter the grid (0 for empty, 1 for obstacle):&apos; &lt;&lt; endl; for (int i = 0; i &lt; rows; i++) { for (int j = 0; j&gt; grid[i][j]; } } int startX, startY, goalX, goalY; cout &lt;&gt; startX &gt;&gt; start; cout &lt;&gt; goals &gt;&gt; goals; vector<pair> path = AStarSearch (startX, startY, goal, goal, grid); if (! path. Empty ()) { cout &lt;&lt; &apos;Shortest path from (&apos; &lt;&lt; startX &lt;&lt; &apos;,&apos; &lt;&lt; start &lt;&lt; &apos;) to (&apos; &lt;&lt; goal &lt;&lt; &apos;,&apos; &lt;&lt; goal &lt;&lt; &apos;):&apos; &lt;&lt; endl; for (const auto&amp; point: path) { cout &lt;&lt; &apos;(&apos; &lt;&lt; point. first &lt;&lt; &apos;,&apos; &lt;&lt; point. second &lt;&lt; &apos;) &apos;; } cout &lt;&lt; endl; } else { cout &lt;&lt; &apos;No path found!&apos; &lt;&lt; endl; } return 0; } </pair></vector></vector></node*,></pair></vector></pair></pre> <p> <strong>Explanation:</strong> </p> <ol class="points"> <tr><td>Struct Node:</td> This defines a nodestructure that represents a grid cell. It contains the x and y coordinates of the node, the cost g from the starting node to that node, the heuristic value h (estimated cost from that node to the destination node), and a pointer to the <li>starting node of the path.</li> </tr><tr><td>Calculate heuristic:</td> This function calculates a heuristic using the Euclidean distance between a node and the target AStarSearch: This function runs the A* search algorithm. It takes the start and destination coordinates, a grid, and returns a vector of pairs representing the coordinates of the shortest path from start to finish. </tr><tr><td>Primary:</td> The program&apos;s main function takes input grids, origin, and target coordinates from the user. It then calls AStarSearch to find the shortest path and prints the result. Struct Node: This defines a node structure that represents a grid cell. It contains the x and y coordinates of the node, the cost g from the starting node to that node, the heuristic value h (estimated cost from that node to the destination node), and a pointer to the starting node of the path. </tr><tr><td>Calculate heuristic:</td> This function calculates heuristics using the Euclidean distance between a node and the target AStarSearch: This function runs the A* search algorithm. It takes the start and destination coordinates, a grid, and returns a vector of pairs representing the coordinates of the shortest path from start to finish. </tr></ol> <p> <strong>Sample Output</strong> </p> <pre> Enter the number of rows: 5 Enter the number of columns: 5 Enter the grid (0 for empty, 1 for obstacle): 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 Enter the start coordinates (x y): 0 0 Enter the goal coordinates (x y): 4 4 </pre> <h3>Java program for A* Search Algorithm in Artificial Intelligence</h3> <pre> import java. util.*; class Node { int x, y; // Coordinates of the node int g; // Cost from the start node to the current node int h; // Heuristic value (estimated cost from the current node to goal node) int f; // Total cost f = g + h Node parent; // Parent node in the path public Node (int x, int y) { this. g = x; this. f = y; this. Parent = null; } } public class AStarSearch { // Heuristic function (Manhattan distance) private static int heuristic (Node current, Node goal) { return Math. Abs (current.x - goal.x) + Math. Abs(current.y - goal.y); } // A* search algorithm public static List aStarSearch(int [][] grid, Node start, Node goal) { int rows = grid. Length; int cols = grid [0].length; // Add the start node to the open set opened.add(start); while (! openSet.isEmpty()) { // Get the node with the lowest f value from the open set Node current = openSet.poll(); // If the current node is the goal node, reconstruct the path and return it if (current == goal) { List path = new ArrayList(); while (current != null) { path.add(0, current); current = current.parent; } return path; } // Move the current node from the open set to the closed set closedSet.add(current); // Generate neighbors of the current node int[] dx = {-1, 0, 1, 0}; int[] dy = {0, -1, 0, 1}; for (int i = 0; i = 0 &amp;&amp; nx = 0 &amp;&amp; ny = neighbor.g) { // Skip this neighbor as it is already in the closed set with a lower or equal g value continue; } if (!openSet.contains(neighbor) || tentativeG <neighbor.g) { update the neighbor's values neighbor.g="tentativeG;" neighbor.h="heuristic(neighbor," goal); neighbor.f="neighbor.g" + neighbor.h; neighbor.parent="current;" if (!openset.contains(neighbor)) add neighbor to open set not already present openset.add(neighbor); } is empty and goal reached, there no path return null; public static void main(string[] args) int[][] grid="{" {0, 0, 0}, 1, 0} }; node start="new" node(0, 0); node(4, 4); list start, (path !="null)" system.out.println('path found:'); for (node : path) system.out.println('(' node.x ', ' node.y ')'); else system.out.println('no found.'); < pre> <p> <strong>Explanation:</strong> </p> <ol class="points"> <tr><td>Node Class:</td> We start by defining a nodeclass representing each grid cell. Each node contains coordinates (x, y), an initial node cost (g), a heuristic value (h), a total cost (f = g h), and a reference to the parent node of the path. </tr><tr><td>Heuristicfunction:</td> The heuristic function calculates the Manhattan distance between a node and a destination The Manhattan distance is a heuristic used to estimate the cost from the current node to the destination node. </tr><tr><td>Search algorithm* function:</td> A Star Search is the primary implementation of the search algorithm A*. It takes a 2D grid, a start node, and a destination node as inputs and returns a list of nodes representing the path from the start to the destination node. </tr><tr><td>Priority Queue and Closed Set:</td> The algorithm uses a priority queue (open Set) to track thenodes to be explored. The queue is ordered by total cost f, so the node with the lowest f value is examined The algorithm also uses a set (closed set) to track the explored nodes. </tr><tr><td>The main loop of the algorithm:</td> The main loop of the A* algorithm repeats until there are no more nodes to explore in the open Set. In each iteration, the node f with the lowest total cost is removed from the opener, and its neighbors are created. </tr><tr><td>Creating neighbors:</td> The algorithm creates four neighbors (up, down, left, right) for each node and verifies that each neighbor is valid (within the network boundaries and not as an obstacle). If the neighbor is valid, it calculates the initial value g from the source node to that neighbor and the heuristic value h from that neighbor to the destination The total cost is then calculated as the sum of f, g, and h. </tr><tr><td>Node evaluation:</td> The algorithm checks whether the neighbor is already in the closed set and, if so, whether the initial cost g is greater than or equal to the existing cost of the neighbor If true, the neighbor is omitted. Otherwise, the neighbor values are updated and added to the open Set if it is not already there. </tr><tr><td>Pathreconstruction:</td> When the destination node is reached, the algorithm reconstructs the path from the start node to the destination node following the main links from the destination node back to the start node. The path is returned as a list of nodes </tr></ol> <p> <strong>Sample Output</strong> </p> <pre> Path found: (0, 0) (0, 1) (1, 1) (2, 1) (2, 2) (3, 2) (4, 2) (4, 3) (4, 4) </pre> <h2>A* Search Algorithm Complexity in Artificial Intelligence</h2> <p>The A* (pronounced &apos;A-star&apos;) search algorithm is a popular and widely used graph traversal and path search algorithm in artificial intelligence. Finding the shortest path between two nodes in a graph or grid-based environment is usually common. The algorithm combines Dijkstra&apos;s and greedy best-first search elements to explore the search space while ensuring optimality efficiently. Several factors determine the complexity of the A* search algorithm. Graph size (nodes and edges): A graph&apos;s number of nodes and edges greatly affects the algorithm&apos;s complexity. More nodes and edges mean more possible options to explore, which can increase the execution time of the algorithm.</p> <p>Heuristic function: A* uses a heuristic function (often denoted h(n)) to estimate the cost from the current node to the destination node. The precision of this heuristic greatly affects the efficiency of the A* search. A good heuristic can help guide the search to a goal more quickly, while a bad heuristic can lead to unnecessary searching.</p> <ol class="points"> <tr><td>Data Structures:</td> A* maintains two maindata structures: an open list (priority queue) and a closed list (or visited pool). The efficiency of these data structures, along with the chosen implementation (e.g., priority queue binary heaps), affects the algorithm&apos;s performance. </tr><tr><td>Branch factor:</td> The average number of followers for each node affects the number of nodes expanded during the search. A higher branching factor can lead to more exploration, which increases </tr><tr><td>Optimality and completeness:</td> A* guarantees both optimality (finding the shortest path) and completeness (finding a solution that exists). However, this guarantee comes with a trade-off in terms of computational complexity, as the algorithm must explore different paths for optimal performance. Regarding time complexity, the chosen heuristic function affects A* in the worst case. With an accepted heuristic (which never overestimates the true cost of reaching the goal), A* expands the fewest nodes among the optimization algorithms. The worst-case time complexity of A * is exponential in the worst-case O(b ^ d), where &apos;b&apos; is the effective branching factor (average number of followers per node) and &apos;d&apos; is the optimal </tr></ol> <p>In practice, however, A* often performs significantly better due to the influence of a heuristic function that helps guide the algorithm to promising paths. In the case of a well-designed heuristic, the effective branching factor is much smaller, which leads to a faster approach to the optimal solution.</p> <hr></neighbor.g)></pre></cols)>

인공 지능의 A* 검색 알고리즘을 위한 C++ 프로그램

 #include #include #include using namespace std; struct Node { int x, y; // Coordinates of the node int g; // Cost from the start node to this node int h; // Heuristic value (estimated cost from this node to the goal node) Node* parent; // Parent node in the path Node (int x, int y): x(x), y(y), g(0), h(0), parent(nullptr) {} // Calculate the total cost (f = g + h) int f () const { return g + h; } }; // Heuristic function (Euclidean distance) int calculateHeuristic (int x, int y, int goals, int goal) { return static cast (sqrt (pow (goals - x, 2) + pow (goal - y, 2))); } // A* search algorithm vector<pair> AStarSearch (int startX, int startY, int goals, int goal, vector<vector>&amp; grid) { vector<pair> path; int rows = grid. size (); int cols = grid [0].size (); // Create the open and closed lists Priority queue <node*, vector, function> open List([](Node* lhs, Node* rhs) { return lhs-&gt;f() &gt; rhs-&gt;f(); }); vector<vector> closed List (rows, vector (cols, false)); // Push the start node to the open list openList.push(start Node); // Main A* search loop while (! Open-list. Empty ()) { // Get the node with the lowest f value from the open list Node* current = open-list. Top (); openest. pop (); // Check if the current node is the goal node if (current-&gt;x == goals &amp;&amp; current-&gt;y == goal) { // Reconstruct the path while (current! = nullptr) { path. push_back(make_pair(current-&gt;x, current-&gt;y)); current = current-&gt;parent; } Reverse (path. Begin(), path.end ()); break; } // Mark the current node as visited (in the closed list) Closed-list [current-&gt;x] [current-&gt;y] = true; // Generate successors (adjacent nodes) int dx [] = {1, 0, -1, 0}; int dy [] = {0, 1, 0, -1}; for (int i = 0; i x + dx [i]; int new Y = current-&gt;y + dy [i]; } break; } successor-&gt;parent = current; open List.push(successor); } // Cleanup memory for (Node* node: open List) { delete node; } return path; } int main () { int rows, cols; cout &lt;&gt; rows; cout &lt;&gt; cols; vector<vector> grid (rows, vector(cols)); cout &lt;&lt; &apos;Enter the grid (0 for empty, 1 for obstacle):&apos; &lt;&lt; endl; for (int i = 0; i &lt; rows; i++) { for (int j = 0; j&gt; grid[i][j]; } } int startX, startY, goalX, goalY; cout &lt;&gt; startX &gt;&gt; start; cout &lt;&gt; goals &gt;&gt; goals; vector<pair> path = AStarSearch (startX, startY, goal, goal, grid); if (! path. Empty ()) { cout &lt;&lt; &apos;Shortest path from (&apos; &lt;&lt; startX &lt;&lt; &apos;,&apos; &lt;&lt; start &lt;&lt; &apos;) to (&apos; &lt;&lt; goal &lt;&lt; &apos;,&apos; &lt;&lt; goal &lt;&lt; &apos;):&apos; &lt;&lt; endl; for (const auto&amp; point: path) { cout &lt;&lt; &apos;(&apos; &lt;&lt; point. first &lt;&lt; &apos;,&apos; &lt;&lt; point. second &lt;&lt; &apos;) &apos;; } cout &lt;&lt; endl; } else { cout &lt;&lt; &apos;No path found!&apos; &lt;&lt; endl; } return 0; } </pair></vector></vector></node*,></pair></vector></pair>

설명:

    구조체 노드:이는 그리드 셀을 나타내는 노드 구조를 정의합니다. 여기에는 노드의 x 및 y 좌표, 시작 노드에서 해당 노드까지의 비용 g, 휴리스틱 값 h(해당 노드에서 대상 노드까지의 예상 비용) 및 포인터가 포함됩니다.
  1. 경로의 시작 노드.
  2. 휴리스틱 계산:이 함수는 노드와 대상 AStarSearch 사이의 유클리드 거리를 사용하여 휴리스틱을 계산합니다. 이 함수는 A* 검색 알고리즘을 실행합니다. 시작 및 대상 좌표, 그리드를 사용하고 시작부터 끝까지 최단 경로의 좌표를 나타내는 쌍의 벡터를 반환합니다.주요한:프로그램의 주요 기능은 사용자로부터 입력 그리드, 원점 및 대상 좌표를 가져옵니다. 그런 다음 AStarSearch를 호출하여 최단 경로를 찾고 결과를 인쇄합니다. Struct Node: 그리드 셀을 나타내는 노드 구조를 정의합니다. 여기에는 노드의 x 및 y 좌표, 시작 노드에서 해당 노드까지의 비용 g, 경험적 값 h(해당 노드에서 대상 노드까지의 예상 비용) 및 경로의 시작 노드에 대한 포인터가 포함됩니다.휴리스틱 계산:이 함수는 노드와 대상 AStarSearch 사이의 유클리드 거리를 사용하여 휴리스틱을 계산합니다. 이 함수는 A* 검색 알고리즘을 실행합니다. 시작 및 대상 좌표, 그리드를 사용하고 시작부터 끝까지 최단 경로의 좌표를 나타내는 쌍의 벡터를 반환합니다.

샘플 출력

 Enter the number of rows: 5 Enter the number of columns: 5 Enter the grid (0 for empty, 1 for obstacle): 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 Enter the start coordinates (x y): 0 0 Enter the goal coordinates (x y): 4 4 

인공지능의 A* 검색 알고리즘을 위한 Java 프로그램

 import java. util.*; class Node { int x, y; // Coordinates of the node int g; // Cost from the start node to the current node int h; // Heuristic value (estimated cost from the current node to goal node) int f; // Total cost f = g + h Node parent; // Parent node in the path public Node (int x, int y) { this. g = x; this. f = y; this. Parent = null; } } public class AStarSearch { // Heuristic function (Manhattan distance) private static int heuristic (Node current, Node goal) { return Math. Abs (current.x - goal.x) + Math. Abs(current.y - goal.y); } // A* search algorithm public static List aStarSearch(int [][] grid, Node start, Node goal) { int rows = grid. Length; int cols = grid [0].length; // Add the start node to the open set opened.add(start); while (! openSet.isEmpty()) { // Get the node with the lowest f value from the open set Node current = openSet.poll(); // If the current node is the goal node, reconstruct the path and return it if (current == goal) { List path = new ArrayList(); while (current != null) { path.add(0, current); current = current.parent; } return path; } // Move the current node from the open set to the closed set closedSet.add(current); // Generate neighbors of the current node int[] dx = {-1, 0, 1, 0}; int[] dy = {0, -1, 0, 1}; for (int i = 0; i = 0 &amp;&amp; nx = 0 &amp;&amp; ny = neighbor.g) { // Skip this neighbor as it is already in the closed set with a lower or equal g value continue; } if (!openSet.contains(neighbor) || tentativeG <neighbor.g) { update the neighbor\'s values neighbor.g="tentativeG;" neighbor.h="heuristic(neighbor," goal); neighbor.f="neighbor.g" + neighbor.h; neighbor.parent="current;" if (!openset.contains(neighbor)) add neighbor to open set not already present openset.add(neighbor); } is empty and goal reached, there no path return null; public static void main(string[] args) int[][] grid="{" {0, 0, 0}, 1, 0} }; node start="new" node(0, 0); node(4, 4); list start, (path !="null)" system.out.println(\'path found:\'); for (node : path) system.out.println(\'(\' node.x \', \' node.y \')\'); else system.out.println(\'no found.\'); < pre> <p> <strong>Explanation:</strong> </p> <ol class="points"> <tr><td>Node Class:</td> We start by defining a nodeclass representing each grid cell. Each node contains coordinates (x, y), an initial node cost (g), a heuristic value (h), a total cost (f = g h), and a reference to the parent node of the path. </tr><tr><td>Heuristicfunction:</td> The heuristic function calculates the Manhattan distance between a node and a destination The Manhattan distance is a heuristic used to estimate the cost from the current node to the destination node. </tr><tr><td>Search algorithm* function:</td> A Star Search is the primary implementation of the search algorithm A*. It takes a 2D grid, a start node, and a destination node as inputs and returns a list of nodes representing the path from the start to the destination node. </tr><tr><td>Priority Queue and Closed Set:</td> The algorithm uses a priority queue (open Set) to track thenodes to be explored. The queue is ordered by total cost f, so the node with the lowest f value is examined The algorithm also uses a set (closed set) to track the explored nodes. </tr><tr><td>The main loop of the algorithm:</td> The main loop of the A* algorithm repeats until there are no more nodes to explore in the open Set. In each iteration, the node f with the lowest total cost is removed from the opener, and its neighbors are created. </tr><tr><td>Creating neighbors:</td> The algorithm creates four neighbors (up, down, left, right) for each node and verifies that each neighbor is valid (within the network boundaries and not as an obstacle). If the neighbor is valid, it calculates the initial value g from the source node to that neighbor and the heuristic value h from that neighbor to the destination The total cost is then calculated as the sum of f, g, and h. </tr><tr><td>Node evaluation:</td> The algorithm checks whether the neighbor is already in the closed set and, if so, whether the initial cost g is greater than or equal to the existing cost of the neighbor If true, the neighbor is omitted. Otherwise, the neighbor values are updated and added to the open Set if it is not already there. </tr><tr><td>Pathreconstruction:</td> When the destination node is reached, the algorithm reconstructs the path from the start node to the destination node following the main links from the destination node back to the start node. The path is returned as a list of nodes </tr></ol> <p> <strong>Sample Output</strong> </p> <pre> Path found: (0, 0) (0, 1) (1, 1) (2, 1) (2, 2) (3, 2) (4, 2) (4, 3) (4, 4) </pre> <h2>A* Search Algorithm Complexity in Artificial Intelligence</h2> <p>The A* (pronounced &apos;A-star&apos;) search algorithm is a popular and widely used graph traversal and path search algorithm in artificial intelligence. Finding the shortest path between two nodes in a graph or grid-based environment is usually common. The algorithm combines Dijkstra&apos;s and greedy best-first search elements to explore the search space while ensuring optimality efficiently. Several factors determine the complexity of the A* search algorithm. Graph size (nodes and edges): A graph&apos;s number of nodes and edges greatly affects the algorithm&apos;s complexity. More nodes and edges mean more possible options to explore, which can increase the execution time of the algorithm.</p> <p>Heuristic function: A* uses a heuristic function (often denoted h(n)) to estimate the cost from the current node to the destination node. The precision of this heuristic greatly affects the efficiency of the A* search. A good heuristic can help guide the search to a goal more quickly, while a bad heuristic can lead to unnecessary searching.</p> <ol class="points"> <tr><td>Data Structures:</td> A* maintains two maindata structures: an open list (priority queue) and a closed list (or visited pool). The efficiency of these data structures, along with the chosen implementation (e.g., priority queue binary heaps), affects the algorithm&apos;s performance. </tr><tr><td>Branch factor:</td> The average number of followers for each node affects the number of nodes expanded during the search. A higher branching factor can lead to more exploration, which increases </tr><tr><td>Optimality and completeness:</td> A* guarantees both optimality (finding the shortest path) and completeness (finding a solution that exists). However, this guarantee comes with a trade-off in terms of computational complexity, as the algorithm must explore different paths for optimal performance. Regarding time complexity, the chosen heuristic function affects A* in the worst case. With an accepted heuristic (which never overestimates the true cost of reaching the goal), A* expands the fewest nodes among the optimization algorithms. The worst-case time complexity of A * is exponential in the worst-case O(b ^ d), where &apos;b&apos; is the effective branching factor (average number of followers per node) and &apos;d&apos; is the optimal </tr></ol> <p>In practice, however, A* often performs significantly better due to the influence of a heuristic function that helps guide the algorithm to promising paths. In the case of a well-designed heuristic, the effective branching factor is much smaller, which leads to a faster approach to the optimal solution.</p> <hr></neighbor.g)>

A* 인공 지능의 검색 알고리즘 복잡성

A*('A-star'로 발음) 검색 알고리즘은 인공 지능에서 인기 있고 널리 사용되는 그래프 순회 및 경로 검색 알고리즘입니다. 그래프나 그리드 기반 환경에서는 두 노드 사이의 최단 경로를 찾는 것이 일반적입니다. 알고리즘은 Dijkstra와 탐욕스러운 최고 우선 검색 요소를 결합하여 최적성을 효율적으로 보장하면서 검색 공간을 탐색합니다. 여러 요인이 A* 검색 알고리즘의 복잡성을 결정합니다. 그래프 크기(노드 및 에지): 그래프의 노드 및 에지 수는 알고리즘의 복잡성에 큰 영향을 미칩니다. 노드와 에지가 많을수록 탐색할 수 있는 옵션이 많아지고, 이는 알고리즘의 실행 시간을 늘릴 수 있음을 의미합니다.

휴리스틱 함수: A*는 휴리스틱 함수(종종 h(n)로 표시됨)를 사용하여 현재 노드에서 대상 노드까지의 비용을 추정합니다. 이 휴리스틱의 정확성은 A* 검색의 효율성에 큰 영향을 미칩니다. 좋은 휴리스틱은 검색을 더 빠르게 목표로 안내하는 데 도움이 되는 반면, 나쁜 휴리스틱은 불필요한 검색으로 이어질 수 있습니다.

    데이터 구조:A*는 열린 목록(우선순위 큐)과 닫힌 목록(또는 방문 풀)이라는 두 가지 주요 데이터 구조를 유지합니다. 선택한 구현(예: 우선순위 큐 바이너리 힙)과 함께 이러한 데이터 구조의 효율성은 알고리즘 성능에 영향을 미칩니다.분기 계수:각 노드의 평균 팔로어 수는 검색 중에 확장되는 노드 수에 영향을 미칩니다. 분기 인자가 높을수록 더 많은 탐색이 가능해집니다.최적성과 완전성:A*는 최적성(최단 경로 찾기)과 완전성(존재하는 솔루션 찾기)을 모두 보장합니다. 그러나 이 보장에는 알고리즘이 최적의 성능을 위해 다양한 경로를 탐색해야 하므로 계산 복잡성 측면에서 균형이 필요합니다. 시간 복잡도와 관련하여 선택된 휴리스틱 함수는 최악의 경우 A*에 영향을 미칩니다. A*는 허용된 휴리스틱(목표 달성에 드는 실제 비용을 결코 과대평가하지 않음)을 통해 최적화 알고리즘 중에서 가장 적은 수의 노드를 확장합니다. A*의 최악의 시간 복잡도는 최악의 O(b^d)에서 지수적입니다. 여기서 'b'는 유효 분기 인자(노드당 평균 팔로어 수)이고 'd'는 최적입니다.

그러나 실제로 A*는 알고리즘을 유망한 경로로 안내하는 데 도움이 되는 경험적 기능의 영향으로 인해 훨씬 ​​더 나은 성능을 발휘하는 경우가 많습니다. 잘 설계된 휴리스틱의 경우 유효 분기 인자가 훨씬 작아서 최적의 솔루션에 더 빠르게 접근할 수 있습니다.

호랑이 사자 차이