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.