Java :: Aufgabe #249
1 Lösung

Das Problemspiel der spagetti-essenden Philosophen
Anfänger - Java
von hollst
- 04.12.2019 um 18:44 Uhr
wiki
https://de.wikipedia.org/wiki/Philosophenproblem
Fünf Philosophen sitzen um einen runden Tisch, vor jedem ein Teller voll mit Spagetti und links davon eine Gabel (BILD 1).
Um von dem Teller Spagetti essen zu können, benötigt man allerdings zwei Gabeln. Die zweite Gabel kann man sich von seinem
rechten Nachbarn borgen, sofern dieser nicht gerade selber beim Essen ist. Außerdem sollte man seine eigene Gabel auch nicht gerade
an seinen linken Nachbarn verborgt haben.
Das Spiel beginnt beim ersten Philosophen und geht Schritt für Schritt wie folgt reihum:
Jeder Philosoph kann sich in einem von drei möglichen Zuständen befinden,
u. z. denkend (Zustand 1, zu Beginn alle fünf Philosophen), hungernd (2) oder essend (3).
Ein denkender Philosoph kann per Zufallsentscheidung entweder in diesem Zustand 1 verweilen (dann geht der Zeiger sofort weiter an
seinen rechten Nachbarn) oder sich für "Essenwollen" entscheiden (Übergang von Zustand 1 in Zustand 2). In diesem Fall muss er prüfen,
ob ihm zwei Gabeln zur Verfügung stehen. Wenn Ja geht er von Zusand 2 in den Zustand 3 über und kann (sagen wir) zwei [Variable E wie Essen] Runden lang essen. Nach den zwei [E] Runden wird er zunächst wieder zum denkenden Philosophen (Zustand 1), der geleerte Teller wird sofort wieder aufgefüllt, falls der Philosoph erneut Hunger bekommt.
Hat er allerdings keine zwei Gabeln zur Verfügung, bleibt er die Runde hungrig (er verharrt im Zustand 2). Bekommt ein Philosoph
(sagen wir) zehn [Variable T wie Tod] Runden lang hintereinander nichts zu essen, ist er verhungert und das Gelage auch zu ende.
Die Frage lautet, nach wie vielen Runden (abhängig von E und T) ist im Durchschitt der erste Philosoph verhungert. Viel Spaß!
https://de.wikipedia.org/wiki/Philosophenproblem
Fünf Philosophen sitzen um einen runden Tisch, vor jedem ein Teller voll mit Spagetti und links davon eine Gabel (BILD 1).
Um von dem Teller Spagetti essen zu können, benötigt man allerdings zwei Gabeln. Die zweite Gabel kann man sich von seinem
rechten Nachbarn borgen, sofern dieser nicht gerade selber beim Essen ist. Außerdem sollte man seine eigene Gabel auch nicht gerade
an seinen linken Nachbarn verborgt haben.
Das Spiel beginnt beim ersten Philosophen und geht Schritt für Schritt wie folgt reihum:
Jeder Philosoph kann sich in einem von drei möglichen Zuständen befinden,
u. z. denkend (Zustand 1, zu Beginn alle fünf Philosophen), hungernd (2) oder essend (3).
Ein denkender Philosoph kann per Zufallsentscheidung entweder in diesem Zustand 1 verweilen (dann geht der Zeiger sofort weiter an
seinen rechten Nachbarn) oder sich für "Essenwollen" entscheiden (Übergang von Zustand 1 in Zustand 2). In diesem Fall muss er prüfen,
ob ihm zwei Gabeln zur Verfügung stehen. Wenn Ja geht er von Zusand 2 in den Zustand 3 über und kann (sagen wir) zwei [Variable E wie Essen] Runden lang essen. Nach den zwei [E] Runden wird er zunächst wieder zum denkenden Philosophen (Zustand 1), der geleerte Teller wird sofort wieder aufgefüllt, falls der Philosoph erneut Hunger bekommt.
Hat er allerdings keine zwei Gabeln zur Verfügung, bleibt er die Runde hungrig (er verharrt im Zustand 2). Bekommt ein Philosoph
(sagen wir) zehn [Variable T wie Tod] Runden lang hintereinander nichts zu essen, ist er verhungert und das Gelage auch zu ende.
Die Frage lautet, nach wie vielen Runden (abhängig von E und T) ist im Durchschitt der erste Philosoph verhungert. Viel Spaß!
Lösungen:
Absoluter Programmieranfänger, der gerade die ersten Schritte mit Java macht. Von daher kann die eingereichte Lösung auch total verkehrt und am Thema vorbei sein.
Klasse Main:
Java-Code
Klasse Philosophen:
Java-Code
Klasse Main:

public class Main { public static void main(String[] args) { Philosophen tisch = new Philosophen(); tisch.addPhilosoph(5); tisch.philoTisch(tisch.getPhilosophenList()); } }
Klasse Philosophen:

import java.util.ArrayList; public class Philosophen { private String philosophName; private boolean gabel; private int essen; private int tod; private int zustand; // 1 = denkend, 2 = hungernd, 3 = essend private ArrayList<Philosophen> philosophenList; public Philosophen() { philosophenList = new ArrayList<Philosophen>(); } public Philosophen(String philosophName, boolean gabel, int zustand) { super(); this.philosophName = philosophName; this.gabel = gabel; this.zustand = zustand; } public void addPhilosoph(int anzahlPhilosophen) { for (int j = 1; j <= anzahlPhilosophen; j++) { philosophenList.add(new Philosophen("philo: " + j, true, 1)); } } public void philoTisch(ArrayList philosophen) { boolean tod = false; int durchlaeufe = 0; while (tod != true) { for (int i = 0; i < philosophen.size(); i++) { Philosophen philosoph = (Philosophen) philosophen.get(i); if (philosoph.getZustand() == 1) { System.out.println(philosoph.getPhilosophName() + " denkt."); int zustandZufall = 1 + (int) (Math.random() * 2); philosoph.setZustand(zustandZufall); } if (philosoph.getZustand() == 2) { System.out.println(philosoph.getPhilosophName() + " hungert jetzt."); if (i == 4) { Philosophen naechsterPhilosoph = (Philosophen) philosophen.get(0); if (naechsterPhilosoph.isGabel() == true) { philosoph.setZustand(3); System.out.println(philosoph.getPhilosophName() + " isst jetzt."); philosoph.setGabel(false); philosoph.setEssen(2); naechsterPhilosoph.setGabel(false); philosoph.setTod(0); } else { philosoph.setTod(philosoph.getTod() + 1); System.out.println(philosoph.getPhilosophName() + " hungert schon seit " + philosoph.getTod() + " Runden."); if (philosoph.getTod() == 10) { System.out.println(philosoph.getPhilosophName() + " ist verhungert."); tod = true; break; } } } else { Philosophen naechsterPhilosoph = (Philosophen) philosophen.get(i + 1); if (naechsterPhilosoph.isGabel() == true) { philosoph.setZustand(3); System.out.println(philosoph.getPhilosophName() + " isst jetzt."); philosoph.setGabel(false); philosoph.setEssen(2); naechsterPhilosoph.setGabel(false); philosoph.setTod(0); } else { philosoph.setTod(philosoph.getTod() + 1); System.out.println(philosoph.getPhilosophName() + " hungert schon seit " + philosoph.getTod() + " Runden."); if (philosoph.getTod() == 10) { System.out.println(philosoph.getPhilosophName() + " ist verhungert."); tod = true; break; } } } } if (philosoph.getZustand() == 3 && philosoph.getEssen() > 0) { System.out.println(philosoph.getPhilosophName() + " isst noch."); philosoph.setEssen(philosoph.getEssen() - 1); if (philosoph.getEssen() == 0) { philosoph.setZustand(1); philosoph.setGabel(true); System.out.println(philosoph.getPhilosophName() + " denkt wieder."); } } } durchlaeufe++; } System.out.println("Nach " + durchlaeufe + " Runden ist ein Philosoph verhungert."); } public ArrayList<Philosophen> getPhilosophenList() { return philosophenList; } public void setPhilosophenList(ArrayList<Philosophen> philosophenList) { this.philosophenList = philosophenList; } public String getPhilosophName() { return philosophName; } public void setPhilosophName(String philosophName) { this.philosophName = philosophName; } public boolean isGabel() { return gabel; } public void setGabel(boolean gabel) { this.gabel = gabel; } public int getEssen() { return essen; } public void setEssen(int essen) { this.essen = essen; } public int getZustand() { return zustand; } public void setZustand(int zustand) { this.zustand = zustand; } public int getTod() { return tod; } public void setTod(int tod) { this.tod = tod; } }