เราสามารถคำนวณ g ได้ แต่เราจะคำนวณ h ได้อย่างไร
1. คำนวณค่าที่แน่นอนและถูกต้องของ h ซึ่งต้องใช้เวลานาน
2. ประมาณค่าของ h ซึ่งใช้เวลาน้อยกว่า
การหาค่าที่แน่นอนของ h (ใช้เวลานาน)
1. คำนวณระยะทางระหว่างจุด 2 จุดก่อน
2. ถ้าไม่มีสิ่งกีดขวางต่างๆให้ใช้วิธีการคำนวณค่าที่แน่นอนของ
h ด้วยวิธีการ Distance formula/Euclidean distance
สามารถเข้าไปศึกษาได้ตามเว็บไซต์นี้ https://en.wikipedia.org/wiki/Euclidean_distance
การประมาณค่าของ h (ใช้เวลาน้อยกว่า) มี 3 วิธีดังนี้
1. Manhattan
Distance
ค่าสัมบูรณ์ที่เกิดจากการนำระยะพิกัดของจุดเป้าหมาย x ลบกับระยะพิกัดที่จุด x ในตำแหน่งปัจจุบัน
รวมกับ ค่าสัมบูรณ์ที่เกิดจากการนำระยะพิกัดของจุดเป้าหมาย y ลบกับระยะพิกัดที่จุด y ในตำแหน่งปัจจุบัน ตามสูตรด้านล่างนี้ เราจะใช้สูตรนี้คำนวณเมื่อเคลื่อนที่แค่
4 ทิศทางเท่านั้น คือ ซ้าย ขวา บน ล่าง
h = abs (current_cell.x – goal.x) +
abs (current_cell.y – goal.y)
รูปภาพที่ 3. ตัวอย่างที่สามารถคำนวณด้วยวิธี
Manhattan Distance ได้
ที่มา : https://www.geeksforgeeks.org/a-search-algorithm/
2. Diagonal Distance
ค่ามากที่สุดของค่าสัมบูรณ์ที่เกิดจากการนำระยะพิกัดของจุดเป้าหมาย x ลบกับระยะพิกัดที่จุด
x ในตำแหน่งปัจจุบัน หรือค่ามากที่สุดของค่าสัมบูรณ์ที่เกิดจากการนำระยะพิกัดของจุดเป้าหมาย
y ลบกับระยะพิกัดที่จุด
y ในตำแหน่งปัจจุบัน ตามสูตรด้านล่างนี้
( เราจะใช้สูตรนี้คำนวณเมื่อเคลื่อนที่แค่ 8 ทิศทาง (คล้ายกับการเคลื่อนย้าย
King in Chess )
h = max { abs(current_cell.x –
goal.x), abs(current_cell.y – goal.y) }
รูปภาพที่ 4. ตัวอย่างที่สามารถคำนวณด้วยวิธี
Diagonal Distance ได้
ที่มา :
https://www.geeksforgeeks.org/a-search-algorithm/
3. Euclidean
Distance
ใช้สูตรระยะทางในการคำนวณ
ตามข้างล่างนี้
เราใช้สูตรนี้คำนวณเมื่อเราเคลื่อนที่ไปทิศทางใดก็ได้
h = sqrt ( (current_cell.x – goal.x)2
+ (current_cell.y – goal.y)2 )
รูปภาพที่ 5. ตัวอย่างที่สามารถคำนวณด้วยวิธี
Euclidean Distance ได้
ที่มา :
https://www.geeksforgeeks.org/a-search-algorithm/
เราสามารถใช้ Fibonacci heap เพื่อนำไปเปิดรายการแทนการใช้ binary
heap/self-balancing tree และมันจะมีประสิทธิภาพที่ดีกว่า เพื่อเป็นการลดระยะเวลาในการคำนวณ g เราจะใช้การเขียนโปรแกรมแบบ dynamic ดังตัวอย่างข้างล่างนี้
(โค้ดแค่บางส่วนเท่านั้น) สามารถเข้าไปดูโค้ดที่สมบูรณ์ได้ที่เว็บไซต์ด้านล่าง
// A C++ Program to implement A* Search Algorithm
#include<bits/stdc++.h>
using
namespace
std;
#define
ROW 9
#define
COL 10
// Creating a shortcut for int, int pair type
typedef
pair<int, int> Pair;
// Creating a shortcut for pair<int, pair<int, int>>
type
typedef
pair<double, pair<int,
int>> pPair;
// A structure to hold the neccesary parameters
struct
cell
{
//
Row and Column index of its parent
//
Note that 0 <= i <= ROW-1 & 0 <= j <= COL-1
int
parent_i, parent_j;
//
f = g + h
double
f, g, h;
};
A* Search Algorithm
สามารถนำไปใช้ในเกมต่างๆได้ เช่น
เกม Tower Defense Games เป็นประเภทของวิดีโอเกมที่มีเป้าหมายคือ เพื่อปกป้องดินแดนและหรือทรัพย์สมบัติของผู้เล่น โดยขัดขวางการโจมตีจากฝ่ายตรงข้าม ทำได้โดยวางโครงสร้างการป้องกันบนหรือตามแนวเส้นทางการโจมตี
A* Search Algorithm จะถูกนำมาใช้ในการหาเส้นทางที่สั้นที่จุดจากจุดหนึ่งไปยังอีกจุดหนึ่ง เราสามารถใช้ A* Search Algorithm เพื่อหาเส้นทางไปยังจุดเป้าหมาย
ความซับซ้อนของเวลา
พิจารณาจากกราฟ มันจะพาเราเดินทางไปทุกจุดเพื่อไปยังจุดเป้าหมาย
เช่น พิจารณากราฟที่จุดเริ่มต้นและจุดเป้าหมายเชื่อมต่อกันเป็นชุดของด้าน คือ – 0(source) –>1 –> 2
–> 3 (target)
ความซับซ้อนของเวลาในกรณีที่แย่ๆ คือ O(E) เมื่อ E คือ จำนวนด้านในกราฟ
Auxiliary Space
Auxiliary space ในกรณีที่แย่
คือ O(V) เมื่อ V
คือ จำนวนจุดทั้งหมด
บทสรุป
1. มีจุดกำเนิดหนึ่งจุดและจุดเป้าหมายอีกหนึ่งจุด
1. มีจุดกำเนิดหนึ่งจุดและจุดเป้าหมายอีกหนึ่งจุด
→ ใช้
A* Search Algorithm เมื่อเป็นการไม่ถ่วงน้ำหนักและกราฟถ่วงน้ำหนัก
2. มีจุดกำเนิดหนึ่งจุด
และมีจุดเป้าหมายหลายจุด
→ ใช้ BFS เมื่อเป็นกราฟไม่ถ่วงน้ำหนัก
→ ใช้ BFS เมื่อเป็นกราฟไม่ถ่วงน้ำหนัก
→ใช้ Dijkstra เมื่อเป็นกราฟถ่วงน้ำหนักที่ไม่มีตัวเลขติดลบ
→ ใช้ Bellman Ford เมื่อเป็นกราฟถ่วงน้ำหนักที่มีตัวเลขติดลบ
3) ระหว่างทุกคู่ของจุด
→ ใช้
Floyd-Warshall และ Johnson’s Algorithm
วิดีโออธิบาย A* Search Algorithm
ขอบคุณแหล่งข้อมูลจาก
https://www.geeksforgeeks.org/a-search-algorithm/
https://www.youtube.com/watch?v=KNXfSOx4eEE&t=4s
https://www.youtube.com/watch?v=eSOJ3ARN5FM&t=208s
วิดีโออธิบาย A* Search Algorithm
https://www.geeksforgeeks.org/a-search-algorithm/
https://www.youtube.com/watch?v=KNXfSOx4eEE&t=4s
https://www.youtube.com/watch?v=eSOJ3ARN5FM&t=208s
.
ความคิดเห็น
แสดงความคิดเห็น