2009-07-09 13 views
7

Estoy usando simulated annealing para resolver un problema de programación de recursos NP-completo. Para cada pedido de candidatos de las tareas, calculo varios costos diferentes (o valores de energía). Algunos ejemplos son (aunque los detalles son probablemente irrelevante para la cuestión):¿Cómo diseñar la función de probabilidad de aceptación para el recocido simulado con múltiples costos distintos?

  • global_finish_time: El número total de días que los tramos horarios.
  • split_cost: el número de días que cada tarea se retrasa debido a interrupciones por otras tareas (esto tiene como objetivo desalentar la interrupción de una tarea una vez que ha comenzado).
  • deadline_cost: La suma del número cuadrado de días por el que se venció cada fecha de vencimiento.

La función tradicional de probabilidad de aceptación es el siguiente (en Python):

def acceptance_probability(old_cost, new_cost, temperature): 
    if new_cost < old_cost: 
     return 1.0 
    else: 
     return math.exp((old_cost - new_cost)/temperature) 

Hasta ahora he combinado mis dos primeros costes en uno por la simple adición de ellos, de modo que pueda alimentar el resultado en acceptance_probability. Pero lo que realmente quiero es que deadline_cost siempre tenga prioridad sobre global_finish_time, y que global_finish_time tenga prioridad sobre split_cost.

Así que mi pregunta para Stack Overflow es: ¿cómo puedo diseñar una función de probabilidad de aceptación que tenga en cuenta múltiples energías pero siempre considera que la primera energía es más importante que la segunda, y así sucesivamente? En otras palabras, me gustaría pasar old_cost y new_cost como tuplas de varios costos y devolver un valor razonable.

Editar: Después de unos días de experimentar con las soluciones propuestas he concluido que la única forma en que funciona lo suficientemente bien como para mí es la sugerencia de Mike Dunlavey, a pesar de que esto crea muchas otras dificultades con componentes de costos que tienen diferentes unidades . Estoy prácticamente obligado a comparar manzanas con naranjas.

Por lo tanto, hice un esfuerzo para "normalizar" los valores. En primer lugar, deadline_cost es una suma de cuadrados, por lo que crece exponencialmente mientras que los otros componentes crecen linealmente. Para abordar esto, uso la raíz cuadrada para obtener una tasa de crecimiento similar. Segundo, desarrollé una función que calcula una combinación lineal de los costos, pero ajusta automáticamente los coeficientes de acuerdo con el componente de costo más alto visto hasta ahora.

Por ejemplo, si la tupla de mayor costo es (A, B, C) y el vector de costo de entrada es (x, y, z), la combinación lineal es BCx + Cy + z. De esta forma, no importa qué tan alto z llegue, nunca será más importante que un valor x de 1.

Esto crea "jaggies" en la función de costos a medida que se descubren nuevos costos máximos. Por ejemplo, si C sube, entonces BCx y Cy serán más altos para una entrada determinada (x, y, z) y también lo serán las diferencias entre los costos. Una mayor diferencia de costos significa que la probabilidad de aceptación disminuirá, como si la temperatura se redujera repentinamente un paso adicional. Sin embargo, en la práctica esto no es un problema porque los costos máximos se actualizan solo unas pocas veces al principio y no cambian más adelante. Creo que incluso podría demostrarse teóricamente que converge hacia un resultado correcto, ya que sabemos que el costo convergerá hacia un valor inferior.

Una cosa que todavía me tiene algo confundida es lo que sucede cuando los costos máximos son 1.0 y menos, digamos 0.5. Con un vector máximo de (0.5, 0.5, 0.5) esto daría la combinación lineal 0.5 * 0.5 * x + 0.5 * y + z, es decirel orden de precedencia se invierte de repente. Supongo que la mejor manera de manejarlo es usar el vector máximo para escalar todos los valores a rangos dados, de modo que los coeficientes siempre puedan ser los mismos (digamos, 100x + 10y + z). Pero aún no lo he intentado.

+0

Me interesaría saber si esto es un problema académico o de la industria. Saludos –

+1

No es académico. Estoy usando esto como una alternativa a MS Project. El objetivo principal del programa es facilitar la respuesta a la pregunta "¿cuándo puede su equipo agregar la característica X a nuestro software?" – flodin

+1

Sé que esta pregunta tiene años pero para cualquier persona que tropiece en esta página a través de Google ... en lógica difusa la suma ponderada es el equivalente de O lógico, por lo que efectivamente está diciendo "si la condición A * O * condición B etc. ". Lo que realmente quieres es A * AND * B * AND * C, y para hacer eso, usa la multiplicación. Hay algunas advertencias (por ejemplo, sus pesos ahora necesitan ser poderes), pero es mucho mejor que el desastre que se está tratando de tratar en un caso especial. Wiki "Modelo de suma ponderada" y "Modelo de producto ponderado" para más detalles. –

Respuesta

2

mbeckish tiene razón.

¿Podría hacer una combinación lineal de las diferentes energías y ajustar los coeficientes?

¿Posiblemente log-transforming ellos dentro y fuera?

He hecho algo de MCMC usando Metropolis-Hastings. En ese caso, estoy definiendo la verosimilitud logarítmica (no normalizada) de un estado particular (dados sus antecedentes), y encuentro que es una forma de aclarar mi forma de pensar sobre lo que quiero.

+0

Las diferentes cantidades no siempre tienen unidades compatibles. Por ejemplo, el valor de la fecha límite se cuadra para obtener un tipo de optimización de mínimos cuadrados, es decir, prefiero demorar 3 tareas por 1 día cada una en lugar de demorar 1 tarea por 3 días. Lo he considerado, pero me temo que me encontraré con muchos casos límite en los que el sistema no está haciendo lo correcto porque no hice los coeficientes "correctos" (si es que existe tal cosa). También vea la respuesta a mcbeckish – flodin

+0

@flodin: Usted quiere que su superficie total de energía sea continua, por lo que estaría tímido con las declaraciones IF. Aparte de eso, puedes hacerlo bastante no lineal, como tener una repulsión de ley cuadrada de los casos límite, solo un pensamiento. –

0

Depende de lo que quiere decir con "tiene prioridad". Por ejemplo, ¿qué sucede si el deadline_cost baja en 0.001, pero el costo global_finish_time aumenta en 10000? ¿Devuelve 1.0, porque el deadline_cost disminuyó, y eso tiene prioridad sobre cualquier otra cosa? Parece que es una decisión de juicio que solo usted puede hacer, a menos que pueda proporcionar suficiente información de antecedentes sobre el proyecto para que otros puedan sugerir su propio juicio informado.

+0

Sí, los plazos siempre son más importantes que el tiempo global de finalización. Incluso si el tiempo global de finalización aumenta en 10000, quiero que el sistema favorezca un menor costo de plazo. Esto es lo que traté de explicar en la pregunta, lo siento si no estaba claro. – flodin

1

yo consideraría algo en la línea de:

If (new deadline_cost > old deadline_cost) 
    return (calculate probability) 

else if (new global finish time > old global finish time) 
    return (calculate probability) 

else if (new split cost > old split cost) 
    return (calculate probability) 

else 
    return (1.0) 

Por supuesto, cada uno de los tres lugares que calcular la probabilidad podría utilizar una función diferente.

+0

Lo intentaré y te llamaré. Estaba pensando en algo similar pero veo un problema potencial en el hecho de que una diferencia X en el primer valor representa la misma probabilidad que una diferencia X en el segundo valor. Intuitivamente, una diferencia en el segundo valor debe representar un valor que, en cierto sentido, es una probabilidad infinitamente menor. Un problema aquí es que es difícil convencerse a sí mismo a través de prueba y error de que su algoritmo es sólido.Podría funcionar para casos simples pero crear un comportamiento extraño en escenarios complejos. Estoy deseando alguna confirmación teórica del método. – flodin

+0

Supongo que este es un enfoque heurístico que no es poco común en las soluciones NP-completas. –

+0

Lo he probado y está generando soluciones bastante buenas. El único problema es que una vez que el componente de mayor prioridad se ha asentado en un valor óptimo, es muy probable que el algoritmo salte de esa solución incluso a bajas temperaturas. Esto es lógico ya que moverse de (0, 0) a (1, 0) tiene exactamente la misma probabilidad que el paso de (0, 0) a (0, 1). Dejaré la pregunta abierta por un tiempo y continuaré experimentando para ver si aparece algo mejor. En este momento estoy considerando algún tipo de diferencia de magnitud en la probabilidad al evaluar un componente de menor prioridad. – flodin

1

Me gustaría tener una pizca de algoritmo evolutivo multiobjetivo (MOEA) y hacer que la transición si todo de los objetivos pasan simultáneamente con la función acceptance_probability diste. Esto tendrá el efecto de explorar el frente de Pareto de manera similar a como el recocido simulado estándar explora las mesetas de soluciones de la misma energía.

Sin embargo, esto se rinde ante la idea de que el primero tenga prioridad.

Probablemente tendrá que modificar sus parámetros, como por ejemplo, darle una temperatura inicial más alta.

Cuestiones relacionadas