Domáca č. 4 - Hoppfieldova siet

Created: 2008-10-20 - 16:20

Neviem ci to je OK, dakedy to nerozpozna vzorku a niekedy skonci uz v case 2 alebo 3... V kazdom pripade je to podla toho algoritmu, mozno tam je len syntakticka chyba niekde... Ak sa najde nejaky dobry clovek, co tam najde chybicku, nech sa mi ozve ;-). P.

Vstup v subore h.txt:


-1 1 1 1 -1 -1 -1 1 1
1 1 -1 -1 1 1 1 1 1
-1 -1 1 1 1 -1 1 -1 1

HoppfieldovaSietTester

import java.util.ArrayList;


public class HoppfieldovaSietTester {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HoppfieldovaSiet h = new HoppfieldovaSiet();
		ArrayList<Integer> vzorka = new ArrayList<Integer>();
		for(int i=0;i<9;i++)
			vzorka.add((int)(Math.signum(Math.random()*10-5)));
		h.otestuj(vzorka);
	}
}

HoppfieldovaSiet:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeMap;

public class HoppfieldovaSiet {
	//treningova mnozina
	private ArrayList<ArrayList<Integer>> T = new ArrayList<ArrayList<Integer>>();

	//matica vah wij
	private int[][] w;
	
	//mapovat sa bude vypocitany stav siete na aktualny cas t ... teda <t,s(t)>
	private TreeMap<Integer, ArrayList<Integer>> s = new TreeMap<Integer, ArrayList<Integer>>();

	public void otestuj(ArrayList<Integer> vzorka) {
		File subor = new File("h.txt");
		Scanner sc = null;
		int n = 0;
		int m = 0;
		//nacitavanie je klasicke
		try {
			sc = new Scanner(subor);
			while (sc.hasNextLine()) {
				String riadok = sc.nextLine();
				Scanner riadkovy = new Scanner(riadok);
				ArrayList<Integer> tmp = new ArrayList<Integer>();
				while (riadkovy.hasNext()) {
					tmp.add(riadkovy.nextInt());
				}
				n = tmp.size();
				T.add(tmp);
				m++;
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			sc.close();
		}
		//vypocitanie matice w[i][j]
		w = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				int medziVypocet = 0;
				for (int k = 0; k < m; k++) {
					medziVypocet += T.get(k).get(i) * T.get(k).get(j);
				}
				if (i != j)
					w[i][j] = medziVypocet;
				else
					w[i][j] = 0;
			}

		}
		//zistovanie stavu (s) v case t pre vstupnu vzorku 
			s.put(0, vzorka); //porovnavame s nahodnou vzorkou
			int t = 1; //zaciname iteracia
			while (0==0) { //kvazi-nekonecny cyklus sa zastavi po 1000 iteraciach
				ArrayList<Integer> tmp = new ArrayList<Integer>();
				for (int i = 0; i < n; i++) {
					//vyp pocita i-tu cast vektora s(t)
					double vyp = 0;
					for (int j = 0; j < n; j++) {
						//vypocitame tak, ze prenasobime ity riadok matice s 
						//vektorom reprezntujucim predchadzajuci stav
						vyp += w[i][j] * s.get(t-1).get(j);
					}
					//hodnotu vynasobime 1/n a zistime signum
					vyp = Math.signum((1.0/(double)n) * vyp);
					//vyp hodime do pomocneho zoznamu tmp, ktory postupne
					//vybudujeme na s(t)
					if(vyp == 0) //spec. pripad
						vyp = 1;
					tmp.add((int)vyp);
				}
				//mapujeme aktualny vektor na cas t
				s.put(t, tmp);
				//a robime porovnavanie
				if (s.get(t).equals(s.get(t - 1))) {
					System.out.println("Hop. siet reprezentuje danu vzorku");
					System.out.println("x:"+vzorka);
					System.out.println("--------");
					System.out.println("s("+(t-1)+")"+s.get(t - 1));
					System.out.println("s("+t+")"+s.get(t));
					System.out.println("--------");
					break;
				}
				t++;
				//ak to bezi pridhlo, tak... tolko casu nemame :-)
				if (t > 1000){
					System.out.println("Hop. siet nereprezentuje danu vzorku");
					System.out.println("x:"+vzorka);
					System.out.println("---------");
					break;
				}
			}
	}
}