import java.io.*; class neuron { /* Klasse der Neuronen */ eineur anfli=null; //Anfang der Eingangsliste (Dendritenliste) neuron nxt=null; //Zeiger auf Nachfolger in der Neuronenliste double dfa=100; //Fehlerwert double we=0; //Ausgangswert double gr=0; //Schaltschwelle double lrn=100; //Lernrate boolean inf=false; //Flag Dummy-Neuron, normales Neuron public neuron(boolean fl,neuron anf) { inf=fl;nxt=anf; } void inneur(double w) { //Einlesen von Eingangswert w in Werteneuron if(inf) we=w; } void listin(neuron nnew) { //Anhängen an die Dendritenliste anfli=new eineur(nnew,anfli); } double wert() { //Werteberechnung: eineur zwli=anfli; if(inf) return we; //wenn Dummy-Neuron, dann Ausgabe des gespeicherten Wertes we else { //sonst (normales Neuron): double su=gr; //Eingangssumme mit Schaltschwelle initialisiert for(;zwli!=null;zwli=zwli.nxt) su=su+zwli.wert(); //Summe der Eingangswerte su=Math.max(su,-1000); //Berechung des Ausgangs return 1/(Math.exp(-su)+1); } } void lernen(double d) { /* Lernprozess über Fehlerrückkopplung (Delta-Regel */ eineur zw=anfli; for(;zw!=null;zw=zw.nxt) zw.lernen(d,lrn); //korrektur der Eingangswichtungen gr=gr+lrn*d; //Korrektur der Schaltschwelle mit Lernrate 100 } } class eineur { /* Klasse der Dendriten */ neuron ne=null; //Zeiger auf Neuron, das einen Wert an den Dendriten liefert double we=0; //gewichteter Wert double fk=1; //Wichtungsfaktor eineur nxt=null; //Zeiger auf Nachfolgedendrit public eineur(neuron nnew,eineur anf) { ne=nnew;nxt=anf; } public double wert() { we=ne.wert(); //Berechnung Produkt Eingangswert, Faktor return we*fk; } void lernen(double d,double lrn) { ne.lernen(d*fk); //Lernen 1 Ebene tiefer fk=fk-lrn*d*we; //Korrektur des Faktors mit Lernrate 100 } } class cio { public static String stin(String fr) { /* Texteingabe per Tastatur, fr Frage */ DataInputStream inp=new DataInputStream(System.in); String aw=""; try { System.out.print(fr+": "); aw=inp.readLine(); } catch(IOException e){aw="";}; return aw; } public static int inin(String fr) { /* Zahleneingabe */ return new Integer(stin(fr)).intValue(); } public static double dbin(String fr) { /* Zahleneingabe */ return new Double(stin(fr)).doubleValue(); } } public class neudel { public static void main(String ctxt[]) { neuron aus=null,zwa=null,zwn=null,zw=null; double kick=100,kicka=200,ausg=0; double vor[][]=null,ein[][]=null,dif[]=null; int i=0,e=0,m=0,az=0,ez=0,nz=0,mz=0; /* Organisieren des Netzes */ ez=cio.inin("Ebenenzahl"); az=cio.inin("Ausgangszahl"); for(i=0;i0;e--) { zwn=null; if(e>1) nz=cio.inin(e+". Ebene-Neuronenzahl"); else nz=cio.inin("Eingangszahl"); for(i=0;i0.02);e++) { kicka=kick;kick=0; for (i=0;i