Ich habe folgende Hausaufgaben:Verbesserung next_permutation Algorithmus
Wir haben N arbeitet, die Laufzeiten sind: T1, T2, ..., tN, die Fristen ist d1, d2, ..., dN. Wenn die Arbeiten nicht bis zum Stichtag erledigt sind, wird eine Strafe entsprechend b1, b2, ..., bN gegeben. In welcher Reihenfolge sollten die Jobs erledigt werden, dass die Strafe minimal wäre?
Ich habe diesen Code bisher geschrieben und es funktioniert, aber ich möchte es verbessern, indem Sie unnötige Permutationen überspringen. Zum Beispiel weiß ich, dass die Aufträge in Reihenfolge: 1 2 3 4 5 - geben Sie mir 100 Punkte Strafe und wenn ich die Reihenfolge ändern sagen wir so: 2 1 ..... - es gibt mir sofort 120 Strafe und von diesem Moment an weiß ich, dass ich nicht alle Restpermutationen überprüfen muss, die mit 2 1 beginnen, ich muss sie irgendwie überspringen. Hier ist der Code:
int finalPenalty = -1;
bool z = true;
while(next_permutation(jobs.begin(), jobs.end(), compare) || z)
{
int time = 0;
int penalty = 0;
z = false;
for (int i = 0; i < verseNumber; i++)
{
if (penalty > finalPenalty && finalPenalty >= 0)
break;
time += jobs[i].duration;
if (time > jobs[i].deadline)
penalty += jobs[i].penalty;
}
if (finalPenalty < 0 || penalty < finalPenalty)
{
sortedJobs = jobs;
finalPenalty = penalty;
}
if (finalPenalty == 0)
break;
}
Ich glaube, ich sollte hier das irgendwo tun:
if (penalty > finalPenalty && finalPenalty >= 0)
break;
Aber ich bin nicht sicher, wie dies zu tun. Es überspringt mich hier eine Permutation, wenn die Strafe schon höher ist, aber es überspringt nicht alles und es macht noch next_permutation. Irgendwelche Ideen?
EDIT: Ich bin mit Vektor und mein Job Struktur sieht wie folgt aus:
struct job
{
int ID;
int duration;
int deadline;
int penalty;
};
ID automatisch gegeben, wenn aus der Datei und der Rest Lesen aus Datei (zum Beispiel lauten: ID = 1, Dauer = 5, Deadline = 10, Penalty = 10)
Die erste Sache, die mir auffällt, ist, wie vage das Strafmaß ** in dem von Ihnen bereitgestellten Beispiel ** definiert ist. Die Reihenfolge der ersten beiden Elemente kann eine zusätzliche Strafe für 2 1 3 4 5 verursachen, aber ich nehme an, seine Strafe würde sich von der von 2 1 3 5 4 oder 2 1 4 3 5 unterscheiden, es sei denn b3, b4 und b5 sind gegeben bestimmte Werte, die den Austausch zwischen den letzten 3 Elementen überflüssig machen. Mit anderen Worten, wie können Sie bestimmte Permutationen ohne explizite Garantie (z. B. einige Einschränkungen für b # -Werte) überspringen, dass ihre Strafe im Voraus berechnet werden kann? – ilim
Ja, 2 1 3 5 4 könnte sich von 2 1 4 3 5 unterscheiden, aber wenn ich am Anfang sehe, dass 2 1 ..... hat schon höhere Strafe als 1 2 3 4 5, dann gibt es keinen Grund, den ich sollte Überprüfen Sie für jede andere Permutation, die beginnt 2 1 ...... Ein anderes Beispiel: 1 2 3 4 5 - 100 2 1 ........ - 80 ABER 2 1 3 ..... - 120, so dass es nicht notwendig ist, die letzten Elemente zu überprüfen, da sie immer höher als die vorherige Permutation ist. Von diesem Moment an sollte ich zu überspringen: 2 1 4 .... – Tripper
Nur um zu klären, alle Ihre Strafen sind positiv, oder? – ilim