한 걸음 한 걸음 쓰기 알고리즘 (의 A * 알고리즘)
앞의 블 로그 에서 사실 우 리 는 이미 길 을 찾 는 알고리즘 을 토론 한 적 이 있다.그러나 당시 예제 그림 에서 선택 할 수 있 는 경 로 는 유일 했다.우 리 는 알고리즘 을 하나 골 랐 다. 즉, 이 유일한 경 로 를 골 라 야 하 는데 어떻게 골 라 야 합 니까?당시 에 우 리 는 끝 없 이 돌아 가 는 알고리즘 을 채택 했다.그러나 오늘 의 상황 은 좀 다르다.어디 있 지?그것 은 바로 오늘 의 경로 가 n 개 입 니 다. 이 경 로 는 모두 목적지 에 도달 할 수 있 습 니 다. 그러나 우 리 는 선택 하 는 과정 에서 요구 가 있 습 니 다. 그것 이 바로 선택 한 경로 의 거리 가 가장 짧 습 니까?방법 이 없 을까요?
그렇다면 이 럴 때 는 A * 알고리즘 이 필요 하 다.A * 알고리즘 과 일반적인 알고리즘 은 어떤 차이 가 있 습 니까?우 리 는 하나의 예시 로 설명 할 수 있다.
/*
*       0  0  0  0  0
*       1  1  1  1  1
*       1  0  0  0  1  
*       1  0  0  0  1   
*       A  1  1  1  1
*/우 리 는 시간 을 도착 하기 몇 단계 로 돌아 갈 수 있 습 니까?우 리 는 왜 수평 방향의 점 보 다 는 방향 을 아래로 향 하 는 점 을 선택해 야 합 니까?원인 이 복잡 하지 않 은 것 은 모든 점 중에서 우리 가 선택해 야 할 이 점 과 목표 점 사이 의 거리 가 가장 짧 기 때문이다.그렇다면 이 가운데 경로 선택 이 바 뀌 었 을 까?사실은 가능 합 니 다. 길 을 선택 하 는 과정 에서 본 성 은 pk 의 과정 이기 때문에 우리 가 할 수 있 는 일 은 그 당시 의 목표 에서 가장 가 까 운 점 을 찾 는 것 입 니 다. 이 점 은 항상 변화 하 는 것 이기 때문에 마지막 으로 선택 한 길 은 이 렇 습 니 다.
/*
*       0  0  0  0  0
*       1  0  0  0  0
*       1  0  0  0  0  
*       1  0  0  0  0   
*       A  0  0  0  0
*/typedef struct _VALUE
{
	int x;
	int y;
}VALUE;
int find_most_nearest_neigh(VALUE data[], int length, int x, int y)
{
	int index;
	int number;
	int current;
	int median;
	if(NULL == data || 0 == length)
		return -1;
	current = 0;
	number = (int) sqrt((data[0].x - x) * (data[0].x - x)+ (data[0].y - y) *  (data[0].y - y));
	for(index = 1; index < length; index ++){
		median = (int) sqrt((data[index].x - x) * (data[index].x - x)+ (data[index].y - y) *  (data[index].y - y));
		
		if(median < number){
			number = median;
			current = index;
		}
	}
	return current;
}VALUE* updata_data_for_queue(VALUE* data, int length, int* newLen)
{
	int index;
	int count;
	int max;
	VALUE* pData;
	if(NULL == data || 0 == length || NULL == newLen)
		return NULL;
	max = length << 2;
	pData = (VALUE*)malloc(max * sizeof(VALUE));
	memset(pData, 0, max * sizeof(VALUE));
	count = 0;
	for(index = 0; index < length; index ++){
		if(check_pos_valid(data[index].x, data[index].y - 1)){
			pData[count].x = data[index].x;
			pData[count].y = data[index].y -1;
			count ++;
		}
		if(check_pos_valid(data[index].x -1, data[index].y)){
			pData[count].x = data[index].x -1;
			pData[count].y = data[index].y;
			count ++; 
		}
		if(check_pos_valid(data[index].x, data[index].y + 1)){
			pData[count].x = data[index].x;
			pData[count].y = data[index].y +1;
			count ++;
		}
		if(check_pos_valid(data[index].x + 1, data[index].y)){
			pData[count].x = data[index].x + 1;
			pData[count].y = data[index].y;
			count ++; 
		}
	}
	*newLen = count;
	return pData;
}위의 함수 가 생기 면 findpath 는 아주 간단 합 니 다.
void find_path(int x, int y)
{
  while(/*       0 */){
	  /*      */
	  /*       */
  };
}요약:
(1) A * 의 중점 은 디자인 가중치 판단 함수 에 있 고 가장 좋 은 다음 점프 를 선택 하 는 것 이다.
(2) A * 의 목 표 는 이미 알 고 있 는 것 이다.
(3) A * 는 격자 형 경로 찾기 에 특히 적합 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.