AMOS THE CREATOR
Retro bilgisayar
Merhaba arkadaşlar. Bu aydan itibaren AMOS yazımız biraz daha değişik olacak. Artık komutları tek tek açıklamak yerine örnek programlar vererek bu komutların kullanılışlarını ve değişik programlama tekniklerini göreceğiz.
Bu ay sizlere basit bir 'Neural Networks' programı veriyorum. 'Neural Networks' kelimelerinin Türkçe karşılığı, 'Sinir ağları'. Bu programlama tekniğinin temelini sinir sistemimizi oluşturan hücrelerin davranışını taklit etmek oluşturur. Bunun için bir sürü yöntem vardır. Bu ay sizlere bu yöntemlerin en eski ve en basit olanlarından biri olan Hopfield network yöntemini kullanan bir program veriyorum. Programda kullandığım katsayıların formüllerini 1 numaralı kutuda bulabilirsiniz. Eğer bu konuda daha derin bilgi sahibi olmak isterseniz, bunu mektuplarınızla bize bildirin. Eğer konu ilgi görürse daha derinlemesine anlatabilirim.
Şimdi gelelim bu ayki programa. Bu program bir çeşit şekil tanıma programıdır. Programın aslını hızlı çalışması için C dilinde yazdığımdan, pek süslemeye vaktim olmadı. Gelecek ay, AMOS'un grafik komutlarını kullanarak bu program için iyi bir 'User Interface' hazırlayacağım. Programa ilk olarak tanımasını istediğiniz şekilleri veriyorsunuz. Bunlar 8x8'lik kareler şeklindedir. Şekilleri bilgisayara satır satır giriyorsunuz. Ayrıntılı bilgiyi 2 numaralı kutuda bulabilirsiniz. Şekilleri girdikten sonra katsayıları belirliyorsunuz. Daha sonra bu şekillerden herhangi birini bilinmeyen olarak yüklüyorsunuz. Bu şekli 11 numaralı seçenekle gelişigüzel bir şekilde bozuyorsunuz. Bundan sonra program elde ettiğiniz yeni şeklin diğerlerinden en çok hangisine benzediğini adım adım buluyor. Benim elde ettiğim sonuçlara göre program %22'ye varan değişikliklerde bile iyi sonuç veriyor. Bu programın bir dezavantajı, belirli örnekler verildiğinde sonucun doğru yakalanamaması. Fakat yine de program birçok uygulama için uygun. Benim kendi kullandığım şekilleri 3 numaralı kutuda bulabilirsiniz.
Bu ay sadece programın listesini veriyorum. Daha detaylı açıklamasını gelecek ay vereceğim. Şimdilik hoşça kalın. Bu arada ufak bir uyarı: Program daha evvel yazdıklarıma göre epey uzun ve karışık o yüzden yazarken dikkat edin. Ufak bir işaret hatası yanlış çalışmasına sebep olabilir.....
Rern*********************************
Rem Burak OZDEMIR 20 October 1991 *
Rem
Name:Hopfield
network
*
Rem Version: 1
*
Rem**********************************
Set Buffer 30 INITSCRN Rem
CLMNS=8
RWS=8
N_NODES=CLMNS*RWS
N_SMPLRS=3
UNKNOWN=N_SMPLRS
RESULT=N_SMPLRS+1
MXT=20 Rem Rem
Dim SMPLR(N_SMPLRS+2,N_NODES)
Dim W_MATRIX(N_NODES,N_NODES)
Rem
Global SMPLR(),W_MATRIX()
Global CLMNS, RWS, N_NODES, N_SMPLRS, UNKNOWN, RE-
SULT, MXT Rem Do Cls
Print "Options: "
Print"( 1) Örnekleri gir"
Print"( 2) Örnekleri kayit et"
Print"( 3) Örnekleri yükle"
Print "( 4) Örnekleri yaz"
Print: Print "( 5) Katsayilari hesapla"
Print"( 6) katsayilari yaz"
Print: Print"( 7) Bilinmeyen sekli gir"
Print"( 8) Bilinmeyen sekli yükle"
Print "( 9) Bilinmeyen sekli kayit et"
Print "(10) Bilinmeyen sekli göster"
Print: Print "(11) Sekile gurultu ekle"
Print:Print "(12) Hesaplamaya basla"
Print: Print"( 0) Programdan cik"
Rem
Input OPTION
If OPTION=0 Then Exit

If(OPTIONX) and OPTION<13)
On OPTION Proc GT_SMPLRS, SV_
SMPLRS,LD_SMPLRS, PRT _ SMPLRS,
SET_WEIGHTS,
PRTJWEIGHTS,
INP_
UNKNOWN, LD_UNKNOWN, SV_ UNK-
NOWN, SHW_UNKNOWN, AD_ NOISE,
ITERATE
Else
İLLEGAL
Endlf
Loop
Rem
Procedure AD_NOISE
Cls
Print: Print "Hata yüzdesini ver "
Input P
ForI=0ToNJMODES-l
T=Rnd(100)
lf(T<P)
SMPLR(UNKNOWN,I)=-SMPLR
(UN-
KNOWN,I)
Print "Altered bit ",I
Endlf
Nextl
Wait Key
End Proc
Rem
Procedure INP_UNKNOWN
Cls
Print "Bilinmeyen sekli gir "
INP_SAMPLE[UNKNOWN]
SHW_SMPLR[UNKNOWN]
End Proc
Rem
Rem
Procedure SV_SMPLRS
Cls
Print "Örnek numarasini ver
Input N
N=N-1
Print "isim ?
Input NAMES
OpenOut 1,NAMES
ForI=0ToN_NODES-l
Print #1,SMPLR(N,I)
Next I
Close 1
End Proc
Rem
Procedure LD_SMPLRS
Cls
Print "Örnek numarasi
Input N
N=N-1
Print "İsim ?
Input NAMES
Öpenin 1,NAMES
ForI=0ToN_NODES-l
Input #1,SMPLR(N,I)
Nextl
Close 1
End Proc
Rem
Procedure LD_UNKNOWN
Cls
Print "isim ?
Input NAMES
Öpenin 1,NAMES
ForI*ÖToN_NODES-l
Inpuf#LSMPLR(UNKNOWN,I)
Next f
Close 1
End Proc
Rem
Procedure SV_UNKNOWN
Cls
Print "isim ?
Input NAMES
Öpen Out 1 ,NAME$
ForI=0ToN_NODES-l
Print #1,SMPLR(N,I)
Nextl
Close 1
End Proc
Rem
Procedure GT_SMPLRS
Cls
Print
Omek numarasi Max
",N_SMPLRS
Input S
If((S>0) and(S<=N_SMPLRS))
INP_SAMPLE[S-1]
Else
İLLEGAL
Endlf
End Proc
Rem
Procedure INP_SAMPLE[S]
Cls
Print "Örnek verilerini gir "
ForR=OToRWS-l
Print "Satir ";R;
Input TEMPS
ForC=OToCLMNS-l
If Mid$(TEMP$,C+1,1 )=" I"
SMPLR(S,R*CLMNS+C)=I
Else
SMPLR(S,R*CLMNS+C)=-1
Endlf
NextC
NeXtR
VVait Key
End Proc
Rem
Procedure PRT^SMPLRS
Cls
Print "Örnek numarasini ver Max
",N_SMPLRS
Input S
If((S>0) and(S<=N_SMPLRS))
SHW_SMPLR[S-1J
Else
İLLEGAL
Endlf
End Proc
Rem
Procedure SHW_SMPLR[S]
Cls
Print "Omek ",S+1
ForR=OToRWS-l
Print "Row ";R;
ForC=OToCLMNS-l
If SMPLR(S,R*CLMNS+C)=1
TEMP$="*"
Else
TEMP$=" "
End t
Prim TEMPS;
NextC
Print
NextR
Wait Key
End Proc
Rem
Procedure SHW_UNKNOWN
SHW_SMPLR[UNKNOWN]
End Proc
Rem
Procedure SET_WEIGHTS
Cls
COUNT=0
Print "Katsayilar hesaplaniyor"
ForI=0ToN_NODES-I
ForJ=0ToN_NODES-l
W_MATRIX(I,J)=0
If(IoJ)
For S=0 To N_SMPLRS-1
W_MATRIX(I,J)=
W_MATRIX(U)
+
(SMPLR(S,I) * SMPLR(S,J))
NextS
Endlf
Inc COUNT
Next J
Next I
Print "Katsayi adedi ",COUNT
VVait Key
End Proc
Rem
Procedure PRT_WEIGHTS
Cls
Print "Katsayi matrisi"
ForI=0ToN_NODES-l
Print
ForJ=0ToN_NODES-l
Print W_MATRIX(I,J)
Next J
Nextl
VVait Key
End Proc
Rem
Procedure ITERATE
Cls
ITERATlONS=0
Print" Hesaplaniyor"
Repeat
Print
SHW_SMPLR[UNKNOWN]
ForN=0ToN_NODES-l
SIGMA[N]
TEMP=Param
NLFUNC[TEMP]
SMPLR(RESULT.N)=Param
Next N
Inc ITERATIONS
COMPARE
TEMP=Param
If(TEMPoN_NODES)
SWP_RESULT
Endlf
Until(ITERATIONS>MXT) or (TEMP =
N_NODES)
Print "Islem tamam! Iterasyon say isi ".ITE-
RATIONS
Wait Key
End Proc
Procedure SIGMA[N]
SUM=0
ForI=0ToN_NODES-l
SUM=SUM+ (W_MATRIX (N.I) * SMPLR
(UNKNOWN.I))
Nextl
End ProcfSUMj
Rem
Procedure NLFUNC[IN]
If IN>=0
Q=l
Else
Q=-l
Endlf
End Proc[Q]
Procedure SWP_RESULT
ForI=0ToN_NODES-l
SMPLR(UNKNOWN,I) = SMPLR (RE-
SULT.I)
Next I
End Proc
Procedure COMPARE
TEST=0
ForI=0ToN_NODES-l
If(SMPLR (UNKNOWN,I) = SMPLR (RE-
SULT.I))
Inc TEST
Endlf
Next I
End Proc[TEST]
Procedure İLLEGAL
Cls
Print "Hatali giriş, tekrar deneyin"
End Proc
Rem
Procedure IN1TSCRN
Screen Close 0
Screen Öpen 0,640,200,2,Hires
Cls
Flash Off
End Proc