o
    Ë3dè  ã                   @   s˜   d dl Z d dlZd dlmZmZmZmZmZm	Z	m
Z
mZmZ dd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    N)	ÚGrid2DÚGridDiagonal2DÚGridQueen2DÚGridGreatKing2DÚ
GridRook2DÚGridJumper2DÚGrid3DÚGridFaceDiagonal3DÚGridAllDiagonal3Dc                 C   s   dd„ t | |ƒD ƒS )Nc                 S   s   g | ]
\}}t || ƒ‘qS © )Úabs)Ú.0ÚaÚbr   r   úVC:\Users\mikol\Documents\MFF-PRG\LS2023\UdAI\working\01-a_star_heuristic\heuristics.pyÚ
<listcomp>   s    z/distance_in_each_coordinate.<locals>.<listcomp>)Úzip)ÚxÚyr   r   r   Údistance_in_each_coordinate   s   r   c           
         sÒ   ‡ fdd„t ˆ ƒD ƒ}d|d d< dg}d}|t|ƒk rg|| }|d7 }||d  |d  d }|  |¡D ]+}t|d ƒ}t|d ƒ}	|ˆ k r`|	ˆ k r`|| |	 dkr`||| |	< | ||	f¡ q5|t|ƒk s|S )a€  
        For a given graph (derived from Grid) and size, calculate lengths of shortest paths from (0,0) to all vertices (a,b) where 0 <= a < size and 0 <= b < size.
        Returns a matrix dists (a list of lists) where dists[a][b] is the length of the shortest path between (0,0) to (a,b) in the graph.
        Warning: Vertices of the graph must be two dimensional coordinates.
    c                    s   g | ]}d d„ t ˆ ƒD ƒ‘qS )c                 S   s   g | ]}d ‘qS )éÿÿÿÿr   ©r   Ú_r   r   r   r      s    z1calculate_distance.<locals>.<listcomp>.<listcomp>)Úranger   ©Úsizer   r   r      s    z&calculate_distance.<locals>.<listcomp>r   )r   r   é   r   )r   ÚlenZ
neighboursr   Úappend)
Úgraphr   ÚdistsÚqueueÚheadÚuÚdÚvr   r   r   r   r   Úcalculate_distance   s"    €÷
r&   c                 C   s   t | |ƒ\}}|| S ©N©r   ©ÚcurrentÚdestinationr   r   r   r   r   Úgrid_2D_heuristic'   s   r,   c                 C   s.   t | |ƒ\}}||kr|||  S |||  S r'   r(   r)   r   r   r   Úgrid_diagonal_2D_heuristic,   s   r-   c                 C   s   t | |ƒ\}}}|| | S r'   r(   )r*   r+   r   r   Úzr   r   r   Úgrid_3D_heuristic4   s   r/   c                 C   s*   t | |ƒ}tt t|ƒd ¡t|ƒƒ}|S )Né   )r   ÚmaxÚmathÚceilÚsum©r*   r+   ÚnÚtr   r   r   Úgrid_face_diagonal_3D_heuristic9   s   
r8   c                 C   s\   d}t  t| |ƒ¡}|jd dkr*t|ƒ}||8 }||7 }||dk }|jd dks| ¡ S )Nr   )ÚnpÚarrayr   ÚshapeÚminÚitem©r*   r+   Ú
total_distr6   Úmr   r   r   Úgrid_all_diagonal_3D_heuristic>   s   ürA   c                 C   s¼   d}t  t| |ƒ¡}|jd dkr6t|ƒ}|d dkr|d7 }||d 7 }||8 }||dk }|jd dkst| |ƒ}|d |d  }|d dkrRt| ¡ |d ƒS t| ¡ t |d ¡ƒS ©Nr   é   r   )r9   r:   r   r;   r<   r=   r2   r3   )r*   r+   r?   r6   r@   Ztmp_arrZtmp_sumr   r   r   Úgrid_queen_2D_heuristicH   s   ú
rD   c                 C   s:   d}t | |ƒ}t|ƒ}||d 7 }|d dkr|d7 }|S rB   )r   r1   r>   r   r   r   Úgrid_great_king_2D_heuristic[   s   
rE   c                 C   sœ   d}t | |ƒ\}}|dkr"|}|d }||7 }||d kr!|d7 }n|dkr*|d7 }|dkrD|}|d }||7 }||d krB|d7 }|S |dkrL|d7 }|S rB   r(   )r*   r+   r?   r   r   Zold_xÚtempZold_yr   r   r   Úgrid_rook_2D_heuristicd   s*   €ýrG   c                 C   sX   t | |ƒ}t t|d d |d d |d |d  d ƒ¡}|||d  |d  d  S )Nr   é   r   é   r0   )r   r2   r3   r1   r5   r   r   r   Úgrid_jumper_2D_heuristic{   s   
2rJ   )r2   Únumpyr9   Úgraphsr   r   r   r   r   r   r   r	   r
   r   r&   r,   r-   r/   r8   rA   rD   rE   rG   rJ   r   r   r   r   Ú<module>   s   ,
	