2012-03-24 9 views
1

Wie entwickelt man eine effiziente Job-Scheduling mit Einschränkungen?Constraints Programmierung in Java

sollte der Planer diese Methoden sind:

startBeforeEndOf(Job j) 
startAfterEndOf(Job j) 
startBeforeStartOf(Job j) 
startAfterStartOf(Job j) 
endBeforeEndOf(Job j) 
endAfterEndOf(Job j) 
endBeforeStartOf(Job j) 
endAfterStartOf(Job j) 

eine ID und die Zeitparameter Jeder Job hat.

Eine mögliche Lösung für diese Angelegenheit basiert möglicherweise auf technischer Rückverfolgung. Die Jobs werden als Auswahlpunkte und als temporäre Zeitpunkte als Auswahl verwendet (im schlimmsten Fall ist die Gesamtdauer der Aktivität die Summe der Dauer der Arbeit, was zu einer vollständig sequenziellen Ausführung führt).

Alternativ sollte ich die Daten adäquat darstellen und dann eine Zeitplanung auf der Zeitachse erstellen, die Arbeit unter den Bedingungen platzieren und in einem Job vorwärts gehen (und alle Jobs, die davon abhängen), wenn eine Bedingung nicht erfüllt ist. Aber ich weiß nicht, wie genau ich das in Java machen kann.

Mit anderen Worten, ich suche nach einer Möglichkeit, die intensive Backtracking-Ansatz zu vermeiden, in der Job-Management beschrieben.

+1

Ist das Hausaufgaben? Kennen Sie irgendwelche Algorithmen, die dafür verwendet werden könnten? Sie könnten Heuristiken in Ihren Suchprozess einfügen, aber Backtracking scheint Teil der Lösung zu sein. Es sei denn, Sie möchten für erschöpfende Suche natürlich gehen :-) –

+0

Ich denke, verschiedene Liste zu verwenden, um jeden Job gemäß seiner Einschränkung für private Liste beispielsweise zu trennen startBeforeEnd; \t private Liste startAfterEnd; \t private Liste startBeforeStart; \t private Liste startAfterStart; \t private Liste endBeforeEnd; \t private Liste endAfterEnd; \t private Liste endBeforeStart; \t private Liste endAfterStart; \t private Liste eingeschränkt; ABER ich weiß nicht, wie genau sich das entwickeln kann. – AndreaF

Antwort

0

Versuchen Sie OptaPlanner (Java, Open Source). Es gibt a quick start here.

Zum Beispiel weisen jede Job zu einem startMinute, dann wie Punktzahl Regeln hinzufügen:

when 
    $leftJob : Job($startMinute : startMinute) 
    // getEndMinute() returns startMinute + durationInMinutes 
    $rightJob : Job(beforeJob == $leftJob, endMinute > $startMinute) 
then 
    // punish 
end 
+0

emmm ... könntest du mir mehr Details geben, wie sich Drools anpassen, um die Lösung bei diesem Problem zu treffen ??? danke – AndreaF

+0

@AndreaF: Siehe oben –

0

Sie können eine Open-Source-Constraint-Programmierbibliothek verwenden. This Post-Punkte zu vielen Solver in Java geschrieben für Constraint Zufriedenheitsprobleme und mehr.

+0

Danke, aber diese Bibliotheken sind zu groß für dieses spezielle Problem. Gibt es etwas kleineres? – AndreaF

+0

@AndreaF - Nicht dass ich mir dessen bewusst bin. Aber Sie können die benötigte Funktionalität von einer der Bibliotheken finden. Dann greifen Sie auf die Implementierung der Bibliothek zu und passen Sie sie Ihrem Fall an. –

+0

Lesen Sie hundert Codelines und versuchen Sie, diese generischen Bibliotheken an dieses Problem anzupassen. Ist ein zu komplizierter Weg. Mit einer richtigen Intuition denke ich, dass dies von einem erfahrenen Entwickler in ein paar kleinen Klassen gelöst werden könnte. – AndreaF