Este es mi primer experimento con un desafío de complejidad asintótica, aunque estoy contento con las respuestas enteramente en código siempre que vengan con una explicación de su complejidad temporal.
Tengo el siguiente problema.
Considere las tareas T_1, ... T_n y los procesos M_1, ..., M_m. Cada tarea tarda una cierta cantidad de tiempo en realizarse según los procesos.
Cada tarea también cuesta una cierta cantidad dependiendo de los procesos.
Las tareas deben realizarse en orden estricto (no pueden realizarse en paralelo) y lleva tiempo cambiar el proceso. Una tarea no se puede mover de un proceso a otro después de que se haya iniciado.
Finalmente, cada tarea debe completarse en un momento determinado.
la tarea
El objetivo es proporcionar un algoritmo (o algún código) que proporcione cinco tablas del formulario anterior, minimice el costo total para completar todas las tareas mientras se asegura de que todas las tareas se completen en sus plazos. Si esto no es posible, solo informamos que no se puede hacer.
Puntuación
Debe dar la gran complejidad Oh de su solución en términos de las variables n, myd, donde d es la última fecha límite. No debe haber constantes innecesarias en su gran complejidad Oh. Entonces O (n / 1000) debe escribirse como O (n), por ejemplo.
Su puntaje se calcula simplemente estableciendo n = 100, m = 100 yd = 1000 en su complejidad establecida. Quieres el puntaje más pequeño posible.
disyuntor
En caso de empate, la primera respuesta gana.
notas agregadas
log
en el tiempo la complejidad de una respuesta se tomará en base 2.
tabla de puntuaciones
- 10 ^ 202 de KSFT ( Python ) Primero enviado, por lo que obtiene la recompensa.
- 10 ^ 202 de Dominik Müller ( Scala )
O(m ^ n)
. Ningún algoritmo será "más rápido" que eso. La poda basada en un tiempo o costo máximo requerido no cambia la complejidad del algoritmo, ni tener un costo en dólares y un costo de tiempo, pord
lo tanto, no es un elemento de la complejidad.Respuestas:
Puntuación: 10 ^ 202
Ojalá tuviéramos soporte para LaTeX ahora ...
Como nadie más ha respondido, pensé en intentarlo, aunque no es muy eficiente. Sin embargo, no estoy seguro de cuál es el gran O de eso.
Creo que funciona Al menos, lo hace para el único caso de prueba publicado.
Toma datos como en la pregunta, excepto sin las etiquetas de máquina o número de tarea, y con punto y coma en lugar de saltos de línea.
fuente
Verificar todo - Scala
Puntaje estimado: 2m ^ n
Comienzo desde cada máquina e itero sobre todas las tareas para crear todas las permutaciones a través de las tareas con diferentes máquinas que cumplen con los plazos. Es decir, si todo está a tiempo, obtendría 9 rutas posibles con 2 máquinas y 3 tareas. (m ^ n) Luego, tomo el camino con el costo más bajo.
La entrada está estructurada de esta manera (-> explica las partes y, por lo tanto, no debe ingresarse):
Y aquí está el código:
También tuve una idea para comenzar desde atrás. Dado que siempre puede elegir una máquina con el costo más bajo si el tiempo es menor, entonces la diferencia de la fecha límite anterior a la nueva. Pero eso no disminuiría el tiempo de ejecución máximo si la tarea con el mejor costo toma más tiempo que la última fecha límite.
Actualizar
======
Aquí hay otra configuración. hora:
costo:
tiempo de cambio:
costo de cambio:
plazos de entrega:
Como entrada en mi programa:
Este tiene dos soluciones: tiempo: 18, costo: 15, ruta: Lista (M_1, M_1, M_1, M_2) tiempo: 18, costo: 15, ruta: Lista (M_2, M_1, M_1, M_1)
Lo que plantea la pregunta de cómo se debe manejar esto. ¿Se deben imprimir todos o solo uno? ¿Y si el tiempo fuera diferente? ¿Es uno con el costo más bajo y no tiene una fecha límite perdida suficiente o también debería ser el que tiene el tiempo más bajo?
fuente
O(m^n)
tiempo. Iterar sobre cada máquina para todas las tareas llevaO(n*m^n)
tiempo.O(n*m^n)
iterando sobre cada tarea para cada una de las rutas? E iterando sobre cada máquina para cada tarea algo asíO(n*m)
.O(n*m^n)
".O(m*m^n)=O(m^n+1)
. Sin embargo, sigue siendo el mismo puntaje.