обратно

import java.io.*;
import java.awt.*;


public class Perseptron{

        public int matrix_vesov [][];
        public int matrix_otvetov [][];
        public int width, high;
        public String name_otvetov[];
        Perseptron(int arg_high, int arg_width )
        {
                width = arg_width;
                high = arg_high;
                matrix_vesov = new int [high][width];
                matrix_otvetov = new int [width][10];
	        name_otvetov = new String [10];
        }

        boolean load ( int matrix[][], int yl,int xl, String name_file, String type_of_data)
        {
                FileInputStream mFile;
                int i, j;
                int c, last_c = 0;
                boolean minus = false;

                try{
                        mFile = new FileInputStream(name_file);
                        i = 0; j = 0;
			if ( type_of_data.equals ("otvet") )
			{
				for ( j = 0; j < xl; j ++ )
				{
					name_otvetov [j] = "";
					while ( true )
					{
						c = mFile.read();
	                                	if ( c == -1 )
						{
							System.out.println("Неверный формат файла "+name_file);
					                System.exit(0);
						}
						if ( c == 9 || c == 13 )
							break;
						name_otvetov[j] = name_otvetov[j].concat(String.valueOf ((char)c));
					}
					
				}
				c = mFile.read();
			}
                        i = 0; j = 0;
                        while(true)
                        {
                                c = mFile.read();
                                if ( c == -1 )
				{
					System.out.println("Неверный формат файла "+name_file);
			                System.exit(0);
				}
                                if ( c == '-' )
                                        minus = true;
                                if ( c == ',' )
                                {
                                        if ( minus )
                                                matrix [i][j] *= -1;
                                        j ++;
                                        matrix [i][j] = 0;
                                        minus = false;
                                }
                                if ( c == 10  && last_c == 13)
                                {
                                        if ( minus )
                                                matrix [i][j] *= -1;
	                                if ( i == yl - 1 && j == xl - 1 )
        	                                break;
                                        i ++; j = 0;
                                        matrix [i][j] = 0;
                                        minus = false;
                                }
                                if ( c == 9 || c == ' ' || c == 13 || c == 10 || c == ',' || c == '-' )
                                {
                                        last_c = c;
                                        continue;
                                }

                                matrix [i][j] = matrix [i][j] * 10 + c - '0';

                                last_c = c;
                        }

                        /* Тестовая печать
                        for ( i = 0; i < yl; i ++ )
                        {
                                for ( j = 0; j < xl; j ++ )
                                System.out.print(""+matrix [i][j]+" ");
                                System.out.println("");
                        }
                        */
                }
                catch(IOException e)
                {
                        System.out.println("Чего-то с файлом " + name_file);
                        return false;
                }
                System.out.println("Матрица считана из файла "+ name_file );
                return true;
        }

        boolean save ()
        {
                FileOutputStream mFile;
                int i, j, l, n, s [];
                s = new int [100];
                try{
                        mFile = new FileOutputStream("Vesa.pers");
                        for ( i = 0; i < high; i ++ )
                        {
                                for ( j = 0; j < width; j ++ )
                                {
                                        if ( matrix_vesov [i][j] < 0 )
                                        {
                                                mFile.write ('-');
                                                n = - matrix_vesov [i][j];
                                        }
                                        else
                                                n = matrix_vesov [i][j];
                                        l = 0;
                                        while ( n > 0 )
                                        {
                                                s [l] = n % 10 + '0';
                                                n /= 10;
                                                l ++;
                                        }
                                        if ( l == 0 )
                                        {
                                                l = 1;
                                                s[0] = '0';
                                        }
                                        for ( l --; l >= 0; l -- )
                                                mFile.write (s[l]);
                                        if ( j < width - 1 )
                                        {
                                                mFile.write (',');
                                                mFile.write (9);
                                        }
                                }
                                mFile.write (13);
                                mFile.write (10);
                        }
                }
                catch(IOException e)
                {
                        System.out.println("Чего-то с выводом в файл матрицы персептрона");
                        return false;
                }
                System.out.println("Матрица весов сохранена в файл matrix_vesov.pers");
                return true;
        }


	boolean input (int X [], int otvet)
	{
		int i, j;
		int Y [];
		boolean ret = true;
		Y = new int [width];
		for ( j = 0; j < width; j ++ ) // для каждой компоненты выходного вектора
		{
			Y [j] = 0;
			for ( i = 0; i < high; i ++ ) // для каждой компоненты входного вектора
				Y [j] += X[i] * matrix_vesov [i][j];
		
		}

		for ( j = 0; j < width; j ++ ) // для каждой компоненты выходного вектора
		{
			if ( Y [j] >= 0 ) 
				Y [j] = 1;
			else
				Y [j] = 0;
		}

		for ( j = 0; j < width; j ++ ) // сравниваем с образцом
		{
			if ( Y [j] - matrix_otvetov [j][otvet] > 0 )
			{
				//отнимаем X из j-того столбца матрицы весов
				if (ret) ret = false;
				for ( i = 0; i < high; i ++ ) 
					matrix_vesov [i][j] -= X[i];
			}
			if ( Y [j] - matrix_otvetov [j][otvet] < 0 )
			{
				//прибавляем X к j-ому столбцу матрицы весов
				if (ret) ret = false;
				for ( i = 0; i < high; i ++ ) 
					matrix_vesov [i][j] += X[i];
			}
		}
		
		return ret;
	}

	String verdict (int X [])
	{
		int i, j, k;
		int Y [];
		String ret;
		Y = new int [width];
		ret = "Sorry. Unknown figure.";
		for ( j = 0; j < width; j ++ ) // для каждой компоненты выходного вектора
		{
			Y [j] = 0;
			for ( i = 0; i < high; i ++ ) // для каждой компоненты входного вектора
				Y [j] += X[i] * matrix_vesov [i][j];
		
		}

		for ( j = 0; j < width; j ++ ) // для каждой компоненты выходного вектора
		{
			if ( Y [j] >= 0 ) 
				Y [j] = 1;
			else
				Y [j] = 0;
		}


		for ( k = 0; k < 10; k ++ ) // сравниваем со всеми образцами
		{
			for ( j = 0; j < width; j ++ ) // сравниваем с k-ым образцом
			{
				if ( Y [j] != matrix_otvetov [j][k] )
					break;
			}
			if ( j == width )
			{
				ret = name_otvetov [k];
				break;
			}
		}
		return ret;
	}
}

 обратно