Modellierung eines Aufzugs mit objektorientierter Analyse und Konstruktion [geschlossen]


134

Es gibt eine Reihe von Fragen, die in Interviews und Klassen häufig verwendet werden, wenn es um objektorientiertes Design und Analyse geht. Dies ist einer von ihnen; Leider hat mein OOP-Professor am College nie eine Antwort darauf gegeben, und deshalb habe ich mich gefragt.

Das Problem ist wie folgt: Entwerfen Sie einen grundlegenden Satz von Objekten / Methoden, die zur Simulation einer Aufzugsbank verwendet werden. Was sind die Objekte und ihre Attribute / Methoden?

Nehmen wir aus Gründen der Argumentation an, dass unser Gebäude zwanzig Stockwerke hat. Die untere Etage ist die Lobby, und die zweite Etage ist mit dem Parkhaus verbunden (daher betreten / verlassen Personen das Gebäude entweder in der unteren Etage oder in der zweiten Etage). Es gibt eine Aufzugsbank, die alle Stockwerke bedient. In der Aufzugsbank befinden sich drei Aufzugsschächte und ein Aufzug pro Schacht.

Was wäre der richtige Weg, um dies in einem objektorientierten Modell zu modellieren?


9
Dies ist meine Lieblingsinterviewfrage. Es ist einfach zu fragen, aber überraschend komplex, um es richtig zu machen. Es beinhaltet Dinge wie Warteschlangen und kann leicht erweitert werden, um weitere Herausforderungen zu bewältigen. Wie würden Sie beispielsweise den Algorithmus optimieren, um Wartezeiten zu reduzieren?
Rob Di Marco

Ja, es ist eine wirklich großartige offene Frage. Ich wurde leider nie danach gefragt :(
Uri

Antworten:


165

Zuerst gibt es eine Aufzugsklasse. Es hat eine Richtung (oben, unten, Stand, Wartung), eine aktuelle Etage und eine Liste von Etagenanforderungen, die in der Richtung sortiert sind. Es erhält eine Anfrage von diesem Aufzug.

Dann gibt es eine Bank. Es enthält die Aufzüge und empfängt die Anfragen von den Etagen. Diese sind für alle aktiven Aufzüge vorgesehen (nicht in Wartung).

Die Planung wird wie folgt sein:

  • Wenn verfügbar, wählen Sie einen stehenden Aufzug für diese Etage.
  • Andernfalls wählen Sie einen Aufzug, der in diese Etage fährt.
  • Andernfalls wählen Sie einen stehenden Aufzug auf einer anderen Etage.
  • Andernfalls wählen Sie den Aufzug mit der niedrigsten Last.

Jeder Aufzug hat eine Reihe von Zuständen.

  • Wartung: Der Aufzug reagiert nicht auf externe Signale (nur auf eigene Signale).
  • Stand: Der Aufzug ist auf einer Etage befestigt. Wenn es einen Anruf erhält. Und der Aufzug ist auf dieser Etage, die Türen öffnen sich. Wenn es sich auf einer anderen Etage befindet, bewegt es sich in diese Richtung.
  • Nach oben: Der Aufzug fährt nach oben. Jedes Mal, wenn es eine Etage erreicht, prüft es, ob es anhalten muss. Wenn ja, stoppt es und öffnet die Türen. Es wartet eine gewisse Zeit und schließt die Tür (es sei denn, etwas bewegt sich durch sie. Dann entfernt es den Boden von der Anforderungsliste und prüft, ob es eine andere Anforderung gibt. Wenn ja, beginnt der Aufzug wieder zu fahren. Wenn nicht, betritt er die Tür Staatsstand.
  • Unten: wie oben, aber in umgekehrter Richtung.

Es gibt zusätzliche Signale:

  • Alarm. Der Aufzug hält an. Und wenn es sich auf einer Etage befindet, öffnen sich die Türen, die Anforderungsliste wird gelöscht, die Anforderungen werden zurück zur Bank verschoben.
  • Tür öffen. Öffnet die Türen, wenn sich ein Aufzug auf einer Etage befindet und sich nicht bewegt.
  • Tür schließt. Die Tür geschlossen, wenn sie offen sind.

BEARBEITEN: Einige Aufzüge starten nicht am unteren / ersten Stock, insb. im Falle von Wolkenkratzern.

min_floor & max_floor sind zwei zusätzliche Attribute für Elevator.


16
Aufzug Simulation play.elevatorsaga.com
Samar Panda

1
Anscheinend fehlen bei diesem Planungsansatz einige Optimierungen. Wenn beispielsweise ein Aufzug bereits in eine Etage fährt, in der eine Person einen Aufzug angefordert hat, muss kein weiterer Aufzug geplant werden.
Liron Yahdav

Wäre die Empfangsanforderung und die Zeitplanung synchron oder asynchron? Wenn asynchron, wie würden wir das erreichen?
Rohitashwa Nigam

18

Donald Knuths The Art of Computer Programming Vol.1 zeigt den Aufzug und die Datenstrukturen. Knuth präsentiert eine sehr gründliche Diskussion und ein Programm.

Knuth (1997) "Information Structures", Die Kunst der Computerprogrammierung Vol. 1 S. 302-308


9
oben mit Google Books verlinkt.
Vine'th

2
In diesem Abschnitt des Buches wird (ausführlich) beschrieben, wie eine Aufzugssimulation ausgeführt wird. Es wird NICHT beschrieben, wie es modelliert wird (auf OOP-Weise). Aber ja ... tolles Buch!
Benutzer7

17

Ich habe viele Varianten dieses Problems gesehen. Einer der Hauptunterschiede (der die Schwierigkeit bestimmt) besteht darin, ob es einen zentralisierten Versuch gibt, ein "intelligentes und effizientes System" zu haben, das einen Lastausgleich bietet (z. B. mehr müßige Aufzüge am Morgen in die Lobby schicken). Wenn dies der Fall ist, wird das Design ein ganzes Subsystem mit wirklich unterhaltsamem Design enthalten.

Ein vollständiges Design ist offensichtlich zu viel, um es hier zu präsentieren, und es gibt viele Alternativen. Die Breite ist auch nicht klar. In einem Interview werden sie versuchen herauszufinden, wie Sie denken würden. Dies sind jedoch einige der Dinge, die Sie benötigen würden:

  1. Darstellung der zentralen Steuerung (vorausgesetzt, es gibt eine).

  2. Darstellungen von Aufzügen

  3. Darstellungen der Schnittstelleneinheiten des Aufzugs (diese können von Aufzug zu Aufzug unterschiedlich sein). Natürlich auch Ruftasten auf jeder Etage usw.

  4. Darstellungen der Pfeile oder Indikatoren auf jeder Etage (fast eine "Ansicht" des Aufzugsmodells).

  5. Darstellung eines Menschen und einer Ladung (kann wichtig sein, um maximale Lasten zu berücksichtigen)

  6. Darstellung des Gebäudes (in einigen Fällen, da bestimmte Stockwerke zeitweise blockiert sein können usw.)


7

Sehen:

Lu Luo, A UML Documentation for a Elevator System
Distributed Embedded Systems, Fall 2000
Ph.D. Project Report
Carneghie Mellon University

Verknüpfung



2

Dinge, die bei der Gestaltung des Aufzugssystems zu beachten sind,

Elevator
Floor/Location Identifier
Number of steps
Rotation speed
Daterange
InstallationDate
MaintainenceDate
Department Identifier
AllowedWeight
Detail / Description
Poison Ratio (Statistics)
Start
Stop
SetDirection
SetRotationSpeed
EmergencyStop = Stop + Alert
EmergencyAccidentSenser Handler

Jeder Tastendruck führt zu einer Aufzugsanforderung, die bedient werden muss. Jede dieser Anforderungen wird an einem globalen Ort verfolgt

Die Anzahl der Aufzüge im Gebäude wird vom Benutzer festgelegt. Das Gebäude wird eine feste Anzahl von Etagen enthalten. Die Anzahl der Passagiere, die in den Aufzug passen, wird festgelegt. Die Passagiere werden gezählt, wenn sie den Aufzug in ihrer Zieletage verlassen. Die Zieletage wird unter Verwendung eines "zufälligen" Poisson-Intervalls bestimmt. Wenn alle Passagiere im Aufzug ihre Zieletagen erreicht haben, kehrt der Aufzug in die Lobby zurück, um weitere Passagiere abzuholen


2

Die Hauptsache, über die Sie sich Sorgen machen müssen, ist, wie Sie den Aufzug darüber informieren, dass er sich nach oben oder unten bewegen muss. und auch, wenn Sie eine zentralisierte Klasse haben, um dieses Verhalten zu steuern, und wie Sie das Steuerelement verteilen können.

Es scheint sehr einfach oder sehr kompliziert zu sein. Wenn wir uns nicht die Parallelität oder die Zeit nehmen, die ein Aufzug benötigt, um an einen Ort zu gelangen, scheint es einfach zu sein, da wir nur die Zustände des Aufzugs überprüfen müssen, z. B. ob er sich auf oder ab bewegt oder stillsteht. Aber wenn wir Elevator dazu bringen, Runnable zu implementieren, und ständig eine Warteschlange (linkedList) überprüfen und synchronisieren. Eine Controller-Klasse weist zu, welche Etage in die Warteschlange aufgenommen werden soll. Wenn die Warteschlange leer ist, wartet die Methode run () (queue.wait ()). Wenn diesem Aufzug eine Etage zugewiesen ist, ruft sie queue.notify () auf, um die Methode run () zu aktivieren, und run () ) ruft die Methode goToFloor (queue.pop ()) auf. Dies wird das Problem zu kompliziert machen. Ich habe versucht, es auf Papier zu schreiben, aber ich glaube nicht, dass es funktioniert. Es scheint, als müssten wir hier nicht wirklich das Problem der Parallelität oder des Timings berücksichtigen.

Irgendein Vorschlag?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.