12.15 Ein industrielles Stapelproblem

Ziel:
Der Umgang mit Funktionen soll wiederholt werden.
Vorraussetzung:
Programierung von Funktionen, Hantieren mit Feldern. Der Befehl hist steht zur Verfügung, um Histogramme zu berechnen. Der Befehl rand erzeugt gleichverteilte Zufallszahlen zwischen 0 und 1.

  1. Ein Kistenstapelproblem:
    Kisten (Quader) gleicher Größe sind so gestapelt, dass ein Quader entsteht (Größe: $ m\times n\times l$ Kisten).

    \includegraphics[width=5cm]{GRAFIK.xfig/Kisten}
    In der Abbildung ist $ m=10$, $ n=4$, $ l=5$. Gegeben sind die Koordinaten $ (m_0,n_0,l_0)$ einer Kiste (in unserem Beispiel $ m_0=6$, $ n_0=2$, $ l_0=4$). Gefragt ist nun die Mindestanzahl $ anz$ der Kisten, die ausgehend von einer Ecke entfernt werden müssen, um zur gegebenen Kiste zu gelangen (im Beispiel ist das der rot umrandete Quader der Größe $ n_r \times m_r \times l_r = 5 \times 2 \times 2 = 20$).
    Schreiben Sie eine Funktion:
    
        [anz, gr] = remcube(dim,pos) 

    Eingabeparameter:
    dim = [m, n, l]:                ein Vektor mit den Dimensionen des Stapels
    pos = [m0, n0, l0]: ein Vektor mit den Koordinaten der
    zu entfernenden Kiste

    Ausgabeparameter:
    anz: Anzahl der zu entfernenden Kisten
    gr = [mr, nr, lr]: ein Vektor mit den Dimensionen des zu
    entfernenden Stapels

  2. Histogramm:
    Schreiben Sie ein Programm, das eine Anzahl $ N$ von Kistenpositionen $ pos$ erzeugt (mit dem Befehl rand). Mittels des Programms remcub von oben können Sie zu jeder Position die Anzahl der Kisten berechnen, die man mindestens (von einem Eck ausgehend) entfernen muss, um zur gegebenen Position vorzudringen. Speichern Sie diese Zahlen in einem Vektor $ anz$. Stellen Sie diesen Vektor mit Hilfe des hist-Befehls in Form eines Histogramms dar.
    
        anz = randcube(dim,N,hanz) 

    Eingabeparameter:
    dim = [m, n, l]:                ein Vektor mit den Dimensionen des Stapels
    N: die Anzahl der zufälligen Positionen
    hanz: Anzahl der Bins für die Histogrammfunktion

    Ausgabeparameter:
    anz: Vektor mit der jeweiligen Anzahl zu
    entfernender Kisten

  3. Variationen: (freiwillig)

    Sie können das Problem noch um folgende Fragestellungen erweitern:

    1. Schichten statt Quader
      Erweitern Sie Ihre Funktionen derart, dass sie, gesteuert über einen zusätzlichen Eingabeparameter $ how$, folgendes bewerkstelligen:

      Anstatt ausgehend von einer Ecke einen ganzen Quader abzutragen, kann man nur eine Schicht herausheben. Bestimmen Sie die Dimensionen der kleinst möglichen Schicht und die Anzahl der darin enthaltenen Kisten.

      \includegraphics[width=5cm]{GRAFIK.xfig/Kisten2}
      Im Beispiel ist das die rot umrandete Schicht mit den Dimensionen $ n_r
\times m_r \times l_r = 1 \times 2 \times 2 = 4$.

      
            [anz, gr] = remcube(dim,pos,how) 

      zusätzlicher Eingabeparameter:
      how:                'c'ür Quader herausheben (cube)
      's'    für Schicht herausheben (slice)
      Sie sollten auch die Funktion randcube um den Parameter $ how$ erweitern.
    2. Quader bzw. Schichten auch nach unten entfernen
      Erweitern Sie Ihre Funktionen derart, dass sie, gesteuert über einen zusätzlichen Eingabeparameter $ dir$, folgendes bewerkstelligen:

      Anstatt die Quader bzw. Schichten immer nur nach oben entfernen zu dürfen, kann man auch erlauben, sie nach unten zu entfernen.

      \includegraphics[width=10cm]{GRAFIK.xfig/Kisten3}
      Im Beispiel wird anstatt, wie im linken Bild, der obere Quader, der untere Quader (rechtes Bild) entfernt, da er kleiner ist.

      
            [anz, gr] = remcube(dim,pos,how,dir) 

      zusätzlicher Eingabeparameter:
      dir:                'u'ür nur nach oben (up)
      'a'    für alle Richtungen erlaubt (all)
      Sie sollten auch die Funktion randcube um den Parameter $ dir$ erweitern.

Winfried Kernbichler 2005-04-26