Dies ist mein erstes Experiment mit einer asymptotischen Komplexitätsherausforderung, obwohl ich mit Antworten vollständig im Code zufrieden bin, solange sie eine Erklärung für ihre zeitliche Komplexität enthalten.
Ich habe folgendes Problem.
Betrachten Sie die Aufgaben T_1, ... T_n und procs M_1, ..., M_m. Jede Aufgabe benötigt abhängig von den Prozessen eine bestimmte Zeit.
Jede Aufgabe kostet je nach Prozess auch einen bestimmten Betrag.
Die Aufgaben müssen in strikter Reihenfolge ausgeführt werden (sie können nicht parallel ausgeführt werden) und es braucht Zeit, um den Prozess zu ändern. Eine Aufgabe kann nach dem Start nicht mehr von einem Prozess zu einem anderen verschoben werden.
Schließlich muss jede Aufgabe zu einem bestimmten Zeitpunkt abgeschlossen sein.
die Aufgabe
Das Ziel besteht darin, einen Algorithmus (oder einen Code) anzugeben, der anhand von fünf Tabellen des obigen Formulars die Gesamtkosten für die Ausführung aller Aufgaben minimiert und gleichzeitig sicherstellt, dass alle Aufgaben innerhalb ihrer Fristen ausgeführt werden. Wenn dies nicht möglich ist, melden wir nur, dass dies nicht möglich ist.
Ergebnis
Sie sollten die große Oh-Komplexität Ihrer Lösung in Bezug auf die Variablen n, m und d angeben, wobei d die letzte Frist ist. Es sollte keine unnötigen Konstanten in Ihrer großen Oh-Komplexität geben. So sollte beispielsweise O (n / 1000) als O (n) geschrieben werden.
Ihre Punktzahl wird einfach berechnet, indem Sie n = 100, m = 100 und d = 1000 in Ihre angegebene Komplexität setzen. Sie möchten die kleinstmögliche Punktzahl.
Kabelbinder
Bei einem Unentschieden gewinnt die erste Antwort.
Notizen hinzugefügt
log
In der Zeit wird die Komplexität einer Antwort auf Basis 2 genommen.
Anzeigetafel
- 10 ^ 202 von KSFT ( Python ) Zuerst eingereicht, bekommt also das Kopfgeld.
- 10 ^ 202 von Dominik Müller ( Scala )
O(m ^ n)
. Kein Algorithmus wird "schneller" sein. Das Beschneiden auf der Grundlage eines maximal erforderlichen Zeit- oder Kostenaufwands ändert weder die Komplexität des Algorithmus noch die Kosten für Dollar und Zeit und ist daherd
kein Element der Komplexität.Antworten:
Punktzahl: 10 ^ 202
Ich wünschte, wir hätten jetzt LaTeX-Unterstützung ...
Da sonst niemand geantwortet hat, dachte ich, ich würde es versuchen, obwohl es nicht sehr effizient ist. Ich bin mir jedoch nicht sicher, was das große O davon ist.
Ich denke es funktioniert. Zumindest für den einzigen veröffentlichten Testfall.
Es werden Eingaben wie in der Frage vorgenommen, außer ohne die Maschinen- oder Aufgabennummernbezeichnungen und mit Semikolons anstelle von Zeilenumbrüchen.
quelle
Überprüfen Sie alle - Scala
Geschätzte Punktzahl: 2m ^ n
Ich starte von jeder Maschine und iteriere über alle Aufgaben, um alle Permutationen durch die Aufgaben mit verschiedenen Maschinen zu erstellen, die die Fristen einhalten. Das heißt, wenn alles rechtzeitig ist, würde ich 9 mögliche Pfade mit 2 Maschinen und 3 Aufgaben erhalten. (m ^ n) Danach gehe ich den Weg mit den niedrigsten Kosten.
Die Eingabe ist wie folgt aufgebaut (-> erklärt die Teile und sollte daher nicht eingegeben werden):
Und hier ist der Code:
Ich hatte auch die Idee, von hinten zu beginnen. Da Sie immer eine Maschine mit den niedrigsten Kosten wählen können, wenn die Zeit kleiner ist als die Differenz zwischen der vorherigen und der neuen Frist. Dies würde jedoch die maximale Laufzeit nicht verringern, wenn die Aufgabe mit den besseren Kosten länger dauert als die letzte Frist.
Aktualisieren
======
Hier ist eine andere Einstellung. Zeit:
Kosten:
Schaltzeit:
Wechselkosten:
Fristen:
Als Eingabe in mein Programm:
Dieser hat zwei Lösungen: Zeit: 18, Kosten: 15, Pfad: Liste (M_1, M_1, M_1, M_2) Zeit: 18, Kosten: 15, Pfad: Liste (M_2, M_1, M_1, M_1)
Was die Frage aufwirft, wie damit umgegangen werden soll. Sollten alle gedruckt werden oder nur einer? Und was wäre, wenn die Zeit anders wäre? Ist einer mit den niedrigsten Kosten und ohne versäumte Frist genug oder sollte es auch derjenige mit der niedrigsten Zeit sein?
quelle
O(m^n)
Zeit. Iterieren jede Maschine für alle Aufgaben nimmtO(n*m^n)
Zeit.O(n*m^n)
jede Aufgabe für jeden der Pfade durchlaufen? Und Iteration über jede Maschine für jede Aufgabe so etwas wieO(n*m)
.O(n*m^n)
".O(m*m^n)=O(m^n+1)
. Es ist jedoch immer noch die gleiche Punktzahl.