It uses a ridiculous bastardisation of Dijkstra's algorithm to work out the shortest set of operations to get the piece from where it is to where it needs to be. This includes a way for it to notice that it would like to run into another piece, and then add to the search tree a copy of the current node, but with some operations inserted at the start to first move that piece out of the way.
It's in here, but not for the faint-hearted: https://github.com/jes/autopatzer/blob/master/mojo/lib/Autop...
I did try giving it an accurate model of the acceleration curve of the stepper motors, so that it would do the set of moves that actually took the least time, but that led to strange motions where it would deliberately move pieces too far, and then back again at a diagonal, just to minimise the number of corners it needs to turn, so I instead just made it do a simple shortest-path, because it looks more natural to a human observer.
I.e. instead of going 2 squares right, then 2 squares up, then 1 square diagonal up-left, it would prefer to go 4 squares right, then 3 squares diagonal up-left. It takes less time, but looks stupid.