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
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 vzorka = new ArrayList (); for(int i=0;i<9;i++) vzorka.add((int)(Math.signum(Math.random()*10-5))); h.otestuj(vzorka); } }
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 > T = new ArrayList >(); //matica vah wij private int[][] w; //mapovat sa bude vypocitany stav siete na aktualny cas t ... teda private TreeMap > s = new TreeMap >(); public void otestuj(ArrayList 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 tmp = new ArrayList (); 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 tmp = new ArrayList (); 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; } } } }