Modellieren Haareschneiden

  • Themenstarter zDieTaschenlampe
  • Beginndatum
Diskutiere Modellieren Haareschneiden im Java Basics - Anfänger-Themen Bereich.
Z

zDieTaschenlampe

Guten Abend ihr Lieben,
es schämt mich, dass ich mich hier melden muss, aber es geht nicht mehr. Ich google seit Tagen schon nur rum, les Literatur, aber ich komme bei der (eigentlich einfachen) Aufgabe nicht voran bzw mir fehlt die Vorstellungskraft oder Basis zur Umsetzung. Ich hatte allgemein schon inhaltliche Schwierigkeiten bei der Aufgabe, aber diese haben sich gelichtet. Im Prinzip geht es um ein Friseursalon und um die Frage wie die Kunden auf die Friseure verteilt werden (genaue Details unten zsmgefasst). Also die erste Zahl die über die Kommandozeile mitgegeben wird ist die Anzahl der Friseure, die 2. ist mein Platz in der Schlange und die letzten Zahlen sind die Minuten, die der jeweilige Friseur braucht. Aber kann mir bitte irgendwer zeigen/erklären wie die Grundidee/Grundstruktur des Programms aussehen? Mir ist einfach nicht klar, wie das auszusehen hat. Weil unten im Beispieldurchlauf sieht man, dass bei 2 Friseuren es insgesamt 5 Zahlen gibt, die der Kommandozeile mitgegeben werden ( 2 Friseure Mein Platz und die Dauer in Minuten jeweils für die 2 Friseure) , aber bei 3 Friseuren sind es dann 6 Zahlen , die über die Kommandozeile mitgegeben werden? Wie ist das bitte umzusetzen im Programm? Ich wäre wirklich wirklich dankbar, wenn mir jemand einen groben Aufbau von dem ganzen als Input zeigen könnte.


Hier die Infos für die Modellierung:
Sie stehen in einer langen Schlange, um einen Haarschnitt in einem Friseursalon zu bekommen. Der Salon hat B Friseure im Dienst, welche von 1 bis B durchnummeriert sind. Der k te Friseur braucht immer genau Mk Minuten, um einem Kunden die Haare zu schneiden. Ein Friseur kann gleichzeitig nur einem Kunden die Haare schneiden, sobald ein Friseur die Haare des Kunden fertig geschnitten hat, schneidet er sofort die Haare des nächsten Kunden.

Solange der Friseursalon geöffnet ist, geht der Kunde, welcher an der Spitze der Schlange steht, immer zum Friseur mit der niedrigsten Nummer, der verfügbar ist. Wenn kein Friseur verfügbar ist, wartet dieser Kunde, bis mindestens einer verfügbar ist. Sie sind die n te Person in der Warteschlange, und der Friseursalon hat gerade geöffnet. Welcher Friseur wird Ihnen die Haare schneiden?

Um diese Frage beantworten zu können, nimmt Ihr Programm mehre natürliche Zahlen als Kommandozeilenparameter entgegen und gibt das Ergebnis wieder auf die Kommandozeile aus. Sie können davon ausgehen, dass die eingegebenen Parameter immer dem hier vorgegebenen Format entsprechen. Setzen Sie nur die in der Aufgabenstellung angegebenen Informationen um. Die erste Zahl ist die Anzahl der Friseure B (1<=B<=1000) und die zweite Zahl ist Ihr Platz in der Warteschlange N (1<=N<=10^9). Der Kunde am Anfang der Schlange hat den Platz mit der Nummer 1, der nächste ist Nummer 2 und so weiter. Die nachfolgenden Zahlen sind M1 M2 M3 .. Mk
Sobald das Ergebnis dieser Eingabe feststeht, wird die Nummer des Friseurs, der Ihnen die Haare schneiden wird, über den standardmäßigen Ausgabe-Stream auf die Kommandozeile ausgegeben. Danach beendet sich Ihr Programm regulär.

Eine Beispieleingabe des Programms sieht so aus :

> java Haircut 2 4 10 5
1
> java Haircut 3 12 7 7 7
3
> java Haircut 3 8 4 2 1
1

Also ich weiß net ob die Aufgabe für euch direkt klar ist, aber beim Beispiel 1 bedeutet es einfach, dass ich an Platz 4 in der Warteschlange sitze bei 2 Friseuren, die ein mal 10 und 5 Minuten brauchen. Kunde 1 geht also zu Friseur 1 und braucht 10 minuten. Währenddessen macht Friseur 2 Kunde 2 und 3, da dieser nur 5 Minuten braucht. Also bin ich (Platz 4 in der Schlange) wieder beim 1. Friseur. Allein um das zu verstehen hab ich tage gebraucht. Deswegen wäre um jegliche Hilfe dankbar
 
J

JustNobody

- Kannst Du für jeden Friseur aufstellen, wann dieser einen neuen Kunden ran nimmt?
- Kannst Du Werte sortieren?

Dann solltest Du einmal überlegen, wie Du das zusammen dazu verwenden könntest, um eine Lösung zu finden.
 
MoxxiManagarm

MoxxiManagarm

Du solltest erst einmal versuchen das Problem zu modellieren. Was hast du...

In erster Linie brauchst du einen Friseur. Dieser Friseur hat 3 Attribute: Nummer, Generell benötigte Zeit, Restzeit des aktuellen Schnitts

Dann hast du eine Warteschlange. Letztlich willst du wissen wann die Warteschlange bis zu deiner Position leer ist. Man kann abstrakt annehmen, dass du der letzte in der Warteschlange bist. Du kannst das abbilden, indem du einfach die Position hochzählst und sie mit deiner Position abgleichst.

Dein erster Schritt muss es also sein eine Sammlung von Friseur Objekten zu erzeugen.

Dann gibt es verschiedene Möglichkeiten.

1) Dann hast du eine Schleife, welche so lange läuft bis n erreicht ist. Eine Iteration der Schleife ist eine Minute. Die Restzeit eines Friseurs wird in jeder Iteration dekrementiert. Wenn du 0 erreichst hast wird die Zeit zurückgesetzt und ein neuer Kunde zugewiesen, also der Zähler erhöht. Falls der erhöhte Zähler deiner Position entspricht wird die Nummer des Friseurs ausgegeben und das Programm beendet. Hier reicht eine einfache Liste oder Array für die Friseure.
2) Du kannst die Liste der Friseure nach Restzeit sortieren. In jeder Iteration (entspricht hier nicht einer Minute) wird der Friseur mit der geringsten Restzeit betrachtet. Allen Friseuren wird seine Restzeit abgezogen. Diesem "vordersten" Friseur wird die Restzeit dann zurückgesetzt und er muss neu in die sortierte Friseur-Liste eingefügt werden. Für diese Implementierung würde sich eine PriorityQueue eignen.
3) Es gibt sicherlich auch irgendwelche Mathematischen Ansätze :D
4) ...
 
MoxxiManagarm

MoxxiManagarm

Ich denke, dass tendenziell die Erwartungshaltung von deinem Prof Variante 1 ist. PriorityQueue wäre nicht stabil, außer man sortiert zweitranging auch nach der Nummer. Die Ergebnisse von deiner soll-Darstellung erfordert aber eine stabile Reihenfolge.
 
J

Jangste

@MoxxiManagarm Das Verfahren schimpft sich auch Multilevel Feedback Queue oder Round Robin (beide FIFOs). Nicht stabile Sortierverfahren sind mir in Java gar nicht bekannt... Wie kommst du denn zu so einer Annahme?
 
Z

zDieTaschenlampe

Ich bedanke mich erstmal für die Inputs und ich denke ein teil ist mir jetzt klarer geworden, aber ich sollte noch erwähnen, dass diese Aufgabe nur mit java.lang zu machen ist (alos nur java.lang ist erlaubt). Deswegen sind so Sachen wie Arrays, Listen etc die aus dem util Paket kommen keine Option :/
Also ich denk mal ich muss es mit Kontrollstrukturen gelöst bekommen, sprich If und for schleifen?
 
MoxxiManagarm

MoxxiManagarm

Wie kommst du denn zu so einer Annahme?
Ich habe es ausprobiert. Vielleicht war Stabilität nicht das richtige Wort. Jedenfalls war das Ergebnis nicht das erwartete, wenn es mehrere Frieure gab, die gleichzeitig fertig wurden. Der Friseur mit Nummer 1 wird immer zuerst genommen, wenn es noch einen Friseur in der gleichen Minute gibt. Beim insert in die PriorityQueue war das nicht unbedingt gewährleistet, wenn nicht auch auf die Nummer explizit sortiert wird.

java.lang zu machen ist (alos nur java.lang ist erlaubt). Deswegen sind so Sachen wie Arrays, Listen etc die aus dem util Paket kommen keine Option :/
Wieso ist ein Array dann keine Option??
 
Z

zDieTaschenlampe

Ich habe es ausprobiert. Vielleicht war Stabilität nicht das richtige Wort. Jedenfalls war das Ergebnis nicht das erwartete, wenn es mehrere Frieure gab, die gleichzeitig fertig wurden. Der Friseur mit Nummer 1 wird immer zuerst genommen, wenn es noch einen Friseur in der gleichen Minute gibt. Beim insert in die PriorityQueue war das nicht unbedingt gewährleistet, wenn nicht auch auf die Nummer explizit sortiert wird.


Wieso ist ein Array dann keine Option??
Ich habs falsch formuliert. Ein Array an sich ist erlaubt, aber wenn es um die Arrayklasse geht (inklusive seine Funktion) ist das nicht erlaubt, da das aus dem util Paket kommt
 
M

Meniskusschaden

Ich habe es ausprobiert. Vielleicht war Stabilität nicht das richtige Wort. Jedenfalls war das Ergebnis nicht das erwartete, wenn es mehrere Frieure gab, die gleichzeitig fertig wurden.
Ich finde den Begriff eigentlich schon passend dafür und laut diesem Ausschnitt der Dokumentation wird tatsächlich keine Stabilität (oder was immer der bessere Begriff sein mag) garantiert:
The head of this queue is the least element with respect to the specified ordering. If multiple elements are tied for least value, the head is one of those elements -- ties are broken arbitrarily. The queue retrieval operations poll, remove, peek, and element access the element at the head of the queue.
 
MoxxiManagarm

MoxxiManagarm

Letztlich ist es ja egal, die erwartete Implementierung wird vermutlich auf die Variante 1 mit Arrays hinauslaufen. Also eine unbestimmte Anzahl Iterationen (Minuten), die zyklisch die Restzeit einer Sitzung dekrementieren (und ggf. resetten) bis n Friseure einen Haarschnitt begonnen haben. Das Friseur Objekt braucht für diese Variante auch keine Nummer, denn die Nummer kann über den Index abgebildet werden. Das Friseur-Objekt kennt aber die benötigte Zeit des Friseurs und die Restzeit der aktuellen Sitzung des Friseurs. Theoretisch geht es auch ohne ein zusätzliches Friseurobjekt, objektorientiert wäre das aber nicht.
 
Zuletzt bearbeitet:
J

JustNobody

Also wozu Restzeit und so? Für diese Aufgabe ist das alles Overkill finde ich.

Man kann Elemente bauen aus Minute / Friseur. Und dann baut man einfach eine Nummer von Elementen auf:
Friseur1 / 0
Friseur1 / x1
Friseur1 / 2*x1
Friseur1 / 3*x1
...

Friseur2 / 0
Friseur2 / x2
Friseur2 / 2*x2
...

Wobei x1 die Zeit pro Kunde bei Friseur 1 ist.

Diese Liste kann man dann einfach sortieren nach der Zeit + Friseur als zweites Merkmal.
Und der nte Kunde ist dann das nte Element.

Jetzt ist die Frage, wie viele Element pro Friseur als Minimum aufgestellt werden müssen.
Worst case wäre, dass alle Friseure bis auf einen nur 1 Kunden annehmen (zum Zeitpunkt 0) und ein Friseur alle abarbeiten muss. Also bei Wartestelleposition n und k Friseuren wäre das n - k + 1 Elemente pro Friseur, die man berechnen sollte am Anfang.

Da muss man auch nicht "durchsimulieren", wann wer bei welchem Friseur dran kommt.Die Slots hat man schnell erstellt und sortiert und dann kann man das sofort ablsen, wer an welcher Position bei welchem Friseur dran kommt.
 
J

Jangste

Ich würde je nach Anforderungsdefinition entscheiden, und diese ist hier ja klar: Verwende keinen Dreck, den du nicht brauchst...
 
MoxxiManagarm

MoxxiManagarm

Ich würde je nach Anforderungsdefinition entscheiden, und diese ist hier ja klar: Verwende keinen Dreck, den du nicht brauchst...
Naja, ich weiß nicht. Das wäre das Gleiche wie ein Array von x-Koordinaten und ein Array von y-Koordinaten anstatt einem Array von Punkten zu führen. Kann man machen, sollte man aber nicht.
 
Z

zDieTaschenlampe

Stabil/nicht stabil ist innerhalb der Problemdomäne klar anders definiert. Aber das ist nicht so schlimm, man weiß ja, was du auszudrücken versucht hast.



Das ist doch gar keine Tragödie...
Also mir und meinem Lehrer ist objektorientiert und sauber sogar ziemlich wichtig xD
 
Thema: 

Modellieren Haareschneiden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben