Para rompecabezas aleatorios, ninguno que yo conozca. Aparte de buscar pares de bordes de piezas que coincidan, la mayor dificultad sería que la aplicación adivinara continuamente cuál es la imagen final posiblemente de una base de datos de todas las imágenes posibles, y el único sistema que conozco capaz de hacer algo así es la búsqueda inversa de imágenes de Google. Tendría que tener acceso a esos patrones de datos formados por deep learning.
Puede acotar las posibilidades de la base de datos de Google promediando el color de todas las piezas revueltas, el nivel de detalle, la luminosidad, etc. y la posible identificación de objetos familiares como caras, flores, edificios, etc.
Pero si se trata de una app a la que sólo se le daría la solución desde el principio (imagen resuelta) y sólo quieres que trace los pasos necesarios para llegar a la solución a partir de un revoltijo dado, esto es mucho más fácil de programar.
No, lo siento, aún no conozco ninguna de improviso.
Edición: 2018 0406
He vuelto a pensar en esto y hay otra solución más sencilla (computacionalmente cara, pero que no requiere un conjunto de datos de aprendizaje automático).
La máquina tendrá en cuenta tres variables de cada pieza: un valor de color medio, algún valor de tipo para identificar posibles líneas o patrones en una pieza, como la varianza de color o el valor de Fourier, y finalmente la forma de los bordes.
Agrupa los colores similares en general.
Define la agrupación agrupando los patrones similares.
Con la forma de los bordes, determina la orientación o el lado derecho si es posible (muchas piezas de rompecabezas tienen lados con algunos bordes planos que te dan una pista sobre la orientación).
... Y luego hace que el sistema trate de emparejar las piezas dentro de esos grupos. Y finalmente un algoritmo de barrido para tomar todas las piezas no emparejadas y empezar a emparejarlas con todas las demás piezas del conjunto. No sé cómo, no soy un programador todavía y todavía estoy aprendiendo.