Publiqué esta pregunta anteriormente en stackoverflow, donde se cerró como fuera de tema. Espero que sobreviva aquí.
En nuestro gimnasio de escalada, las rutas deben volver a establecerse de vez en cuando. Se aplican las siguientes reglas:
- Tenemos presas de escalada con diferentes colores en diferentes cantidades. - Cuando se establece una ruta en un sector, no se debe establecer ninguna otra ruta con el mismo color en ese sector o en los sectores cercanos para evitar confusiones.
- Deben evitarse algunas combinaciones de colores en un sector, como blanco / gris o rojo / rosa.
- El objetivo es tener cuatro rutas en cada sector, menos está bien si cuatro rompen las reglas anteriores.
He probado dos enfoques diferentes por ahora. El primero fue el recocido simulado donde inicialicé la pared con un patrón aleatorio de colores (pero con un peso de color dado) y calculé una maldad para cada combinación de colores. Esta maldad también se calculó para combinaciones entre un sector y sus vecinos. En cada iteración, una ruta elegida aleatoriamente del peor sector se intercambió con una ruta de otro sector elegido aleatoriamente. Esto mostró algún tipo de convergencia, pero el resultado no era utilizable (es decir, el estado resultante contenía sectores con colores dobles o triples).
Luego abordé el problema desde el lado opuesto y comencé con una pared vacía. Esta vez, cada color tenía una concentración que decaía de un sector a los sectores adyacentes. También se aumentó la concentración de colores similares, es decir, una ruta roja aumentó la concentración de naranja en un sector y sus alrededores. Una fuente aleatoria ponderada de colores (el cubo) me dio el siguiente color para la pared, que se colocó en el sector con la concentración más baja de este color. Si una concentración estaba por encima de cierto umbral, el color no se agregaba (sino que se volvía a colocar en el cubo). Esto fue un éxito parcial porque el estado del resultado no contenía ningún color doble, pero algunos sectores estaban vacíos o solo contenían un color.
Entonces: ¿Cuál podría ser un algoritmo apropiado para resolver este problema, dadas las reglas anteriores? Con mucho gusto agregaré más información cuando sea necesario.
Edición 1 - Más información:
- mi caso de prueba tiene 15 sectores,
- cada sector debe contener 4 rutas
- El gimnasio real tiene 3 edificios con un promedio de 50 sectores cada uno.
- algunos sectores están dispuestos alrededor de pilares, algunos están conectados por techos
- tenemos alrededor de 10 colores de espera diferentes
- La altura de los sectores varía entre 6 (sección de principiante) y 20 metros (13 vertical + 7 techo), por lo que consumen diferentes cantidades de bodegas. Sin embargo, el promedio es de aproximadamente 12 y esto puede considerarse constante.
- hay una cantidad limitada de cada color, las cantidades no son iguales
- algunos colores son más fáciles, otros más difíciles (es decir, podemos crear una ruta amarilla de cualquier dificultad, mientras que crear una ruta naranja muy fácil para los niños será casi imposible)
- algunos sectores son "más fáciles", por lo que los colores fáciles deberían ir allí (esto es opcional, nuestros creadores de rutas pueden hacer las cosas más difíciles o más fáciles dentro de un amplio rango).
- podemos decir con seguridad qué colores combinan bien en un sector o en sectores vecinos y qué combinaciones no. Hay algunas sorpresas, como el blanco y el negro (mal combo): ambos se vuelven grises mientras les quedan goma (zapatos) o tiza (manos).
- algunos colores de retención son combinaciones como violeta / blanco (en un patrón de rayas).
Edición 2: Algunas preguntas sobre algoritmos genéticos
Ahora descargué y compilé ParadisEO e incluso obtuve mi IDE (estoy usando Code :: Blocks) para compilar el ejemplo QuickStart. ParadisEO ofrece algoritmos genéticos con un solo objetivo, así como GA multiabjetivo. GertVdE sugirió calcular la idoneidad de cada sector y maximizar la suma de las idoneidades de todos los sectores como un solo objetivo. ¿Podría también maximizar la idoneidad de cada sector con una AG multipropósito? Eso sería unos 50 objetivos.
Además, estoy luchando con la definición de una función de cruce sensible. Como la cantidad máxima de cada color es fija, el cruce puede conducir a estados ilegales. Si permito más que la cantidad máxima dada anteriormente, el patrón general podría converger en una repetición de combinaciones menos "difíciles" donde los colores problemáticos han sido desechados. Por otro lado, también puedo tirar el exceso de colores hasta alcanzar el máximo, haciendo que la función de cruce no sea conservadora.
(Soy completamente nuevo en algoritmos genéticos)