Frage

imguralbum mit Bildschirmen von Arbeitsblättern: http://imgur.com/a/6rfwf

Long Story Short, ich schreibe ein Excel VBA-Dienstprogramm, das zwei Arten von Sicherheitsverschiebungen (Bezüge Berichterstände und Wochenendaufgaben) an Sicherheitspersonal zuweisen. Grundsätzlich habe ich ein Arbeitsblatt mit allen Mitarbeitern und deren verschiedenen Verfügbarkeitsinformationen darin (das Top-Image im IMGUR-Album) und ein Arbeitsblatt mit allen Deckungsdaten darin (das untere Bild im IMGUR-Album). Beachten Sie, dass ich kein Bild des Wochenendienstes habe, da es den Deckungsdaten ähnelt (aber mit dem Freitag- und Samstagschichten).

Das Dienstprogramm weist zwar ein zufälliges Personalmitglied zu, das jedem Datum ein zufälliges Personalmitglied zuweist, um sicherzustellen, dass sie nicht gegen die Verfügbarkeitsanforderungen verstößt. Leider erkennen ich, dass ich eine große Chance für eine unendliche Schleife erwerbst. Bei meinen eigenen Tests gab es nur noch einen Versuch, den etwa 15-16 Uhr in der Nähe des Endes in eine unendliche Schleife einzudringen. Ich suche also nach Ihrer Hilfe, um dafür zu berücksichtigen, dass sich das Dienstprogramm nicht selbst frisst.

Hier ist der "Pseudo-Code" für das betreffende Verfahren.

generasacodicetagpre.

edit: ignorieren Sie, dass ich die Termine in zwei Säulen jetzt habe. Ich werde reparieren, dass, wenn ich das Problem dieses Beitrags löste ... Es ist ein einfacher Fix und wird den Code fast in zwei Hälften schneiden.

0 Für den Fall, dass es in dieses Szenario läuft, kann ich ein paar akzeptable Optionen sehen (obwohl ich nicht weiß, wie ich sie mit der Programmierung mache):

    .
  1. Rückgängig Die gesamte Arbeit, die das Dienstprogramm tat, und beginnen, bis er Glück haben kann, und finden Sie eine Lösung, die funktioniert. Dies würde mir einige Zeit sparen, um manuelle Platzierungen für die letzten Häuser zu tun, aber es dauert sehr lange dauern. Darüber hinaus muss ich alle Originalwerte speichern und dann jederzeit in die Tabellenkalkulation in die Tabelle einfügen.

  2. Stoppen Sie einfach, Schichten zuzuweisen und einfach das Verfahren zu verlassen. Ich werde in der Lage sein, die letzten Schichten manuell zu platzieren, indem ich ein paar Leute umziehen kann. Ich bin sicher viel weniger Arbeit, als von Hand manuell 200 Schichten zuzuweisen, wie ich es in den letzten Jahren gemacht habe.

  3. Haben Sie jüngere Gedanken, die hier helfen könnten? Ich bin nicht einmal sicher, wie ich den Vorgang überprüfen könnte, um zu sehen, ob es überprüft wird, ob es gibt Möglichkeiten gibt es, wenn es keine Möglichkeiten gibt, aber auf beiden Weise müssen Sie eine Möglichkeit geben, diese unendliche Schleife zu erkennen (und zu dettern), bevor sie das Programm abstürzt.

    Entschuldigung für den Roman und danke im Voraus für jede Hilfe!

    edit: In der Mühe, etwas klarer zu bieten, dachte ich, ich würde den tatsächlichen Code unten kopieren und einfügen:

    generasacodicetagpre.

War es hilfreich?

Lösung 2

Ich bin also weitergegangen und entwickelte meine eigene Lösung für dieses Problem - es ist nicht perfekt, und es ist wahrscheinlich nicht der beste Weg, um das Szenario umzugehen. Aber es funktioniert, und es löste mein Problem in wenigen Minuten statt stundenlang andere Methoden.

Grundsätzlich habe ich zwei neue "Zählervariablen erstellt. Der erste ist fehlgeschlagen. Jedes Mal, wenn der Vorgehen ein zufälliges Personal versucht, aber in einen Konflikt läuft, erhöht er aus dem 1. Jedes Mal, wenn das Zufallsmitarbeiter ein erfolgreiches Spiel (keine Konflikte) ist (keine Konflikte). Es verlässt sofort die Schleife und fängt an. Mit anderen Worten, wenn es 100 zufällige Mitarbeiter in einer Reihe versucht, ohne ein Match zu finden, gehe ich davon aus, dass es nicht ein Match finden und meine Verluste nur schnitt.

Die zweite Variable, Zuweisungen, wird jedes Mal um 1 inkrementiert, wenn der Vorgang eine erfolgreiche Aufgabe ergibt. Wenn diese Zahl der Anzahl der Verschiebungen entspricht, die die Prozedur zuweisen soll, wird sofort die Schleife austreten.

0 Loops. Ich brauchte nicht nur zwei goto, eines, um die Schleife zu verlassen, und eins, um zum Beginn des Verfahrens zurückzukehren. Ich habe auch sichergestellt, dass die Zellen im Arbeitsblatt, die sich während des Verfahrens ändern, auf ihren ursprünglichen Zustand zurückgesetzt werden Wiederholt das Zuweisungsverfahren.

Ich werde jeden dazu sparen, durch die erweiterte Version des Codes zu lesen, aber in 'Pseudo-Code' -Form sieht es so aus, dass er so aussieht:

generasacodicetagpre.

Wieder kann es (und sicherlich) eine elegante und "korrekte" Möglichkeit geben, die zur Hand zu erreichen. Diese Methode funktionierte für mich mit der angegebenen Umgebung. Dank derjenigen, die Lösungen zur Verfügung gestellt haben - obwohl ich eine andere Richtung leitete, lieferten sie ein großes Essen für den Gedanken und halfen mir, ein paar neue Methoden zu lernen (insbesondere die Klassenidee von @stenci).

Vielen Dank.

Andere Tipps

Die Frage ist zu offen für eine ausführliche Antwort, also probiere ich mit einigen Richtlinien. Ich hoffe es hilft.

Ich würde mit den folgenden Mitgliedern einen KlassenSolution verwenden:

Solution.ReadInputFromSheet() liest die Tabelle aus dem Blatt in die Klassenmitglieder

Solution.GenerateRandom() erzeugt eine neue zufällige Lösung. Versuchen Sie, ein Gleichgewicht zwischen SMART zu finden (etwas Logik hinzufügen, um total zufällige Lösungen zu vermeiden) und die Geschwindigkeit (nicht stecken bleiben, zu verlassen, nachdem Sie 10 oder 50 Zufallszahlen, die nicht funktionieren), aber die Geschwindigkeit ist wichtiger

Solution.Quality() As Double berechnet die Qualität der Lösung. Zum Beispiel eine Lösung, die nicht gültige Renditen 0 ist, wenn Joe 10 aufeinanderfolgende Verschiebungen 20 zurückgibt, 20, wenn die Verschiebungen besser verteilt sind, Renditen 100.

Solution.WriteOnSheet() Schreiben Sie die Daten von den Klassenmitgliedern in das Blatt.

Solution.Clone() As Solution() erstellt eine neue Solution-Instanz mit den gleichen Daten

Erstellen Sie einen Zyklus, der eine Lösung erstellt, prüft, ob seine Qualität besser ist als die bisher beste Qualitätslösung, wenn es besser ist, wenn es besser bleibt, sonst eine andere Lösung berechnen.

generasacodicetagpre.

Anstelle von 10000 können Sie den generakodicetagcode verwenden, um ihn für eine endliche Anzahl von Sekunden auszuführen oder einen Button zu unterbrechen, wenn Sie von der Mittagspause zurückkehren.

Eine schnellere Lösungsgeneratorfunktion ist besser als das Risiko, dass Sie mit einer schwierigen (oder unmöglichen) Lösung stecken bleiben.

Für eine intelligentere Lösungsgeneratorfunktion benötige ich weitere Informationen zu den Regeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top