La pregunta se acerca a la Sokoban juego (¡gracias a Dima Pasechnik!), pero un poco diferente en los detalles.
Consideremos un grafo dirigido (multigrafos). Considerar un conjunto de fichas marcadas (ficha1, ficha2,..., fichaM). Poner las fichas en un conjunto de vértices 'Init1','Init2','Init3'... Y considera otro conjunto de vértices 'Final1','Final2',..., 'FinalM'.
Pregunta Proponer un algoritmo "eficiente" que determine si es posible "MOVER" fichas de las posiciones "InitNN" a las posiciones 'FinalNN'.
Donde se nos permite "MOVER" la ficha de un vértice a una arista saliente y de la arista entrante al vértice correspondiente. Con la RESTRICCIÓN de que dos fichas NO pueden estar en el mismo lugar. Un movimiento - mueve sólo UNA ficha. La fichaK debe ir a la posición FinalK - la misma "K".
Pregunta Puede haber muchos enfoques para resolver el problema, me interesa en analizar su complejidad. Cualquier idea es bienvenida. Por ejemplo, si el gráfico es "aleatorio" en cierto sentido, ¿cuál puede ser el algoritmo de menor complejidad media?
Donde la complejidad se cuenta en número de operaciones (escriba un código C (en realidad escribí un código Matlab), compile y calcule el número de ciclos - esta es una medida de complejidad bien definida, diferentes compiladores y CPU darán aproximadamente el mismo resultado).
Ejemplo de algoritmo Parece que la forma más sencilla de resolver un problema es la siguiente. Esencialmente puede reducirse a determinar dónde están conectados dos vértices en algún grafo mayor, lo que a su vez puede resolverse mediante la "búsqueda de amplitud" ("algoritmo de onda" en ruso) (quiero decir que enumeremos todas las todas las configuraciones posibles de los chips - esto dará vértices del "nuevo gráfico". Conectemos dos vértices (configuraciones) si hay un "MOVE" que va de uno a otro). Por "búsqueda de amplitud" ("algoritmo de onda" en ruso) me refiero a lo siguiente: tomar un vértice inicial y encontrar todos los conectados a él; en el siguiente paso encontrar todos los vértices conectados a los vértices encontrados en el paso anterior; y así sucesivamente....
Pregunta ¿Qué hay de la eficiencia de este algoritmo? ¿Se puede proponer algo mejor?
0 votos
No está claro cuáles son los movimientos permitidos. ¿Estás moviendo los vértices 'init_j' al mismo tiempo? Por cierto, el "algoritmo de onda" parece ser lo que se llama "breadth-first search" en inglés.
0 votos
Un "MOVE" - mueve SOLO UN marcador. ¿Está clara la descripción ahora? @Dima ¡Gracias por tu comentario!
0 votos
En mi opinión, es mejor formular esto en términos de $m$ fichas colocadas en los nodos de su dígrafo $G$ , como máximo una ficha en un nodo, y cada movimiento en este juego, cuyo objetivo es colocar fichas en un subconjunto fijo de nodos "finales", consiste en mover una ficha en un nodo $v$ al otro extremo $u$ de un arco $vu$ sin violar la condición de que haya como máximo un chip en un nodo.
0 votos
Parece ser un problema computacionalmente difícil, en el sentido de que cada algoritmo necesitará un tiempo exponencial en $m$ .
0 votos
@Dima ¿quieres decir que el nombre "chip" es mejor que "marcador" ? ( "" - ¿cuál debería ser la traducción de "" ? ¿"chip"?
0 votos
Sí, chip=""
0 votos
@Dima ¡gracias por los comentarios! Usted es bienvenido a editar la pregunta.
0 votos
Parece que la estrategia alternativa es "deapth-first" - por ejemplo, determinar si "chipN" se puede mover a la posición "FinalN", si NO - entonces problema resuelto - la respuesta es NO. En caso afirmativo, debemos buscar una solución que satisfaga el CONTSTRAINT, por ejemplo, para pares de "fichas", luego para triples de "fichas" y así sucesivamente... Sin embargo, no está claro para mí cómo hacer esto ... y si vamos a obtener algún aumento significativo de la complejidad, al menos en algunos gráficos "al azar"?
0 votos
En lugar de BFS, se puede utilizar A*, que es como BFS, pero con una heurística. Uno puede ciertamente cocinar algunas heurísticas razonables para este juego (número de fichas en la posición final, etc)