Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

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

  1. leert das eine ganz oder
  2. 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

Bitte melde dich an um einen Kommentar abzugeben

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

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2-4
Schwierigkeit: k.A.
Webcode: 8twg-hb3e
Autor: Martin Guggisberg (Universität Basel / PH FHNW)

Zu Aufgabenblatt hinzufügen