在前面的部落格其中,事實上我們已經討論過尋路的演算法。只是,當時的演示樣例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有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
*/
這是乙個5*5的陣列。如果我們從array[1][0]出發,目標為a點。我們發現,在圖中有兩種方法能夠到達目的地,可是往下直達的方法最短。那麼怎麼找到這個最短的演算法呢?朋友們能夠好好思考一下。
我們能夠把時光回到到達的前幾個步驟?我們為什麼要選方向朝下的點,而不選水平方向的點?原因不複雜,就是由於全部點中,當時我們要選的這個點和目標點之間距離最短。那麼這中間,路徑的選擇有沒有發生改變呢?事實上是有可能的,由於選路的過程本省就是乙個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
value;
然後呢,尋找到和目標點距離最短的那個點,
int find_most_nearest_neigh(value data, int length, int x, int y)
} return current;
}
尋找到這個點,一切都好辦了,那麼如今我們就須要又一次對data進行處理,畢竟有些點須要彈出,另一些新的點須要壓入處理的。
value* updata_data_for_queue(value* data, int length, int* newlen)
if(check_pos_valid(data[index].x -1, data[index].y))
if(check_pos_valid(data[index].x, data[index].y + 1))
if(check_pos_valid(data[index].x + 1, data[index].y))
} *newlen = count;
return pdata;
}
有了上面的函式之後,那麼find_path就十分簡單了。
void find_path(int x, int y)
;}
總結:
(1)a*的重點在於設計權重推斷函式,選擇最佳下一跳
(2)a*的目標是已知的
(3)a*尤其適合於網格型的路徑查詢
一步一步寫演算法(之 A 演算法)
在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...
一步一步寫演算法(之 A 演算法)
在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...
一步一步寫演算法 之 A 演算法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的...