8

Ich möchte nur, dass jemand überprüft, ob das folgende Problem NP-vollständig ist oder ob es tatsächlich eine bessere/einfachere Lösung als einfache Brute-Force-Kombinationsprüfung gibt.Mögliches NP-vollständiges Problem?

Wir haben in unserer Software ein Problem bei der Ressourcenverteilung, und ich werde es mit einem Beispiel erklären.

Sagen wir, wir brauchen 4 Leute, die während der Tagschicht arbeiten. Diese Nummer und die Tatsache, dass es sich um eine "Tagesschicht" handelt, ist in unserer Datenbank gespeichert.

Wir benötigen jedoch nicht nur irgendjemanden, um diese Stellen zu füllen, es gibt einige Anforderungen, die erfüllt werden müssen, um die Rechnung zu erfüllen.

Von diesen 4, sagen wir 2 von ihnen muss eine Krankenschwester sein, und 1 von ihnen muss Ärzte sein.

Einer der Ärzte muss auch als Teil eines bestimmten Teams arbeiten.

So haben wir diesen Satz von Informationen:

Tagschicht: 4
      1 Arzt
      1 Arzt, müssen im Team arbeiten A
      1 Krankenschwester

Das Obige ist nicht das Problem. Das Problem tritt auf, wenn wir anfangen, Leute auszuwählen, um die Tagesschicht zu arbeiten und herauszufinden, ob die Leute, die wir bisher ausgewählt haben, tatsächlich die Kriterien erfüllen können.

Nehmen wir zum Beispiel, wir wählen James, John, Ursula und Mary zu arbeiten, wo James und Ursula sind Ärzte, John und Mary sind Krankenschwestern.

Ursula arbeitet auch im Team A.

nun je nach Auftrag, den wir versuchen, die Rechnung zu passen, könnten wir herzuleiten am Ende, dass wir die richtigen Leute haben, oder nicht, es sei denn, wir verschiedene Kombinationen starten versuchen.

Zum Beispiel, wenn Sie in der Liste nach unten gehen und Ursula zuerst auswählen, können wir sie mit den Kriterien "1 Arzt" abgleichen. Dann kommen wir zu James, und wir stellen fest, dass, da er nicht in Team A arbeitet, die anderen Kriterien über "1 Doktor, müssen in Team A arbeiten" nicht mit ihm erfüllt werden können. Da die anderen beiden Personen Krankenschwestern sind, werden sie auch diese Kriterien nicht erfüllen.

Also gehen wir zurück und versuchen James zuerst, und auch er kann die ersten Kriterien erfüllen, und dann kann Ursula die Kriterien erfüllen, die dieses Team braucht.

So sieht das Problem für uns aus, wie wir verschiedene Kombinationen versuchen müssen, bis wir entweder alle ausprobiert haben, in diesem Fall haben wir einige Kriterien, die noch nicht gefüllt sind, auch wenn die Gesamtzahl der Köpfe arbeitet Genauso wie die Gesamtzahl der benötigten Köpfe, oder wir haben eine Kombination gefunden, die funktioniert.

Ist dies die einzige Lösung, kann jemand an einen besseren denken?


bearbeiten: Einige Klarstellung.Die Kommentare zu dieser Frage erwähnen, dass wir mit diesen wenigen Leuten mit roher Gewalt gehen sollten, und ich stimme zu, dass wir das wahrscheinlich tun könnten, und wir könnten das sogar tun, in der gleichen Richtung, in der einige Optimierungen aussehen bei der Größe der Daten und wählt verschiedene Sortieralgorithmen mit weniger Anfangsaufwand aus, wenn die Datengröße klein ist.

Das Problem ist jedoch, dass dies Teil eines Dienstplansystems ist, in das Sie möglicherweise eine ganze Reihe von Leuten involviert haben, sowohl als "Wir brauchen X Leute auf der Tagesschicht" als auch "Wir haben das Pool von Y-Leuten, die es tun werden ", sowie Potenzial für ein großes" Wir haben diese Liste von Z-Kriterien für die X-Leute, die irgendwie mit diesen Y-Leuten übereinstimmen müssen ", und dann fügst du dem Fakt hinzu dass wir eine Anzahl von Tagen haben werden, um die gleiche Berechnung in Echtzeit durchzuführen, wenn der Leiter den Dienstplan anpasst, und dann ist die Notwendigkeit für eine schnelle Lösung gekommen.

Grundsätzlich wird der Leiter eine Live-Summen-Information auf dem Bildschirm sehen, die angibt, wie viele Personen immer noch vermisst werden, sowohl in der Tagesschicht insgesamt, als auch wie viele Personen die verschiedenen Kriterien erfüllen und wie viele Menschen haben wir zusätzlich zu denen, die wir haben. Diese Anzeige muss halb live aktualisiert werden, während der Anführer den Dienstplan mit "Was ist, wenn James statt Ursula die Tagesschicht übernimmt und Ursula die Nachtschicht übernimmt".

Aber ein riesiges Dankeschön an die Leute, die das bisher beantwortet haben, das Problem der Constraint-Zufriedenheit klingt nach dem Weg, den wir gehen müssen, aber wir werden auf jeden Fall alle Link- und Algorithmusnamen genau hinsehen. Diese

ist, warum ich lieben :) Stackoverflow

+0

Mit Zahlen wie 4 und 2, sehe ich nicht warum * nicht * die einfachste Brute-Force-Suche verwenden. – ShreevatsaR

+0

Ich stimme zu, Sie sollten es einfach brutal erzwingen, wenn es immer klein sein wird. Wenn nicht, müssen Sie eine Heuristik verwenden. Meine Vermutung ist, dass es eine Variante des Knapsack-Problems ist. Ich weiß nicht, warum diese Antwort aus dieser Frage entfernt wurde. –

+0

Ich stimme zu, ich werde die Frage bearbeiten, aber ich denke, die gegebenen Antworten werden uns einen Weg geben, einen Vorsprung zu bekommen. –

Antwort

11

Was Sie dort haben, ist ein constraint satisfaction problem; ihre Beziehung zu NP ist interessant, weil sie typischerweise NP, aber oft nicht NP-vollständig sind, d. h. sie sind zu polynomiellen Lösungen lösbar.

Wie in Kommentaren erwähnt, Ihre Situation klingt wie es formuliert werden kann als exact cover problem, die Sie Knuth's Algorithm X anwenden können. Wenn Sie diesen Kurs nehmen, lassen Sie uns bitte wissen, wie es für Sie funktioniert.

+0

Du schlägst mich dazu. – Pesto

+4

Wenn Sie das Problem in ein exaktes Cover-Problem umschreiben, können Sie Knuths Algorithmus X (oder Dancing Links) verwenden, um das Problem zu lösen. Es ist viel schneller als trivial Backtracking und es gibt viele Beispiele im Netz. – ebo

+0

@ebo: Klingt fruchtbarer als alles, was ich vorhatte. Ich werde es in meine Antwort integrieren. Vielen Dank. – chaos

1

Was Sie beschreiben, ist die ‚tischer Problem‘ ist leicht in this thesis beschrieben.

Bear mit mir, ich bin auf der Suche nach besseren Links.

EDIT

Hier ist ein weiterer ziemlich dicht thesis.

+0

Eine andere mögliche Lösung! Schön, danke :) –

3

Es sieht aus, als ob Sie eine constraint satisfaction problem haben.

In Ihrem Fall würde ich zuerst Constraint Propagation Techniken zuerst betrachten - Sie können das Problem auf eine überschaubare Größe auf diese Weise reduzieren.

Was passiert, wenn niemand die Kriterien erfüllt?

+0

Danke, das klingt definitiv nach dem, was wir brauchen! –

1

Für mich würde ich wahrscheinlich versuchen, Reduzierung auf bipartite graph matching Problem zu finden. Auch, um dieses Problem zu beweisen, ist NP normalerweise viel komplizierter als zu bleiben, kann man polynomiale Lösung nicht finden.

+0

Dies ist über meinem Kenntnisstand für diese Art von Grafik, aber ich werde darüber nachlesen! Vielen Dank! –

1

Ich bin nicht sicher, ob Ihr Problem NP ist, es riecht nicht so, aber was ich tun würde, wenn ich Sie wäre, würde die Anforderungen für die Positionen so bestellen, dass Sie versuchen, die spezifischsten zuerst zu füllen, da weniger Leute werden diese Positionen füllen, so dass es weniger wahrscheinlich ist, dass Sie viel zurückgehen müssen. Es gibt keinen Grund, warum Sie das nicht mit dem Algorithmus X kombinieren sollten, einem Algorithmus reiner Knuth-Ness.

+0

Ich stimme zu, dies ist, was wir ursprünglich auch vorgestellten, aber das Problem ist, dass die Voraussetzung für eine "Team A Association" ist nur eine von 3, die möglicherweise oder in Kombination auftreten, dh. "Team A, und kompetent mit Feuerlöschern, sowie Krankenschwester", und diese 3 Arten können einzeln oder zusammen auftreten, was bedeutet, dass in einigen Fällen gibt es keine Möglichkeit, eine spezifischer als eine andere zu gewichten. –

1

Ich überlasse die Theorie anderen, da mein mathematischer Sachverstand nicht so groß ist, aber Sie könnten ein Werkzeug wie Cassowary/Cassowary.net oder NSolver finden, das Ihr Problem deklarativ als Constraint-Zufriedenheitsproblem darstellt und dann löst die Einschränkungen. In solchen Werkzeugen wird häufig die Simplex-Methode in Kombination mit der Constraint-Propagation verwendet, um den Lösungsraum deterministisch zu reduzieren und dann eine optimale Lösung unter Berücksichtigung einer Kostenfunktion zu finden. Für größere Lösungsräume (die in der Größe des von Ihnen spezifizierten Problems nicht zu gelten scheinen) werden gelegentlich genetische Algorithmen verwendet.

Wenn ich mich richtig erinnere, enthält NSolver auch in Beispielcode eine Vereinfachung eines tatsächlichen Krankenschwester-Dienstplanproblems, an dem Dr. Chun in Hongkong arbeitete. Und es gibt a paper on the work he did.

+0

Ooh, nett, Tools und Software zu booten! Vielen Dank! –

1

Es klingt für mich wie Sie ein paar trennbaren Probleme haben, die viel einfacher sein würde, zu lösen:

- wählen Sie einen Arzt aus Team A - wählen Sie einen anderen Arzt von jedem Team - Wählen Sie zwei Krankenschwestern

So haben Sie drei unabhängige Probleme.

Eine Klärung allerdings, müssen Sie zwei Ärzte (einer aus dem angegebenen Team) und zwei Krankenschwestern oder einen Arzt aus dem angegebenen Team, zwei Krankenschwestern, und einen anderen, der Arzt oder Krankenschwester sein kann?

+0

Letzteres kann tatsächlich jede Art von Mitarbeiter sein, ansonsten gäbe es eine Anforderung. Es ist nicht wirklich so offen, da die Person, die versucht, die Leute hier zu verschieben, einen festen Pool von Mitarbeitern hat, der für sie arbeitet, was bedeutet, dass es typischerweise einen ziemlich homogenen Typ von Angestellten gibt (dh meistens Ärzte oder Krankenschwestern) oder medizinisches Personal oder ...). Sie werden in der Regel keine Gärtner, Hausmeister, medizinisches Personal und Straßenarbeiter im selben Pool haben. –

1

Einige Fragen:

  1. ist das Ziel, die Beschränkungen genau oder nur etwa (aber so viel wie möglich) zu erfüllen?
  2. Kann eine Person Mitglied mehrerer Teams sein?
  3. Was sind alle möglichen Einschränkungen? (Zum Beispiel könnten wir brauchen einen Arzt, der ein Mitglied von mehreren Teams ist?)

Wenn Sie die Einschränkungen genau befriedigen wollen, dann würde ich die Zwänge abnehmend durch Strenge bestellen, das heißt, diejenigen, die am schwersten zu erreichen sind (zB Arzt UND Team A in obigem Beispiel) sollte zuerst überprüft werden!

Wenn Sie die Einschränkungen befriedigen wollen etwa, dann wird ihr eine andere Geschichte ... Sie müssten eine Art Gewichtung/Bedeutung-Funktion angeben, welche bestimmt, was wir lieber haben, wenn wir nicht mithalten können genau, und haben mehrere Möglichkeiten zur Auswahl.

+1

Eine Person kann nur Teil eines einzelnen Teams sein und in diesem Kontext eine einzige Position im Unternehmen haben, aber das letzte Kriterium, das Informationen darüber speichert, wofür die Person zertifiziert ist (dh eine Klasse besucht und bestanden hat mit einem Feuer, oder mit CPR, oder ...), kann die Person mehrere davon haben. Der Zweck des Systems ist es, einen Dienstplan zu füllen, der besagt: "Wir brauchen mindestens 2 Ärzte an der Tagesschicht, und mindestens einer von ihnen muss eine Zertifizierung für die Verwendung des Röntgengeräts haben" usw. –

+0

Tut mir leid, dass ich mich wiederhole, aber der Fall, wenn es keine Möglichkeit gibt, die Beschränkungen zu erfüllen, und wir einen Kompromiss finden müssen, ist dieser Fall von Interesse? Tritt es oft auf? (Ich weiß nicht viel über Krankenhäuser ...) :-) – jacob

1

Wenn Sie mehrere oder viele Einschränkungen haben, werfen Sie einen Blick auf Drools Planner (Open Source, Java).

Brute Kraft, Zweig und gebunden und ähnliche Techniken dauern zu lange. Deterministische Algorithmen wie füllen die größten Verschiebungen zuerst sind sehr suboptimal. Meta-Heuristiken sind ein sehr guter Weg, um damit umzugehen.

Werfen Sie einen besonderen Blick auf die reale Krankenschwester Dienstplan von Drools Planner. Es ist leicht, viele Einschränkungen hinzuzufügen, wie zum Beispiel "junge Krankenschwestern wollen nicht am Samstagabend arbeiten" oder "einige Krankenschwestern wollen nicht zu viele Tage hintereinander arbeiten".

Verwandte Themen