Hopf10x12i.mws

Данные образцов (поместить в папку "C:\\dnld\\1\\")

Сеть Хопфилда

>    restart:with(plottools):with(plots):  

>    randomize():p:=rand(1..120):# Функция случайных чисел от 1 до 120

>    K:=12:        # Число образцов

>    y:=12: x:=10: # Размер

>    N:=x*y:       # Число нейронов

>    bp:=proc(x) if x=0 then -1 else 1;fi;end:#Биполярное кодирование

>    hs:=proc(x) if x<0 then 0 else 1;fi;end: #кодирование

Превращаем вектор в массив

>    Conv:=proc(VV) convert([seq([seq(VV[i+x*(j-1)],i=1..x)],j=1..y)],list);end:

Константы для рисования

>     S0:=POLYGONS([[0,0],[1,0],[1,1],[0,1]],COLOR(RGB,1,1,1)):#Пустой квадрат

>     S1:=POLYGONS([[0,0],[1,0],[1,1],[0,1]],COLOR(HUE,0.5)):#Синий квадрат

Процедура изображения объекта

>    Ris:=proc(M) local i,j,k,B,S0,S1:

>    for i  to y do

>      for j to x do

>         k:=M[i,j]:B[i,j]:=translate(S||k,j,y+1-i);

>      od:

>    od:

>    PLOT(seq(seq(B[i,j],j=1..x),i=1..y),SCALING(CONSTRAINED),AXESSTYLE(NONE));

>    end:

Считываем файлы с массивами цифр (0-пусто или 1- закрашено) и сразу рисунок заносим в список P[i]

>    for i from 0 to K do

>      M||i:=readdata(cat("C:\\dnld\\1\\",convert(i,string),".txt"),integer,30):

>    P[i]:=display(Ris(M||i),PLOT(TEXT([10,-0.3],convert(i,string),COLOR(RGB,1,0,0)))):

>    od:

Выводим последовательно все исходные данные

>    display(seq(P[i],i=0..K),insequence=true);

[Maple Plot]

Из массива  получаем вектор

>    for i from 0 to K do

>     V[i]:=Vector[column]([seq(seq(bp(M||i[m,n]),n=1..x),m=1..y)]);

>    od:

Формируем матрицу (сеть) Хопфилда

>    B:=Matrix(N,N):

>    for i to N do

>     for j to N do

>      B[i,j]:=add(V[k1][i]*V[k1][j],k1=1..K)/N:

>     od:

>    od:

Для устойчивости обнуляем диагональ

>    for i to N do B[i,i]:=0:od: convert(B,array):

>    K1:=30:

>    NN:=70: # Число итераций

>    Vz:=V[0]:#Распознаваемый образец

Основной цикл распознавания

>    for ii to NN do

>    VV:=map(hs,Vz):

>    P[ii]:=display(Ris(Conv(VV)),PLOT(TEXT([10,-0.3],
convert(ii,string),COLOR(RGB,1,0,0))),scaling=unconstrained):

>     CC:=B.Vz;

>     convert(CC,array):

>     Vzz:=map(sign,CC):

На вход подаем случайные обновленные элементы. Для синхронной (быстрой) динамики Vz:=Vzz

>     for j to K1 do k[j]:=p(); Vz[k[j]]:=Vzz[k[j]]: od;

>    od:

Выводим последовательность обновленных элементов на экран

>    display(seq(P[i],i=1..NN),insequence=true);

[Maple Plot]