Lehrer Nussbaumer - JAVA (eine kleine Einführung ;)

Grundlagen

GUI

Eingabe

Ausgabe

Applikationen

Applets

  1. CheckBoxes
  2. Events
  3. Menüs
  4. Langton-Ameise
  5. Turmiten
  6. Fraktale
  7. Zelluläre Automaten
  8. Fraktales Wachstum
  9. Logistisches Wachstum
  10. Feigenbaum Diagramm
  11. Sortieralgorithmen
  12. Lorenz-Plot

Servlets

Beispiele

Spiele

IDEs

Skriptum

JAVA-DOCS


-----------------
letzte Änderung:
11 July 2013
-----------------
Lehrer Nussbaumers Seite

... in Arbeit ...

Zelluläre Automaten

Java - Zelluläre Automaten

Zelluläre Automaten sind Modelle, in denen die Eigenschaften der einzelnen Zellen in engem Zusammenhang mit dem Verhalten der benachbarten Zellen stehen. Im eindimensionalen Fall ist der Algorithmus am einfachsten zu formulieren. Das zeitliche Verhalten einiger "Zellen" wird in nacheinanderfolgenden Reihen dargestellt.

Im Bild wird zunächst gezeigt, dass der Wert einer Zelle aus den Eigenschaften der drei angrenzenden Zellen in der vorangegangenen Reihe berechnet wird. Die Farben der Felder entsprechen Zahlen: Weiß für 0, Rot für 1 und Grün für 2. Im unteren Teil des Bildes wird somit der Algorithmus dargestellt: Der Wert der neuen Zelle berechnet sich aus der Summe der drei Nachbarzellen. Welche Farbe der Summe zugeordnet wird, entscheidet eine mehrstellige "Codezahl":

12111099876543210
00000001201120

Für dieses Beispiel wurde die Codezahl 01201120 verwendet (3 verschiedene Farben!).

Aufgrund der Regeln "entwickelt" sich eine komplizierte Struktur aus einer (oder mehreren) Ausgangszellen. Da jeder Zeitschritt einer neuen Reihe entspricht, kann aus dem erhaltenen Bild gleichsam die zeitliche Entwicklung einer "Anfangspopulation" untersucht werden...

Das Verhalten des eindimensionalen zellulären Automaten hängt somit wesentlich von der Codezahl und von der Ausgangsposition, also von der Anzahl der Zellen und von ihrer "Farbe" (also eigentlich von ihren "Eigenschaften") ab. In diesem Sinn können zelluläre Automaten biologische Systeme oder physikalische Modelle darstellen.

Beispiel:

Trage im folgenden Applet selbst Codezahlen ein - die Ziffern 0 bis 4 entsprechen den Farben weiß, rot, grün, blau und gelb. Als Ausgangszeile wird entweder eine Startzelle (mit einem Zufallswert) oder eine Startreihe von Zellen mit Zufallswerten zwischen 0 und 4 gewählt.


Code:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;

public class zellularapp extends Applet implements ActionListener, ItemListener {

    int code[] = new int [13];
    Button ok;
    TextField eingabe;
    CheckboxGroup gruppe;
    Checkbox starteins;
    Checkbox startzufall;
    TextField startzelle;
    boolean zufall;
    Random ergebnis;

    public void init() {
	setLayout(new FlowLayout());
	Label was = new Label("Code aus maximal 13 Zahlen (0-4) eingeben:");
	add(was);
	eingabe = new TextField("0000001201120",13);
	add(eingabe);
	ok = new Button("ok");
	add(ok);
	ok.addActionListener(this);
	gruppe = new CheckboxGroup();
	starteins = new Checkbox("Startzelle",gruppe,true);
	startzufall = new Checkbox("Startreihe",gruppe,false);
	add(starteins);
	starteins.addItemListener(this);
	add(startzufall);
	startzufall.addItemListener(this);

	ergebnis = new Random();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == ok)
	    codeeintragen();
    }

    public void itemStateChanged (ItemEvent e) {
	if (e.getItemSelectable() == starteins) {
	    zufall = false;
	}
	if (e.getItemSelectable() == startzufall) {
	    zufall = true;
	}
    }

    public void codeeintragen() {
         String eintrag = eingabe.getText();
	 int el = eintrag.length();
         if (el>13) el=13;
	 for (int s=0; s<eintrag.length();s++) {
	     if (eintrag.charAt(s) == '0') code[12-s+el-13]=0;
	     if (eintrag.charAt(s) == '1') code[12-s+el-13]=1;
	     if (eintrag.charAt(s) == '2') code[12-s+el-13]=2;
	     if (eintrag.charAt(s) == '3') code[12-s+el-13]=3;
	     if (eintrag.charAt(s) == '4') code[12-s+el-13]=4;
	 }
         for (int s=eintrag.length();s<13;s++) code[s]=0;
	 repaint();

    }

    public void paint(Graphics bs) {

	int zeilealt[] = new int[120];
	int zeileneu[] = new int[120];

	int summe;

	int i;
	int zeile;

	if (zufall) {	
	    for (i=0;i<120;i++) {
		zeilealt[i]=zufallszahl(5);
	    }
	} else {
	    for (i=0;i<120;i++) {
		zeilealt[i]=0;
	    }
	    zeilealt[59]=zufallszahl(4)+1;
	}

       	zeile=0;

	for (zeile=0;zeile<100;zeile++) {
	
	    for (i=0;i<120;i++) {

		if (zeilealt[i]==0) bs.setColor(Color.white);
		if (zeilealt[i]==1) bs.setColor(Color.red);
		if (zeilealt[i]==2) bs.setColor(Color.green);
		if (zeilealt[i]==3) bs.setColor(Color.blue);
		if (zeilealt[i]==4) bs.setColor(Color.yellow);
		if (zeilealt[i]>4) bs.setColor(Color.black);

		bs.fillRect(i*5+50,zeile*5+60,5,5);

		summe=0;
		zeileneu[0]=0;
		zeileneu[119]=0;
                if ((i>0) && (i<119))
		    summe=zeilealt[i-1]+zeilealt[i]+zeilealt[i+1];

		if(summe==0) zeileneu[i]=code[0];
		if(summe==1) zeileneu[i]=code[1];
		if(summe==2) zeileneu[i]=code[2];
		if(summe==3) zeileneu[i]=code[3];
		if(summe==4) zeileneu[i]=code[4];
		if(summe==5) zeileneu[i]=code[5];
		if(summe==6) zeileneu[i]=code[6];
		if(summe==7) zeileneu[i]=code[7];
		if(summe==8) zeileneu[i]=code[8];
		if(summe==9) zeileneu[i]=code[9];
		if(summe==10) zeileneu[i]=code[10];
		if(summe==11) zeileneu[i]=code[11];
		if(summe==12) zeileneu[i]=code[12];
	    }
	    for (i=0;i<120;i++)
		zeilealt[i]=zeileneu[i];
	}
    }

    public int zufallszahl(int grenze) {
	return (int)(ergebnis.nextDouble()*grenze);
    }
}

© Alfred Nussbaumer, Weblog "MiniNuss"