Trong khoa hoc may tinh, A* (đoc la A sao) la  thuat toan tim kiem trong đo thi. Thuat toan nay tim mot đuong đi tu mot nut khoi đau toi mot  nut đich cho truoc (hoac toi mot nut thoa man mot đieu kien đich). Thuat toan nay su dung mot "đanh gia heuristic" đe xep loai tung nut theo uoc luong ve tuyen đuong tot nhat đi qua nut đo. Thuat toan nay duyet cac nut theo thu tu cua đanh gia heuristic nay. Do đo, thuat toan A* la mot vi du cua tim kiem theo lua chon tot nhat (best-first search).
Thuat toan A* đuoc mo ta lan đau vao nam 1968 boi Peter Hart, Nils Nilsson, va Bertram Raphael. Trong bai bao cua ho, thuat toan đuoc goi la thuat toan A; khi su dung thuat toan nay voi mot đanh gia heuristic thich hop se thu đuoc hoat đong toi uu, do đo ma co ten A*.
Nam 1964, Nils Nilsson phat minh ra mot phuong phap tiep can dua tren kham pha đe tang toc đo cua thuat toan Dijkstra. Thuat toan nay đuoc goi la A1. Nam 1967 Bertram Raphael đa cai thien đang ke thuat toan nay, nhung khong the hien thi toi uu. Ong goi thuat toan nay la A2. Sau đo, trong nam 1968 Peter E. Hart đa gioi thieu mot đoi so chung minh A2 la toi uu khi su dung thuat toan nay voi mot đanh gia heuristic thich hop se thu đuoc hoat đong toi uu. Chung minh cua ong ve thuat toan cung bao gom mot phan cho thay rang cac thuat toan A2 moi la thuat toan tot nhat co the đuoc đua ra cac đieu kien. Do đo ong đat ten cho thuat toan moi la A *(A sao, A-star).


Y tuong truc quan Xet bai toan tim đuong - bai toan ma A* thuong đuoc dung đe giai. A* xay dung tang dan tat ca cac tuyen đuong tu điem xuat phat cho toi khi no tim thay mot đuong đi cham toi đich. Tuy nhien, cung nhu tat ca cac thuat toan tim kiem co thong tin (informed search algorithm), no chi xay dung cac tuyen đuong "co ve" dan ve phia đich.
Đe biet nhung tuyen đuong nao co kha nang se dan toi đich, A* su dung mot "đanh gia heuristic" ve khoang cach tu điem bat ky cho truoc toi đich. Trong truong hop tim đuong đi, đanh gia nay co the la khoang cach đuong chim bay - mot đanh gia xap xi thuong dung cho khoang cach cua đuong giao thong.
Điem khac biet cua A* đoi voi tim kiem theo lua chon tot nhat la no con tinh đen khoang cach đa đi qua. Đieu đo lam cho A* "đay đu" va "toi uu", nghia la, A* se luon luon tim thay đuong đi ngan nhat neu ton tai mot đuong đi nhu vay. A* khong đam bao se chay nhanh hon cac thuat toan tim kiem đon gian hon. Trong mot moi truong dang me cung, cach duy nhat đe đen đich co the la truoc het phai đi ve phia xa đich va cuoi cung moi quay lai. Trong truong hop đo, viec thu cac nut theo thu tu "gan đich hon thi đuoc thu truoc" co the gay ton thoi gian.


Mo ta thuat toan A* luu giu mot tap cac loi giai chua hoan chinh, nghia la cac đuong đi qua đo thi, bat đau tu nut xuat phat. Tap loi giai nay đuoc luu trong mot hang đoi uu tien (priority queue). Thu tu uu tien gan cho mot đuong đi 
  
    
      
        x
      
    
    {\displaystyle x}
  
 đuoc quyet đinh boi ham 
  
    
      
        f
        (
        x
        )
        =
        g
        (
        x
        )
        +
        h
        (
        x
        )
      
    
    {\displaystyle f(x)=g(x)+h(x)}
  
.
Trong đo, 
  
    
      
        g
        (
        x
        )
      
    
    {\displaystyle g(x)}
  
 la chi phi cua đuong đi cho đen thoi điem hien tai, nghia la tong trong so cua cac canh đa đi qua. 
  
    
      
        h
        (
        x
        )
      
    
    {\displaystyle h(x)}
  
 la ham đanh gia heuristic ve chi phi nho nhat đe đen đich tu 
  
    
      
        x
      
    
    {\displaystyle x}
  
. Vi du, neu "chi phi" đuoc tinh la khoang cach đa đi qua, khoang cach đuong chim bay giua hai điem tren mot ban đo la mot đanh gia heuristic cho khoang cach con phai đi tiep.
Ham 
  
    
      
        f
        (
        x
        )
      
    
    {\displaystyle f(x)}
  
 co gia tri cang thap thi đo uu tien cua 
  
    
      
        x
      
    
    {\displaystyle x}
  
 cang cao (do đo co the su dung mot cau truc heap toi thieu đe cai đat hang đoi uu tien nay)

function A*(điem_xuat_phat,đich)
    var đong:= tap rong
    var q:= tao_hang_đoi(tao_đuong_đi(điem_xuat_phat))
    while q khong phai tap rong
        var p:= lay_phan_tu_đau_tien(q)
        var x:= nut cuoi cung cua p
        if x in đong
            continue
        if x = đich
            return p
        bo sung x vao tap đong
        foreach y in cac_đuong_đi_tiep_theo(p)
            đua_vao_hang_đoi(q, y)
    return failure

Trong đo, cac_đuong_đi_tiep_theo(p) tra ve tap hop cac đuong đi tao boi viec keo dai p them mot nut ke canh. Gia thiet rang hang đoi đuoc sap xep tu đong boi gia tri cua ham 
  
    
      
        f
      
    
    {\displaystyle f}
  
.
"Tap hop đong" (đong) luu giu tat ca cac nut cuoi cung cua p (cac nut ma cac đuong đi moi đa đuoc mo rong tai đo) đe tranh viec lap lai cac chu trinh (viec nay cho ra thuat toan tim kiem theo đo thi). Đoi khi hang đoi đuoc goi mot cach tuong ung la "tap mo". Tap đong co the đuoc bo qua (ta thu đuoc thuat toan tim kiem theo cay) neu ta đam bao đuoc rang ton tai mot loi giai hoac neu ham cac_đuong_đi_tiep_theo đuoc chinh đe loai bo cac chu trinh.


Cac tinh chat Cung nhu tim kiem theo chieu rong (breadth-first search), A* la thuat toan đay đu (complete) theo nghia rang no se luon luon tim thay mot loi giai neu bai toan co loi giai.
Neu  ham heuristic 
  
    
      
        h
      
    
    {\displaystyle h}
  
 co tinh chat thu nap đuoc (admissible), nghia la no khong bao gio đanh gia cao hon chi phi nho nhat thuc su cua viec đi toi đich, thi ban than A* co tinh chat thu nap đuoc (hay toi uu) neu su dung mot tap đong. Neu khong su dung tap đong thi ham 
  
    
      
        h
      
    
    {\displaystyle h}
  
 phai co tinh chat đon đieu (hay nhat quan) thi A* moi co tinh chat toi uu. Nghia la no khong bao gio đanh gia chi phi đi tu mot nut toi mot nut ke no cao hon chi phi thuc. Phat bieu mot cach hinh thuc, voi moi nut 
  
    
      
        x
        ,
        y
      
    
    {\displaystyle x,y}
  
 trong đo 
  
    
      
        y
      
    
    {\displaystyle y}
  
 la nut tiep theo cua 
  
    
      
        x
      
    
    {\displaystyle x}
  
:

  
    
      
        h
        (
        x
        )
        ≤
        g
        (
        y
        )
        −
        g
        (
        x
        )
        +
        h
        (
        y
        )
      
    
    {\displaystyle h(x)\leq g(y)-g(x)+h(y)}
  

A* con co tinh chat hieu qua mot cach toi uu (optimally efficient) voi moi ham heuristic 
  
    
      
        h
      
    
    {\displaystyle h}
  
, co nghia la khong co thuat toan nao cung su dung ham heuristic đo ma chi phai mo rong it nut hon A*, tru khi co mot so loi giai chua đay đu ma tai đo 
  
    
      
        h
      
    
    {\displaystyle h}
  
 du đoan chinh xac chi phi cua đuong đi toi uu.


Bai toan minh hoa Cho mot ban co kich thuoc n x n. Hay tim đuong đi ngan nhat tu điem 〇 đen điem △ biet rang

Cac o trang la đuong đi
Cac o đen la vat can, khong đi đuoc
Tai mot o bat ky, chi co the đi len, xuong, trai, phai neu khong bi can. Khong đuoc đi cheo
Trong bai toan tren ta thay rang đuong đi ngan nhat la đuong cheo noi tu 〇 đen △
chieu dai đuong cheo đuoc tinh bang cong thuc 
  
    
      
        h
        (
        x
        )
        =
        
          
            
              a
              
                2
              
            
            +
            
              b
              
                2
              
            
          
        
        =
        
          
            
              7
              
                2
              
            
            +
            
              5
              
                2
              
            
          
        
        =
        8.6
      
    
    {\displaystyle h(x)={\sqrt {a^{2}+b^{2}}}={\sqrt {7^{2}+5^{2}}}=8.6}
  

Khi di chuyen qua moi o thi gia tri cua o se tang len 1 đon vivi la 
  
    
      
        f
        (
        x
        )
        =
        g
        (
        x
        )
        +
        h
        (
        x
        )
      
    
    {\displaystyle f(x)=g(x)+h(x)}
  
 nen ta co bang nhu sau:Tiep theo tu vi tri 0 se duyet cac o lan can no đe tim ra đuong ngan nhat
Vi du
Xet lai điem P(0,0) thi co 2 điem lien ke no la ben phai P(1,0) va ben duoi P(0,1)  va gia tri 
  
    
      
        f
        (
        x
        )
        =
        g
        (
        x
        )
        +
        h
        (
        x
        )
        =
        3.2
      
    
    {\displaystyle f(x)=g(x)+h(x)=3.2}
  

vi 2 gia tri bang nhau nen chon điem nao cung đuoc. O Step 2 thi đang chon điem P(1,0)
Điem P(1,0) co 2 điem lien ke co gia tri lan luot la: 
  
    
      
        P
        (
        2
        ,
        0
        )
        =
        5.2
        ,
        P
        (
        1
        ,
        1
        )
        =
        4.8
      
    
    {\displaystyle P(2,0)=5.2,P(1,1)=4.8}
  
 cong voi P(0,1) đang co san thi ta co 3 điem 
  
    
      
        P
        (
        0
        ,
        1
        )
        =
        3.2
        ,
        P
        (
        2
        ,
        0
        )
        =
        5.2
        ,
        P
        (
        1
        ,
        1
        )
        =
        4.8
      
    
    {\displaystyle P(0,1)=3.2,P(2,0)=5.2,P(1,1)=4.8}
  

Theo minh, ham đanh gia o vi du tren tinh sai va so sanh giua 2 gia tri f(x) va h(x) la khac nhau nen viec so sanh 2 gia tri đo la sai. Đong thoi node can di chuyen toi la node co gia tri ham f(x) nho nhat, chu khong phai gan gia tri f(x) cua node đich (o vi du tren la h(x) tai node đich la 8.6). Cac ban can tham khao them tai lieu, tranh sai sot khi chi tim kiem tren wikipedia. uet maidinh

Gia tri 
  
    
      
        P
        (
        2
        ,
        0
        )
        =
        5.2
      
    
    {\displaystyle P(2,0)=5.2}
  
 la gia tri gan voi gia tri 8.6 nhat. nen P(2,0) đuoc chon lam gia tri xet tiep theo. tuong tu cac buoc tren ta đuoc bang nhu duoi.Sau khi cham đuoc đen điem △ thi ta đuoc so đo đuong đi ngan nhat nhu sau:


= Quan he voi tim kiem chi phi đeu (uniform-cost search) =
Thuat toan Dijkstra la mot truong hop đac biet cua A* trong đo đanh gia heuristic la mot ham hang 
  
    
      
        h
        (
        x
        )
        =
        0
      
    
    {\displaystyle h(x)=0}
  
 voi moi 
  
    
      
        x
      
    
    {\displaystyle x}
  
.


Đo phuc tap thuat toan Đo phuc tap thoi gian cua A* phu thuoc vao đanh gia heuristic. Trong truong hop xau nhat, so nut đuoc mo rong theo ham mu cua đo dai loi giai, nhung no se la ham đa thuc khi ham heuristic h thoa man đieu kien sau:

  
    
      
        
          |
        
        h
        (
        x
        )
        −
        
          h
          
            ∗
          
        
        (
        x
        )
        
          |
        
        ≤
        O
        (
        log
        ⁡
        
          h
          
            ∗
          
        
        (
        x
        )
        )
      
    
    {\displaystyle |h(x)-h^{*}(x)|\leq O(\log h^{*}(x))}
  

trong đo 
  
    
      
        
          h
          
            ∗
          
        
      
    
    {\displaystyle h^{*}}
  
 la heuristic toi uu, nghia la ham cho ket qua la chi phi chinh xac đe đi tu 
  
    
      
        x
      
    
    {\displaystyle x}
  
 toi đich. Noi cach khac, sai so cua h khong nen tang nhanh hon logarit cua "heuristic hoan hao" 
  
    
      
        
          h
          
            ∗
          
        
      
    
    {\displaystyle h^{*}}
  
 - ham tra ve khoang cach thuc tu x toi đich (Russell va Norvig 2003, tr. 101).
Van đe su dung bo nho cua A* con rac roi hon đo phuc tap thoi gian. Trong truong hop xau nhat, A* phai ghi nho so luong nut tang theo ham mu. Mot so bien the cua A* đa đuoc phat trien đe đoi pho voi hien tuong nay, mot trong so đo la A* lap sau dan (iterative deepening A*), A* bo nho gioi han (memory-bounded A* - MA*) va A* bo nho gioi han đon gian (simplified memory bounded A*).
Mot thuat toan tim kiem co thong tin khac cung co tinh chat toi uu va đay đu neu đanh gia heuristic cua no la thu nap đuoc (admissible). Đo la tim kiem đe quy theo lua chon tot nhat (recursive best-first search - RBFS).


Tham khao Hart, P. E. (1968). "A Formal Basis for the Heuristic Determination of Minimum Cost Paths". IEEE Transactions on Systems Science and Cybernetics SSC4. So 2. Nilsson, N. J.; Raphael, B. tr. 100–107.
Hart, P. E. (1972). "Correction to "A Formal Basis for the Heuristic Determination of Minimum Cost Paths"". SIGART Newsletter. Quyen 37. Nilsson, N. J.; Raphael, B. tr. 28–29.
Nilsson, N. J. (1980). Principles of Artificial Intelligence. Palo Alto, California: Tioga Publishing Company.
Russell, S. J. (2003). Artificial Intelligence: A Modern Approach. Norvig, P. tr. 97-104.


Lien ket ngoai Tieng Anh:

Justin Heyes-Jones' A* algorithm tutorial
Herbert Glarner's Interactive Single Step Simulation in VB 6.0, implemented as a DLL, including a GUI allowing simulation in user-defined grids.
Another A* Pathfinding for Beginners Luu tru ngay 24 thang 12 nam 2005 tai Wayback Machine (note: incorrectly states that A* always needs a "closed set")
Amit's Thoughts on Path-Finding and A*
Sven Koenig's Demonstration of Lifelong Planning A* and A*
Tony Stentz's Papers on D* (Dynamic A*) Path-Finding Luu tru ngay 12 thang 9 nam 2006 tai Wayback Machine
Remko Troncon and Joost Vennekens's JSearch demo Luu tru ngay 15 thang 7 nam 2006 tai Wayback Machine: demonstrates various search algorithms, including A*.
Sune Trudslev's Path finding in C# article Luu tru ngay 21 thang 7 nam 2006 tai Wayback Machine