Gieriger Algorithmus kann in diesem Fall nicht helfen. Und es konnte nicht mit Bruch- oder 0-1-Rucksackproblemen verglichen werden. Der erste könnte durch einen gierigen Algorithmus in O (n) aufgelöst werden und der zweite ist NP.
Das Problem, das Sie haben, könnte in O (2 ^ n) brutal erzwungen werden. Sie können es jedoch mithilfe der dynamischen Programmierung optimieren.
1) Sortieren Sie die Intervalle nach Startzeit.
2) Initialisiere int [] cost = new int [jobs.length] mit Integer.MIN_VALUE (oder einem beliebigen negativen Wert);
3) Definieren Sie die folgende rekursive Routine (hier ist Java):
private int findCost(Job[] jobs, int k, int[] costs) {
if(k >= jobs.length) {
return 0;
}
if(costs[k] < 0) {
int x = findNextCompatibleJob(jobs, k);
int sumK = jobs[k].cost + findCost(jobs, x, costs);
int sumK1 = findCost(jobs, k + 1, costs);
costs[k] = Math.max(sumK, sumK1);
}
return costs[k];
}
private int findNextCompatibleJob(Job[] jobs, int k) {
int finish = jobs[k].finish;
for(int i = k + 1; i < jobs.length; i++) {
if(jobs[i].start > finish) {
return i;
}
}
return Integer.MAX_VALUE;
}
4) Rekursion mit k = 0 starten;
Ich habe nur eine Rekursionsroutine implementiert, während andere Teile trivial sind. Ich habe angenommen, dass alle Kosten> = 0 sind. Wenn es Jobs mit negativen Kosten geben könnte, müssen wir dies überprüfen und diese Jobs einfach ohne Berücksichtigung bestehen.
Ja, es entspricht einem Rucksackproblem. Betrachten Sie die Endzeit des Jobs und bereiten Sie den Tisch wie einen Rucksack vor. Bevor Sie die folgende Lösung lesen, überprüfen Sie bitte das Rucksackproblem und seine Lösung.
Sie können die geplanten Jobs auch drucken, indem Sie die Tabelle durchlaufen:
Komplexität ist dasselbe wie Rucksackproblem.
quelle