Apfelweinproblem (Simulationen)
Ein Bauer kaufte mit seinem Freund ein 8-Liter-Fass, gefüllt mit bestem Apfelwein. Sie wollten den Wein gerecht aufteilen, besaßen aber nur einen 5-Liter-Krug und einen 3-Liter-Krug. Weder am Fass noch an den Krügen sind Markierungen angebracht. Dennoch gelang ihnen die Aufteilung.
Erstellen Sie ein Programm, welches verschiedene zufällige Reihenfolgen von Umschüttungen so lange durchspielt, bis die gerechte Aufteilung gefunden ist.
Ihr Programm startet mit dem vollen 8-Liter-Fass und den leeren Krügen. Ein Umschüttvorgang wählt nun zufällig zwei Gefäße (Fass oder Krug) und
- leert das eine ganz oder
- füllt das andere bis zum Rand.
Sobald sich in einem der Gefäße 4 Liter befinden, endet die Simulation. Geben Sie die Anzahl der Umschüttungen aus.
Bemerkung: In Umschütten wird ein Algorithmus zur Lösung dieses Problems angegeben. Dieser findet jedoch oft nicht die Variante mit den wenigsten Umschüttungen.
0 Kommentare
2 Lösung(en)
import random
# Initialisierung Fuellstand 8 in 8l Fass
# Fuellstand 0 in 5l und 3l Fass
f1=[8,8]
f2=[0,5]
f3=[0,3]
def umschuetten(fA,fB):
platz = fB[1]-fB[0]
if platz < 1:
return []
if fA[0] > platz:
fA[0]=fA[0]-platz
fB[0]=fB[0]+platz
else:
fB[0]=fB[0]+fA[0]
fA[0]=0
return fA,fB
def f1f2():
print 'F1 -> F2'
global f1,f2
l=umschuetten(f1,f2)
if l:
f1=l[0]
f2=l[1]
def f2f1():
print 'F2 -> F1'
global f1,f2
l=umschuetten(f2,f1)
if l:
f2=l[0]
f1=l[1]
def f2f3():
print 'F2 -> F3'
global f3,f2
l=umschuetten(f2,f3)
if l:
f2=l[0]
f3=l[1]
def f3f2():
print 'F3 -> F2'
global f3,f2
l=umschuetten(f3,f2)
if l:
f3=l[0]
f2=l[1]
def f1f3():
print 'F1 -> F3'
global f3,f1
l=umschuetten(f1,f3)
if l:
f1=l[0]
f3=l[1]
def f3f1():
print 'F3 -> F1'
global f3,f1
l=umschuetten(f3,f1)
if l:
f3=l[0]
f1=l[1]
# 6 Moegliche Umschuettvorgaenge
# 1:f1->f2,2:f1->f3,3:f2->f1,4:f2->f3,5:f3->f1,6:f3->f2
mod={1:f1f2,2:f1f3,3:f2f1,4:f2f3,5:f3f1,6:f3f2}
#brute force
while(f2[0]!=4):
z=random.randint(1,6)
mod.get(z)()
let counter = 0,
protocolOn = confirm('Protokoll einschalten?');
function Vessel(name, capacity, content) {
this.name = name;
this.capacity = capacity;
this.content = content;
}
let vessels = [
new Vessel('F ', 8, 8),
new Vessel('K5', 5, 0),
new Vessel('K3', 3, 0)
];
function isEquallyDistributed() {
return (vessels[0].content == 4 || vessels[1].content == 4)
}
function transpour() {
let protocol = `${counter}. `;
protocol += `[ ${vessels[0].content} | ${vessels[1].content} |` +
` ${vessels[2].content} ] `;
function pour(a, b) {
while ((vessels[a].content > 0) &&
(vessels[b].content < vessels[b].capacity)) {
vessels[a].content--;
vessels[b].content++;
}
counter++;
}
function logP() { if (protocolOn) console.log(protocol); }
// gefäße bestimmen
let a, b;
a = b = Math.floor(Math.random() * 3);
while (b == a) b = Math.floor(Math.random() * 3)
protocol += `${vessels[a].name} ? ${vessels[b].name}?`;
if ((vessels[a].content > 0) &&
(vessels[b].content < vessels[b].capacity)) {
pour(a, b);
protocol += ' Ma kuckn...';
}
else protocol += ' Näh.';
logP();
if (isEquallyDistributed()) {
console.log(`Gerechte Verteilung!(nach ${counter} Versuchen)`);
console.table(vessels);
}
}
// main
while (!isEquallyDistributed()) transpour(); // lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 2-4 |
Schwierigkeit: | k.A. |
Webcode: | 8twg-hb3e |
Autor: | Martin Guggisberg (Universität Basel / PH FHNW) |