обратно
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;
}
}
обратно