18

Sé que hay algunos problemas de programación que son NP-hard/NP-complete ... sin embargo, ninguno de ellos se indica de tal manera que muestre que esta situación también es NP.¿Todos los problemas de programación son NP-Hard?

Si usted tiene un conjunto de tareas limitadas a un startAfter, startBy y duración todos tratando de utilizar un solo recurso ... se puede resolver un horario o identificar que no se puede resolver sin una búsqueda exhaustiva?

Si la respuesta es "amigo lo siento, pero esto es NP-completo" lo que sería la mejor heurística (s?) De usar y hay maneras de disminuir el tiempo que se tarda en a) resolver un horario y b) identificar un cronograma no resuelto.

Implementé (en prolog) un objetivo básico de resolución de conflictos a través de la recursión que implementa una heurística de "ventana más pequeña primero". En realidad, esto encuentra soluciones con bastante rapidez, pero es excepcionalmente lento para encontrar horarios no válidos. ¿Hay una manera de superar esto?

¡Yay para preguntas combinadas!

+1

¿Crees que agregarás más restricciones a este problema? Si es así, parece un problema de calendario, que es 'normalmente' resuelto a través de la programación contraint http://en.wikipedia.org/wiki/Constraint_programming o incluso programación lineal http://en.wikipedia.org/ wiki/Linear_programming Eche un vistazo al proyecto de código abierto llamado unitime.org (programación de restricciones) y el solucionador de restricciones de ilog (muy caro, pero muy rápido). – Karussell

Respuesta

16

La parte más difícil de la mayoría de los problemas de programación en en la vida real está adquiriendo una fiabilidad y un conjunto completo de restricciones. Si tomamos el ejemplo de la creación de un calendario universitario:

  • Profesor A no se levanta por la mañana, él está en una gran cantidad de comités, pero nadie le dirá la oficina calendario de este tipo de restricción
  • Departamento 1 necesita el calendario por el comienzo del plazo, sin embargo, Departamento 2 que utiliza las mismas habitaciones no está dispuesto a decidir sobre los cursos que se ejecutarán hasta que todos los estudiantes han llegado
  • Etc

Entonces necesita un sistema de programación que pueda hacer frente a los cambios, por lo que cuando se modifica una restricción en el último minuto, no es necesario cambiar el horario completo.

Todo lo anterior normalmente se ignora en trabajos de investigación sobre sistemas de programación. En cuanto a la integridad de NP de un problema de programación dado, en en la vida real no le importa, ya que incluso si no es NP completa, es poco probable que pueda definir cuál es la "mejor solución", por lo tanto es buena. suficiente.

Consulte http://www.asap.cs.nott.ac.uk/watt/resources/university.html para obtener una lista de documentos que pueden ayudarlo a comenzar; todavía hay muchos PHD en el software de programación.

+0

great link! .. Gracias. Un enlace como ese casi pertenece en http://lambda-the-ultimate.org –

+0

el sistema de programación universitaria líder en el mercado todavía está escrito en la lista y allí usan mucho lambda. –

+1

"" Todo lo anterior normalmente se ignora en los artículos de investigación sobre los sistemas de programación "" solo como una nota al margen: eso no es cierto. Al menos en las últimas investigaciones intentan hacerlo más real. P.ej. ver los requisitos para las pistas de la competencia internacional de horarios 2007. – Karussell

2

Puede usar la programación dinámica para resolver algunas de estas cuestiones. Los algoritmos codiciosos también vienen a la mente. La teoría de la programación es a la vez profunda y hermosa, pero los dos que encuentro resolverán la mayoría de los problemas que he enfrentado. Tal vez he tenido suerte.

+0

Los algoritmos codiciosos no siempre arrojarán un resultado cuando exista, ¿correcto? Para mis propósitos, si existe una solución que programa todas las tareas, debo encontrarla. las soluciones "cerradas" no funcionarán =/ Examinaré el interwebz para algunos algoritmos de programación dinámica de programación ... ¡gracias! –

+0

No hay problema. Sin embargo, técnicamente solo puedes acercarte tanto. Una buena heurística es mejor que nada y, a veces, tan lejos como puedas. La programación, que tiene sus raíces en la optimización, es un campo muy profundo. Comience de manera simple y siga subiendo. – wheaties

+0

la ventana más pequeña primero realmente ayuda mucho a encontrar una solución ... Necesito encontrar la manera de podar mi espacio de búsqueda para que los retornos "falsos" lleguen más rápido. –

1

¿Qué quieres decir con startBy?

Con startAfter y si solo hay un recurso, entonces una solución rápida podría ser usar topological sorting. El algoritmo de ejemplo se ejecuta en tiempo lineal, pero no incluye el caso de error si el gráfico contiene ciclos.

+1

Algunas fuentes en Java están disponibles en mi proyecto de timefinder: https://timefinder.svn.sourceforge.net/svnroot/timefinder/trunk/timefinder-algo/src/main/java/de/timefinder/algo/graph/ – Karussell

+1

startBy y start Después de consultar la ventana en la que la tarea debe comenzar entre ... es decir, la tarea a debe comenzar después de las 2:00 y comenzar antes de las 2:30 con una "ventana de oportunidad" de 30 minutos. Gracias por el enlace ... Lo investigaré ... ahora :-D –

+1

A primera vista, solo parece tener en cuenta el orden de las tareas, no las limitaciones de esa tarea ... sin embargo ...puede que no sea una mala idea crear posibles listas "ordenadas" y verificar que esas soluciones sean válidas antes de iniciar un barrido completo O (n^n). –

1

Aquí hay uno que no lo es.

Programe un conjunto de trabajos i = 1,2 ... n en una sola máquina, cada uno de los cuales toma tiempo t (i) para que el tiempo de espera promedio se reduzca al mínimo.

Solución: Ordenar en orden creciente de t (i). O (n log n)

una buena lista here

+0

gran lista ... parece que mi más pequeñaWindowFirst está estrechamente relacionada con EarliestDueDate –

2

A menudo hay una buena approximation algorithms de problemas de optimización NP-hard/completa como la programación. Puede leer las notas del curso por Ahmed Abu Safia en Approximation Algorithms for scheduling o en varios papers.

En cierto sentido, toda la criptografía de clave pública se realiza con problemas "menos duros" como el factoring en parte porque los problemas de NP-difícil ofrecen demasiados casos fáciles. Es la misma completitud NP lo que los hace "moralmente difíciles", lo que también les da demasiados problemas fáciles, que a menudo caen dentro de un límite de error óptimo.

Hay una teoría más profunda de hardness of approximation que discute las limitaciones de los algoritmos de aproximación.

0

considerar el problema de programación que está en la clase P:

Entrada: lista de actividades que incluyen la hora de inicio y de final.

Ordenar por hora de finalización.

Seleccione los primeros N elementos de esta lista ordenada para encontrar la cantidad máxima de actividades que puede programar en un momento dado.

Puede agregar advertencias como: todas las actividades deben finalizar a las 5 p.m., bueno, en este caso mientras trabaja en la lista, deténgase una vez que llegue a una actividad que finaliza después de esta fecha.

Cuestiones relacionadas