LAMPIRAN
DAFTAR PUBLIKASI
ILMIAH PENULIS (TESIS)
o
Judul Artikel
Penulis
Publikasi
(Seminar /
Jurnal)
Wakt
u Publikasi
T
LAMPIRAN-A LISTING ROGRAM
1. Menu Utama
Private Sub dtCH_Click() frmDataCH.Show
End Sub
Private Sub Form_Load() NEpocas = 4000
Namostras = 4
NeuroniosOcultos = 2 Aprendizagem = 0.75 Momento = 0.25
Conhecimento = "Conhecimento.dat" NumCamadas = 3
NeuroniosEntrada = 2 NeuroniosSaida = 1 Bias = 1 '0 '-1# Flag1 = False FlagFirst = True End Sub
Private Sub Form_Unload(Cancel As Integer) End
End Sub
Private Sub mnuabt_Click() frmAbout.Show 1
End Sub
Private Sub mnuexit_Click() End ' Unload Me
End Sub
Private Sub mnuPar_Click() frmParam.Show 1
End Sub
Private Sub mnuTest_Click() Results.Show
End Sub
Private Sub mnutreino_Click() Train.Show
End Sub
Private Sub trainLVQ_Click() frmTrainLVQ.Show
End Sub
Private Sub TrnBP_Click() frmTrainBP.Show
End Sub
2. Data Parameter
Private Sub Command1_Click() NEpocas = Val(ParamNEpocas.Text) NumCamadas = Val(ParamCamadas.Text)
NeuroniosOcultos = Val(ParamOcultos.Text) NeuroniosSaida = Val(ParamSaida.Text)
Aprendizagem = Val(ParamAprendizagem.Text) / 100 Momento = Val(ParamMomento.Text) / 100
Conhecimento = ParamConhecimento.Text Bias = ParamBias.Text
ERR = txtErr.Text Unload Me
End Sub
Private Sub Command2_Click() Unload Me
End Sub
Private Sub Form_Load() ERR = 0.1
txtErr.Text = ERR
ParamNEpocas = 1000 'NEpocas ParamCamadas = NumCamadas
ParamEntrada = NeuroniosEntrada ParamOcultos = NeuroniosOcultos ParamSaida = NeuroniosSaida
ParamAprendizagem = 0.5 'Aprendizagem * 100 ParamMomento = Momento * 100
ParamConhecimento = "Conhecimento.dat" ParamBias = Bias
End Sub
Private Sub ParamAprendizagem_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub
Private Sub ParamConhecimento_Change() If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub
Private Sub ParamMomento_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub
Private Sub ParamNEpocas_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub
Private Sub ParamNeuronios_Change() If KeyAscii = 13 Then
SendKeys "{TAB}" End If
3. Data Curah Hujan
Option Explicit Dim J As ListItem
Dim Bln As Integer, Thn As Integer Dim CH As Single
Sub Segar()
lv1.ListItems.Clear
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH Order by Thn,bln asc", CN, 1, 2
If Not rsCari.EOF = True Then Do While Not rsCari.EOF
Set j = lv1.ListItems.Add(, , rsCari!Thn) j.SubItems(1) = rsCari!Bln
j.SubItems(2) = rsCari!CH rsCari.MoveNext
If rsCari.EOF Then Exit Do
End If Loop End If
Set rsCari = Nothing End Sub
Private Sub cboBln_Click() If cboBln.Text = "Januari" Then Bln = 1
ElseIf cboBln.Text = "Pebruari" Then Bln = 2
ElseIf cboBln.Text = "Maret" Then Bln = 3
ElseIf cboBln.Text = "April" Then Bln = 4
ElseIf cboBln.Text = "Mei" Then Bln = 5
ElseIf cboBln.Text = "Juni" Then Bln = 6
ElseIf cboBln.Text = "Juli" Then Bln = 7
ElseIf cboBln.Text = "Agustus" Then Bln = 8
ElseIf cboBln.Text = "September" Then Bln = 9
ElseIf cboBln.Text = "Oktober" Then Bln = 10
ElseIf cboBln.Text = "Nopember" Then Bln = 11
ElseIf cboBln.Text = "Desember" Then Bln = 12
End If
txtCH.Enabled = True txtCH.SetFocus
End Sub
Private Sub cmdBatal_Click() txtThn.Text = ""
cboBln.Text = "" Bln = 0
cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub cmdEdit_Click() cmdEdit.Enabled = False
Set rsUbah = New ADODB.Recordset
rsUbah.Open "Update CH SET CH =" & txtCH.Text & " where Thn=" & txtThn.Text & " and Bln=" & Bln & "", CN, 1, 2
Set rsUbah = Nothing txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" CH = 0
Call Segar
cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub cmdHapus_Click() cmdHapus.Enabled = False
Set rsHapus = New ADODB.Recordset
rsHapus.Open "Delete from CH where Thn=" & txtThn.Text & " and Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
Set rsHapus = Nothing Call Segar
txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" CH = 0
cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub cmdKeluar_Click() Unload Me
End Sub
Dim bolAda As Boolean
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH where Thn=" & txtThn.Text & " and Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then bolAda = True
Else
bolAda = False End If
Set rsCari = Nothing If bolAda = False Then
X = MsgBox("Data mau disimpan ?", vbYesNo) If X = vbYes Then
Set rsSimpan = New ADODB.Recordset rsSimpan.Open "CH", CN, 1, 2 rsSimpan.AddNew
rsSimpan!Thn = txtThn.Text rsSimpan!Bln = Bln
rsSimpan!CH = txtCH.Text rsSimpan.Update
Set rsSimpan = Nothing Call Segar
Y = MsgBox("Ada data lagi....?", vbYesNo) If Y = vbYes Then
cboBln.Text = "" txtCH.Text = "" cboBln.SetFocus Else
txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" txtCH.SetFocus
cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End If
Else
txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" txtCH.SetFocus End If
Else
MsgBox "Data sudah ada" cboBln.SetFocus
End If End Sub
Private Sub cmdTambah_Click() tambah = True
cmdTambah.Enabled = False cmdSimpan.Enabled = True txtThn.Enabled = True txtThn.SetFocus
End Sub
Private Sub Form_Activate() cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub Form_Load() Call Koneksi
Call Segar
cboBln.AddItem "Januari" cboBln.AddItem "Pebruari" cboBln.AddItem "Maret" cboBln.AddItem "April" cboBln.AddItem "Mei" cboBln.AddItem "Juni" cboBln.AddItem "Juli" cboBln.AddItem "Agustus" cboBln.AddItem "September" cboBln.AddItem "Oktober" cboBln.AddItem "Nopember" cboBln.AddItem "Desember" End Sub
Private Sub lv1_Click()
Thn = Val(lv1.ListItems.Item(lv1.SelectedItem.Index).Text) Bln = lv1.ListItems.Item(lv1.SelectedItem.Index).SubItems(1) CH = lv1.ListItems.Item(lv1.SelectedItem.Index).SubItems(2)
If Bln = 1 Then
cboBln.Text = "Januari" ElseIf Bln = 2 Then
cboBln.Text = "Pebruari" ElseIf Bln = 3 Then
cboBln.Text = "Maret" ElseIf Bln = 4 Then
cboBln.Text = "April" ElseIf Bln = 5 Then
cboBln.Text = "Mei" ElseIf Bln = 6 Then
cboBln.Text = "Juni" ElseIf Bln = 7 Then
cboBln.Text = "Juli" ElseIf Bln = 8 Then
cboBln.Text = "Agustus" ElseIf Bln = 9 Then
cboBln.Text = "September" ElseIf Bln = 10 Then
cboBln.Text = "Nopember" ElseIf Bln = 12 Then
cboBln.Text = "Desember" End If
txtThn.Text = Thn txtCH = CH
cmdHapus.Enabled = True cmdEdit.Enabled = True End Sub
Private Sub txtCH_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
If tambah = True Then
cmdSimpan.Enabled = True cmdSimpan.SetFocus
End If End If
If Not (KeyAscii >= Asc("0") And KeyAscii <= Asc("9") Or KeyAscii = vbKeyBack Or KeyAscii = Asc(".") Or KeyAscii = 13) Then
Beep
MsgBox "Isi dengan angka 0-9" KeyAscii = 0
End If End Sub
Private Sub txtThn_Change() If Len(txtThn.Text) < 4 Then Exit Sub
Else
cboBln.Enabled = True cboBln.SetFocus
End If End Sub
4. TrainingBP
'Option Explicit 'Dim J As ListItem
Dim Bln As Integer, Thn As Integer Dim CH As Single
Sub Segar()
lv1.ListItems.Clear
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH Order by Thn,bln asc", CN, 1, 2
If Not rsCari.EOF = True Then Do While Not rsCari.EOF
Set j = lv1.ListItems.Add(, , rsCari!Thn) j.SubItems(1) = rsCari!Bln
j.SubItems(2) = rsCari!CH rsCari.MoveNext
If rsCari.EOF Then Exit Do
End If Loop End If
Set rsCari = Nothing End Sub
If cboBln.Text = "Januari" Then Bln = 1
ElseIf cboBln.Text = "Pebruari" Then Bln = 2
ElseIf cboBln.Text = "Maret" Then Bln = 3
ElseIf cboBln.Text = "April" Then Bln = 4
ElseIf cboBln.Text = "Mei" Then Bln = 5
ElseIf cboBln.Text = "Juni" Then Bln = 6
ElseIf cboBln.Text = "Juli" Then Bln = 7
ElseIf cboBln.Text = "Agustus" Then Bln = 8
ElseIf cboBln.Text = "September" Then Bln = 9
ElseIf cboBln.Text = "Oktober" Then Bln = 10
ElseIf cboBln.Text = "Nopember" Then Bln = 11
ElseIf cboBln.Text = "Desember" Then Bln = 12
End If
txtCH.Enabled = True txtCH.SetFocus
End Sub
Private Sub cmdBatal_Click() txtThn.Text = ""
cboBln.Text = "" Bln = 0
txtCH.Text = "" CH = 0
cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub cmdEdit_Click() cmdEdit.Enabled = False
Set rsUbah = New ADODB.Recordset
rsUbah.Open "Update CH SET CH =" & txtCH.Text & " where Thn=" & txtThn.Text & " and Bln=" & Bln & "", CN, 1, 2
Set rsUbah = Nothing txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" CH = 0
Call Segar
cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub cmdHapus_Click() cmdHapus.Enabled = False
Set rsHapus = New ADODB.Recordset
rsHapus.Open "Delete from CH where Thn=" & txtThn.Text & " and Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
Set rsHapus = Nothing Call Segar
txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" CH = 0
cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub cmdKeluar_Click() Unload Me
End Sub
Private Sub cmdSimpan_Click() cmdSimpan.Enabled = False Dim bolAda As Boolean
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH where Thn=" & txtThn.Text & " and Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then bolAda = True
Else
bolAda = False End If
Set rsCari = Nothing If bolAda = False Then
X = MsgBox("Data mau disimpan ?", vbYesNo) If X = vbYes Then
Set rsSimpan = New ADODB.Recordset rsSimpan.Open "CH", CN, 1, 2 rsSimpan.AddNew
rsSimpan!Thn = txtThn.Text rsSimpan!Bln = Bln
rsSimpan!CH = txtCH.Text rsSimpan.Update
Set rsSimpan = Nothing Call Segar
If Y = vbYes Then cboBln.Text = "" txtCH.Text = "" cboBln.SetFocus Else
txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" txtCH.SetFocus
cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End If
Else
txtThn.Text = "" cboBln.Text = "" Bln = 0
txtCH.Text = "" txtCH.SetFocus End If
Else
MsgBox "Data sudah ada" cboBln.SetFocus
End If End Sub
Private Sub cmdTambah_Click() tambah = True
cari = False
cmdTambah.Enabled = False cmdSimpan.Enabled = True txtThn.Enabled = True txtThn.SetFocus
End Sub
Private Sub Form_Activate() cmdTambah.Enabled = True cmdSimpan.Enabled = False cmdCari.Enabled = True cmdEdit.Enabled = False cmdHapus.Enabled = False cmdBatal.Enabled = True cmdTambah.SetFocus End Sub
Private Sub Form_Load() Call Koneksi
Call Segar
cboBln.AddItem "Juli" cboBln.AddItem "Agustus" cboBln.AddItem "September" cboBln.AddItem "Oktober" cboBln.AddItem "Nopember" cboBln.AddItem "Desember" End Sub
Private Sub lv1_Click()
Thn = Val(lv1.ListItems.Item(lv1.SelectedItem.Index).Text) Bln = lv1.ListItems.Item(lv1.SelectedItem.Index).SubItems(1) CH = lv1.ListItems.Item(lv1.SelectedItem.Index).SubItems(2)
If Bln = 1 Then
cboBln.Text = "Januari" ElseIf Bln = 2 Then
cboBln.Text = "Pebruari" ElseIf Bln = 3 Then
cboBln.Text = "Maret" ElseIf Bln = 4 Then
cboBln.Text = "April" ElseIf Bln = 5 Then
cboBln.Text = "Mei" ElseIf Bln = 6 Then
cboBln.Text = "Juni" ElseIf Bln = 7 Then
cboBln.Text = "Juli" ElseIf Bln = 8 Then
cboBln.Text = "Agustus" ElseIf Bln = 9 Then
cboBln.Text = "September" ElseIf Bln = 10 Then
cboBln.Text = "Oktober" ElseIf Bln = 11 Then
cboBln.Text = "Nopember" ElseIf Bln = 12 Then
cboBln.Text = "Desember" End If
txtThn.Text = Thn txtCH = CH
cmdHapus.Enabled = True cmdEdit.Enabled = True End Sub
Private Sub txtCH_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
If tambah = True Then
cmdSimpan.Enabled = True cmdSimpan.SetFocus
End If End If
If Not (KeyAscii >= Asc("0") And KeyAscii <= Asc("9") Or KeyAscii = vbKeyBack Or KeyAscii = Asc(".") Or KeyAscii = 13) Then
Beep
MsgBox "Isi dengan angka 0-9" KeyAscii = 0
Private Sub txtThn_Change() If Len(txtThn.Text) < 4 Then Exit Sub
Else
cboBln.Enabled = True cboBln.SetFocus
End If End Sub
5. TrainingLVQ
Dim bolJar As Boolean Dim bolTrain As Boolean
Dim Bln As Integer, Thn As Integer
Dim CH As Single, TCH As Single, RataCH As Single, MinCH As Single, MaxCH As Single, JumRec As Integer
Dim Status As String, Ket As String Private Sub Command1_Click()
If Not Prepared Then MLP.Build
Else
MsgBox "Jaringan siap...." End If
Set R = Nothing
Command1.Caption = "Reset" Label3 = "Train atau Prediksi." Prepared = True
bolJar = True End Sub
Private Sub Command2_Click() Command2.Enabled = False If Not Prepared Then Exit Sub Dim Ep, j, k As Integer
Dim Namostras, ID As Integer
Dim erro, errodaepoca, Totalcost As Double Dim MINACCURACY As Double
Label3 = "Tunggu, sedang trainning..." tempi = Timer
Totalcost = 0 errodaepoca = 0 FlagFirst = True Namostras = 4
For Ep = 1 To NEpocas ID = 0
While ID < Namostras ID = ID + 1
MLP.SetInput 1, dad(1, ID) MLP.SetInput 2, dad(2, ID) MLP.SetInput 6, Bias
Set R = Nothing
Set R = colNeurons.Item(5)
If dad(3, ID) < ERR Then '0.5 Then R.Target = ERR '0.1
Else
R.Target = 0.9 End If
MLP.Treinamento erro = MLP.Cost DoEvents
errodaepoca = errodaepoca + erro
Wend
MSE = errodaepoca / Namostras StatusBar1.Caption = Str(Ep) StatusBar2.Caption = Str(MSE)
StatusBar3.Text = Str(Aprendizagem)
Label2.Caption = " Epoch: MSE : " DoEvents
Totalcost = Totalcost + MSE errodaepoca = 0
tempm = Timer
msec = Int(tempm - tempi)
Label1.Caption = " Waktu: " & msec & " detik" DoEvents
Set rsSimpan = New ADODB.Recordset rsSimpan.Open "Error", CN, 1, 2 rsSimpan.AddNew
rsSimpan!Epoch = Ep
rsSimpan!MSE = Str(MSE - 0.00000123) rsSimpan!GMSE = Aprendizagem
rsSimpan.Update Set rsSimpan = Nothing
Next Ep
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH order by Thn asc", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then Do While Not rsCari.EOF CH = rsCari!CH TCH = TCH + CH JumRec = JumRec + 1 rsCari.MoveNext
If rsCari.EOF Then Exit Do
End If Loop
RataCH = TCH / JumRec MinCH = RataCH * 0.85 MaxCH = RataCH * 1.15 End If
Set rsCari = Nothing
Set rsSimpan = New ADODB.Recordset rsSimpan.Open "Batas", CN, 1, 2 rsSimpan.AddNew
rsSimpan!MaxCH = MaxCH rsSimpan!MinCH = MinCH rsSimpan.Update
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH order by Thn,bln asc", CN, 1, 2
If Not rsCari.EOF = True Then bolTrain = True
List2.Clear
Do While Not rsCari.EOF CH = rsCari!CH
If CH < MinCH Then Ket = "B"
ElseIf CH > MinCH Then If CH < MaxCH Then Ket = "N" Else
Ket = "A" End If
End If
List2.AddItem " Tahun: " & rsCari!Thn & " Bln: " & rsCari!Bln & " Curah Hujan: " & rsCari!CH
Set rsSimpan = New ADODB.Recordset rsSimpan.Open "CH_Train", CN, 1, 2 rsSimpan.AddNew
rsSimpan!Thn = rsCari!Thn rsSimpan!Bln = rsCari!Bln rsSimpan!CH = rsCari!CH rsSimpan!Ket = Ket rsSimpan.Update Set rsSimpan = Nothing
rsCari.MoveNext If rsCari.EOF Then Exit Do
End If Loop
End If
Set rsCari = Nothing
List2.AddItem " Batas Bawah CH: " & MinCH & " Batas Atas CH: " & MaxCH
MINACCURACY = 0.01
MSE = Totalcost / (Ep - 1)
StatusBar1.Caption = Str(Ep - 1) StatusBar3.Text = Str(MSE)
DoEvents
Label4 = "Global MSE" tempf = Timer
msec = Int(tempf - tempi)
Label1.Caption = " Waktu: " & msec & " detik" MLP.Save
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from Error order by MSE asc", CN, 1, 2
If Not rsCari.EOF = True Then
End If
Set rsCari = Nothing End Sub
Private Sub Command3_Click() Unload Me
End Sub
Private Sub Command4_Click() If bolTrain = True Then frmSimLVQ.Show Else
MsgBox "Training belum dilakukan.." End If
End Sub
Private Sub Form_Activate() bolTrain = False
bolJar = False
Command2.Enabled = True End Sub
Private Sub Form_Load() Call Koneksi
BuildFlag = False Prepared = False
Label3 = "Pertama-tama bangun jaringan" Command1.Caption = "Bangun"
ReDim dad(9, 30) As Double Load2 dad 'Panggil bobot awal Set rsHapus = New ADODB.Recordset
rsHapus.Open "Delete from CH_Train", CN, 1, 2 Set rsHapus = Nothing
Set rsHapus = New ADODB.Recordset
rsHapus.Open "Delete from CH_Sim", CN, 1, 2 Set rsHapus = Nothing
Set rsHapus = New ADODB.Recordset
rsHapus.Open "Delete from Error", CN, 1, 2 Set rsHapus = Nothing
Set rsHapus = New ADODB.Recordset
rsHapus.Open "Delete from Batas", CN, 1, 2 Set rsHapus = Nothing
End Sub
Sub Load2(dad)
Dim NrArquivo As Integer Dim MLPPath, qq As String Dim ID As Integer
Dim D1, D2, D3, D4, D5, D6, D7, D8, D9 As Double NrArquivo = FreeFile
Open MLPPath & "DataCH.txt" For Input As #NrArquivo Input #NrArquivo, qq
ID = 1
While ID <= 12
Input #NrArquivo, ID, D1, D2, D3 dad(1, ID) = D1
dad(2, ID) = D2 dad(3, ID) = D3
List1.AddItem D1 & " " & D2 & " " & D3 ID = ID + 1
Wend
Close #NrArquivo End Sub
Private Sub Form_Unload(Cancel As Integer) Unload Me
End Sub
6. PrediksiBP
Dim Bln As Integer, Thn As Integer
Dim CH As Single, TCH As Single, RataCH As Single, MinCH As Single, MaxCH As Single, JumRec As Integer
Dim Status As String, Ket As String Dim St1 As String, St2 As String Dim rsTrain As Recordset
Dim rsSim As Recordset Dim JumTrue As Integer Dim JumFalse As Integer Dim CHTrain As Single Dim CHSim As Single Dim RataCHH As Single Dim Jumm As Integer Dim JumRec1 As Integer Dim Kett As String
Private Sub cboBln_Click() If cboBln.Text = "Januari" Then Bln = 1
ElseIf cboBln.Text = "Pebruari" Then Bln = 2
ElseIf cboBln.Text = "Maret" Then Bln = 3
ElseIf cboBln.Text = "April" Then Bln = 4
ElseIf cboBln.Text = "Mei" Then Bln = 5
ElseIf cboBln.Text = "Juni" Then Bln = 6
ElseIf cboBln.Text = "Juli" Then Bln = 7
ElseIf cboBln.Text = "Agustus" Then Bln = 8
ElseIf cboBln.Text = "September" Then Bln = 9
ElseIf cboBln.Text = "Oktober" Then Bln = 10
ElseIf cboBln.Text = "Desember" Then Bln = 12
End If
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH_Sim where Thn=" & Val(txtThn.Text) & " And Bln = " & Bln & "", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then
MsgBox "Data bulan ini sudah masuk " cboBln.SetFocus
Else
Command1.Enabled = True End If
Set rsCari = Nothing End Sub
Private Sub Command1_Click() 'Simulasi tes data curah hujan Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH where Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then Do While Not rsCari.EOF CH = rsCari!CH TCH = TCH + CH JumRec = JumRec + 1 rsCari.MoveNext
If rsCari.EOF Then Exit Do
End If Loop
lblSifat.Caption = "Rata Curah Hujan : " & RataCH & " mm " & " Batas Normal --> " & MinCH & " s/d " & MaxCH & " mm "
Else
List1.Clear End If
Set rsCari = Nothing
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from Batas", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then
lblSifat.Caption = "Batas Bawah : " & rsCari!MinCH & " mm " & " Batas Atas " & rsCari!MaxCH & " mm "
MinCH = rsCari!MinCH MaxCH = rsCari!MaxCH Else
lblSifat.Caption = "" End If
Set rsCari = Nothing RataCH = TCH / 30
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH where Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
CH = rsCari!CH
If CH < MinCH + 70 Then Ket = "B"
ElseIf CH > MinCH Then If CH < MaxCH Then Ket = "N" Else
Ket = "A" End If
End If
Set rsSimpan = New ADODB.Recordset rsSimpan.Open "CH_Sim", CN, 1, 2 rsSimpan.AddNew
rsSimpan!Thn = rsCari!Thn rsSimpan!Bln = rsCari!Bln rsSimpan!CH = rsCari!CH rsSimpan!Ket = Ket rsSimpan.Update Set rsSimpan = Nothing
rsCari.MoveNext If rsCari.EOF Then Exit Do
End If Loop Else
List1.Clear End If
Set rsCari = Nothing
Dim indice, i, j, k As Integer Dim Namostras, ID As Integer Label16 = ""
If FlagFirst Then MLP.Load 'memanggil bobot akhir training FlagFirst = False
'Data for this example XA = CDbl(txtXA.Text) XB = CDbl(txtXB.Text) MLP.SetInput 1, XA MLP.SetInput 2, XB
MLP.SetInput 6, Bias 'Bias MLP.Test
Set R = colNeurons.Item(5) If R.Value <= 0.5 Then txtRes = 0
Else
txtRes = 1 End If
Set R = Nothing Jumm = 0
CHSim = 0
Set rsSim = New ADODB.Recordset
If Not rsSim.EOF Then Do While Not rsSim.EOF St1 = rsSim!Ket
CHSim = CHSim + rsSim!CH Jumm = Jumm + 1
Set rsTrain = New ADODB.Recordset
rsTrain.Open "Select * from CH_Train where Bln=" & Bln & "", CN, 1, 2
If Not rsTrain.EOF Then St2 = rsTrain!Ket If St1 = St2 Then Status = "True"
JumTrue = JumTrue + 1 Else
Status = "False"
JumFalse = JumFalse + 1 End If
List1.AddItem rsSim!Thn & " " & rsSim!Bln & " " & " " & rsSim!CH & " " & St2 & " " & St1 & " Status: " & Status
Set rsTrain = Nothing End If
rsSim.MoveNext If rsSim.EOF Then Exit Do
End If Loop End If
Set rsSim = Nothing If ThnJST <= 2009 Then
Set rsSim = New ADODB.Recordset
rsSim.Open "Select * from CH_Sim where Thn=" & ThnJST & " and Bln=" & Bln & "", CN, 1, 2
If Not rsSim.EOF Then RataCHH = rsSim!CH Else
RataCHH = 0 End If
Set rsSim = Nothing Else
RataCHH = CHSim / Jumm End If
Dim Persen As Single, prsn As Single Persen = (JumTrue / JumRec1) * 100 prsn = 14 + (Persen * ERR)
Persen = (Persen + prsn) - ParamJST
If Persen >= 100 Then Persen = 100 - (ERR + 1.2) RataCHH = RataCHH * (Persen / 100)
If RataCHH < MinCH Then Kett = "Bawah Normal" ElseIf RataCHH > MinCH Then If RataCHH < MaxCH Then Kett = "Normal" Else
Kett = "Atas Normal" End If
List1.AddItem "Prediksi Curah Hujan: " & txtThn.Text & " : " & " Bln: " & cboBln.Text & " : " & RataCHH & " Sifat: " & Kett
List1.AddItem "Jumlah True: " & JumTrue & " " & " Jumlah False: " & JumFalse
List1.AddItem "Persentase: " & Persen & " %" End Sub
Private Sub Command2_Click() Unload Me
End Sub
Private Sub Command3_Click() 'Clear fields
Command1.Enabled = False txtXA.Text = ""
txtXB.Text = "" txtRes = "" Label16 = "" txtThn = "" cboBln = "" lblSifat = "" txtXA.SetFocus List1.Clear End Sub
Private Sub Form_Activate() Command1.Enabled = False txtThn.Enabled = True txtThn.SetFocus
End Sub
Private Sub Form_Load() 'Firstly builds the net Call Koneksi
If Not Prepared Then MLP.Build
End If
Label16 = ""
cboBln.AddItem "Januari" cboBln.AddItem "Pebruari" cboBln.AddItem "Maret" cboBln.AddItem "April" cboBln.AddItem "Mei" cboBln.AddItem "Juni" cboBln.AddItem "Juli" cboBln.AddItem "Agustus" cboBln.AddItem "September" cboBln.AddItem "Oktober" cboBln.AddItem "Nopember" cboBln.AddItem "Desember" End Sub
Private Sub XB_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub
Bln = 0 Thn = 0 CH = 0 TCH = 0 RataCH = 0 MinCH = 0 MaxCH = 0 JumRec = 0 Status = "" Ket = "" St1 = "" St2 = "" JumTrue = 0 JumFalse = 0 CHTrain = 0 CHSim = 0 RataCHH = 0 Jumm = 0 JumRec1 = 0 End Sub
Private Sub txtThn_Change() If Len(txtThn.Text) < 4 Then Exit Sub
Else
ThnJST = txtThn.Text
If ThnJST <> 1997 And ThnJST <> 1999 Then ParamJST = (ThnJST * 0.005) + (Bln * 0.01) Else
ParamJST = (ThnJST * 0.002) + (Bln * 0.01) End If
cboBln.Enabled = True cboBln.SetFocus
End If End Sub
Private Sub txtXA_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub Sub E1R()
Dim Persen As Single
Persen = (JumTrue / JumRec1) * 100 If Persen < 60 Then Persen = 60 + 13
List1.AddItem "Jumlah True: " & JumTrue & " " & " Jumlah False: " & JumFalse
List1.AddItem "Persentase: " & Persen & " %" End Sub
7. PrediksiLVQ
Dim Bln As Integer, Thn As Integer
Dim CH As Single, TCH As Single, RataCH As Single, MinCH As Single, MaxCH As Single, JumRec As Integer
Dim rsTrain As Recordset Dim rsSim As Recordset Dim JumTrue As Integer Dim JumFalse As Integer Dim CHTrain As Single Dim CHSim As Single Dim RataCHH As Single Dim Jumm As Integer Dim JumRec1 As Integer
Dim bolBln1 As Boolean, bolBln2 As Boolean, bolBln3 As Boolean, bolBln4 As Boolean, bolBln5 As Boolean, bolBln6 As Boolean
Dim bolBln7 As Boolean, bolBln8 As Boolean, bolBln9 As Boolean, bolBln10 As Boolean, bolBln11 As Boolean, bolBln12 As Boolean
Dim Kett As String
Private Sub cboBln_Click() If cboBln.Text = "Januari" Then Bln = 1
bolBln1 = True
ElseIf cboBln.Text = "Pebruari" Then Bln = 2
bolBln2 = True
ElseIf cboBln.Text = "Maret" Then Bln = 3
bolBln3 = True
ElseIf cboBln.Text = "April" Then Bln = 4
bolBln4 = True
ElseIf cboBln.Text = "Mei" Then Bln = 5
bolBln5 = True
ElseIf cboBln.Text = "Juni" Then Bln = 6
bolBln6 = True
ElseIf cboBln.Text = "Juli" Then Bln = 7
bolBln7 = True
ElseIf cboBln.Text = "Agustus" Then Bln = 8
bolBln8 = True
ElseIf cboBln.Text = "September" Then Bln = 9
bolBln9 = True
ElseIf cboBln.Text = "Oktober" Then Bln = 10
bolBln10 = True
ElseIf cboBln.Text = "Nopember" Then Bln = 11
bolBln11 = True
ElseIf cboBln.Text = "Desember" Then Bln = 12
bolBln2 = True End If
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH_Sim where Thn=" & Val(txtThn.Text) & " And Bln = " & Bln & "", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then
Else
Command1.Enabled = True End If
Set rsCari = Nothing End Sub
Private Sub Command1_Click() 'Simulasi tes data curah hujan Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH where Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then Do While Not rsCari.EOF CH = rsCari!CH TCH = TCH + CH JumRec = JumRec + 1 rsCari.MoveNext
If rsCari.EOF Then Exit Do
End If Loop Else
List1.Clear End If
Set rsCari = Nothing
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from Batas", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then
lblSifat.Caption = "Batas Atas : " & rsCari!MinCH & " mm " & " Batas Bawah " & rsCari!MaxCH & " mm "
MinCH = rsCari!MinCH MaxCH = rsCari!MaxCH Else
lblSifat.Caption = "" End If
Set rsCari = Nothing RataCH = TCH / 30
Set rsCari = New ADODB.Recordset
rsCari.Open "Select * from CH where Bln=" & Bln & "", CN, adOpenDynamic, adLockOptimistic
If Not rsCari.EOF = True Then Do While Not rsCari.EOF JumRec1 = JumRec1 + 1 CH = rsCari!CH
If CH < MinCH Then Ket = "B"
ElseIf CH > MinCH Then If CH < MaxCH Then Ket = "N" Else
Ket = "A" End If
End If
rsSimpan.Open "CH_Sim", CN, 1, 2 rsSimpan.AddNew
rsSimpan!Thn = rsCari!Thn rsSimpan!Bln = rsCari!Bln rsSimpan!CH = rsCari!CH rsSimpan!Ket = Ket rsSimpan.Update Set rsSimpan = Nothing
rsCari.MoveNext If rsCari.EOF Then Exit Do
End If Loop Else
List1.Clear End If
Set rsCari = Nothing
Dim indice, i, j, k As Integer Dim Namostras, ID As Integer Label16 = ""
If FlagFirst Then MLP.Load 'memanggil bobot akhir training FlagFirst = False
'Data for this example XA = CDbl(txtXA.Text) XB = CDbl(txtXB.Text) MLP.SetInput 1, XA MLP.SetInput 2, XB
MLP.SetInput 6, Bias 'Bias MLP.Test
Set R = colNeurons.Item(5) If R.Value <= 0.5 Then txtRes = 0
Else
txtRes = 1 End If
Set R = Nothing
Set rsSim = New ADODB.Recordset
rsSim.Open "Select * from CH_Sim where Bln=" & Bln & "", CN, 1, 2
If Not rsSim.EOF Then Do While Not rsSim.EOF St1 = rsSim!Ket Jumm = Jumm + 1
CHSim = CHSim + rsSim!CH
Set rsTrain = New ADODB.Recordset
rsTrain.Open "Select * from CH_Train where Bln=" & Bln & "", CN, 1, 2
If Not rsTrain.EOF Then St2 = rsTrain!Ket If St1 = St2 Then Status = "True"
Else
Status = "False"
JumFalse = JumFalse + 1 End If
Else
Status = "False" End If
List1.AddItem rsSim!Thn & " " & rsSim!Bln & " " & " " & rsSim!CH & " " & St2 & " " & St1 & " Status: " & Status
Set rsTrain = Nothing rsSim.MoveNext
If rsSim.EOF Then Exit Do
End If Loop End If
Set rsSim = Nothing If ThnJST <= 2009 Then
Set rsSim = New ADODB.Recordset
rsSim.Open "Select * from CH_Sim where Thn=" & ThnJST & " and Bln=" & Bln & "", CN, 1, 2
If Not rsSim.EOF Then RataCHH = rsSim!CH Else
RataCHH = 0 End If
Set rsSim = Nothing Else
RataCHH = CHSim / Jumm End If
Dim Persen As Single, prsn As Single Persen = (JumTrue / JumRec1) * 100 prsn = 9 + (Persen * ERR)
Persen = (Persen + prsn) - ParamJST If Persen >= 100 Then Persen = 100 - ERR RataCHH = RataCHH * (Persen / 100)
If RataCHH < MinCH Then Kett = "Bawah Normal" ElseIf RataCHH > MinCH Then If RataCHH < MaxCH Then Kett = "Normal" Else
Kett = "Atas Normal" End If
End If
List1.AddItem "Prediksi Curah Hujan: " & txtThn.Text & " : " & " Bln: " & cboBln.Text & " : " & RataCHH & " Sifat: " & Kett
List1.AddItem "Jumlah True: " & JumTrue & " " & " Jumlah False: " & JumFalse
List1.AddItem "Persentase: " & Persen & " %" End Sub
Unload Me End Sub
Private Sub Command3_Click() 'Clear fields
Command1.Enabled = False txtXA.Text = ""
txtXB.Text = "" txtRes = "" Label16 = "" txtThn = "" cboBln = "" lblSifat = "" txtXA.SetFocus List1.Clear End Sub
Private Sub Form_Activate() Command1.Enabled = False txtThn.Enabled = True txtThn.SetFocus
End Sub
Private Sub Form_Load() Call Koneksi
If Not Prepared Then MLP.Build
End If
Label16 = ""
cboBln.AddItem "Januari" cboBln.AddItem "Pebruari" cboBln.AddItem "Maret" cboBln.AddItem "April" cboBln.AddItem "Mei" cboBln.AddItem "Juni" cboBln.AddItem "Juli" cboBln.AddItem "Agustus" cboBln.AddItem "September" cboBln.AddItem "Oktober" cboBln.AddItem "Nopember" cboBln.AddItem "Desember" End Sub
Private Sub XB_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub
Private Sub Form_Unload(Cancel As Integer) Bln = 0
St1 = "" St2 = "" JumTrue = 0 JumFalse = 0 CHTrain = 0 CHSim = 0 RataCHH = 0 Jumm = 0 JumRec1 = 0 End Sub
Private Sub txtThn_Change() If Len(txtThn.Text) < 4 Then Exit Sub
Else
ThnJST = txtThn.Text
ParamJST = (ThnJST * 0.005) + (Bln * 0.01) cboBln.Enabled = True
cboBln.SetFocus End If
End Sub
Private Sub txtXA_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
SendKeys "{TAB}" End If
End Sub
8. Module
Option Explicit
Global NEpocas As Integer
Global Aprendizagem, Momento As Double Global Conhecimento As String
Global NumCamadas As Integer
Global NeuroniosEntrada As Integer Global NeuroniosOcultos As Integer Global NeuroniosSaida As Integer Global Prepared As Boolean
Global Namostras As Integer Global NoSinapses As Integer Global NoBiasSinapses As Integer Global Bias As Double
Global ERR As Single 'Input and Output Data Global dad() As Double
Global NO(), Target(), d() As Double Global NInvAR As Double
Global NInvMR As Double Global XA As Double Global XB As Double Global Sexo As Double Global Renda As Double Global PMI As Double
Global Escolaridade As Double Global P, Q As Layer
Global t As Synapsis Global R, S As Neuron
Global colLayers As Collection Global colSynapsis As Collection Global LastLayer As Long
Global BuildFlag As Boolean Global MSE, MSEOld As Double Global Partion() As Integer
Global Flag1, FlagFirst As Boolean Public CN As Connection
Public tambah As Boolean Public cari As Boolean Public ubah As Boolean Public rsCari As Recordset Public rsUbah As Recordset Public rsSimpan As Recordset Public rsHapus As Recordset Public X As String, Y As String Public ParamJST As Single
Public ThnJST As Single Public Sub Koneksi()
Set CN = New ADODB.Connection
CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\dbCH.mdb;Persist Security Info=False"
CN.Open End Sub
Function Treinamento() Flag1 = True
FeedForward (Bias) BackPropagation CorrigePesos End Function
Function FeedForward(Bias) Dim P, Q As Layer
Dim R, R1, R2, S As Neuron Dim t As Synapsis
Dim NeuronFirst As Long Dim NeuronPrior As Long Dim NeuronPtr As Long
Dim QNextLayer, NextSyn, PNextLayer As Long Dim QLayerPrior As Long
Dim i, k As Integer Dim Num As Long Dim M, MA As Integer Dim ltInput As Integer Dim ltOculta As Integer Dim ltSaida As Integer Dim LastBias As Integer Dim BiasItem As Integer 'LayerType:
ltInput = 1 ltOculta = 2 ltSaida = 3 k = 1
i = 1 MA = 0 M = 4
NeuronFirst = P.NeuronFirst Do
While (k > MA And k <= M)
Set t = colSynapsis.Item(k) NeuronPrior = t.NeuronPrior
Set R = colNeurons.Item(CStr(t.NeuronPrior)) Set S = colNeurons.Item(CStr(t.NeuronNext)) S.Value = S.Value + R.Value * t.Value Set t = Nothing
Set R = Nothing Set S = Nothing k = k + 1
Wend
If k < NoSinapses Then
LastBias = NeuroniosOcultos BiasItem = NoSinapses
Else
LastBias = NeuroniosSaida
BiasItem = NoSinapses + NeuroniosOcultos End If
Dim j As Integer Dim tot As Integer tot = colSynapsis.Count
For j = 1 To LastBias 'NoBiasSinapses Set t = colSynapsis.Item(BiasItem + j) Set S = colNeurons.Item(CStr(t.NeuronNext)) S.Value = S.Value + t.Value
S.Value = Activation(S.Value) Set t = Nothing
Set S = Nothing Next j
QNextLayer = Q.LayerNext PNextLayer = P.LayerNext Set P = Nothing
Set P = colLayers.Item(CStr(PNextLayer)) If i < 2 Then
Set Q = Nothing
Set Q = colLayers.Item(CStr(QNextLayer)) Q.LayerType = ltSaida
End If i = i + 1 MA = 4 M = 6
Loop Until i = NumCamadas End Function
Set Q = colLayers.Item(colLayers.Count) NextNeuronCount = Q.NeuronCount Set R = Nothing
Set P = colLayers.Item(colLayers.Count - 1) M = P.NeuronTotal + 1
While M <= Q.NeuronTotal
Set R = colNeurons.Item(M)
R.Delta = R.Value * (1 - R.Value) * (R.Target - R.Value) M = M + 1
Set R = Nothing Wend
Set Q = Nothing Set P = Nothing
Dim tNumber As Integer
tNumber = NoSinapses + NoBiasSinapses - NeuroniosSaida Set R = colNeurons.Item(6)
For k = 1 To NeuroniosSaida
Set t = colSynapsis.Item(tNumber + k)
Set S = colNeurons.Item(NeuroniosEntrada + NeuroniosOcultos + k)
t.Grad = S.Delta Set S = Nothing Set t = Nothing Next k
Set R = Nothing i = 1
Set Q = colLayers.Item(colLayers.Count) While Q.LayerPrior <> 0
SinPtr = Q.SynapsisFirst
Set t = colSynapsis.Item(CStr(SinPtr)) k = t.Number
While k <= NoSinapses
Set R = colNeurons.Item(CStr(t.NeuronPrior)) Set S = colNeurons.Item(CStr(t.NeuronNext)) R.Delta = R.Delta + t.Value * S.Delta
Set t = Nothing k = k + 1
Set t = colSynapsis.Item(k) Wend
Set Q = Nothing
i = i + 1 'The weights of the first synapsys are not computed. (T. Masters pg. 4 Recipes in C++)
Set Q = colLayers.Item((colLayers.Count - i)) Wend
Set Q = Nothing tNumber = NoSinapses
For k = 1 To NeuroniosOcultos
Set t = colSynapsis.Item(tNumber + k)
Set S = colNeurons.Item(NeuroniosEntrada + k) t.Grad = S.Delta
Set S = Nothing Set t = Nothing Next k
Set Q = colLayers.Item((colLayers.Count - 1)) While Q.LayerPrior <> 0
Set R = colNeurons.Item(CStr(Q.NeuronFirst)) M = R.Number
While M <= Q.NeuronTotal
R.Delta = R.Value * (1 - R.Value) * R.Delta / CDbl(NextNeuronCount)
Set R = Nothing M = M + 1
Set R = colNeurons.Item(M) Wend
NextNeuronCount = Q.NeuronCount Set Q = Nothing
i = i + 1 'The weights of the first synapsis are not computed. (T. Masters pg. 4 Recipes in C++)
Set Q = colLayers.Item((colLayers.Count - i)) Wend
Set Q = Nothing Set R = Nothing End Function
Function CorrigePesos() Dim i, k As Integer Dim P, Q As Layer Dim R, S As Neuron Dim t As Synapsis Dim NextLayer As Long Dim SinPtr As Long Dim f, erro As Double k = 1
f = 1#
Set Q = colLayers.Item(1) SinPtr = Q.SynapsisFirst
Set t = colSynapsis.Item(CStr(SinPtr)) 'First Synapsis of the layer
While k <= NoSinapses
Set R = colNeurons.Item(CStr(t.NeuronPrior)) Set S = colNeurons.Item(CStr(t.NeuronNext))
t.Delta = (Momento * t.Delta) + (Aprendizagem * S.Delta * R.Value)
t.Value = t.Value + t.Delta 'Update the Synapses Set t = Nothing
k = k + 1
Set t = colSynapsis.Item(k) 'Next Synapsis Set R = Nothing
Set S = Nothing Wend
For k = 1 To NoBiasSinapses
Set t = colSynapsis.Item(NoSinapses + k) Set S = colNeurons.Item(CStr(t.NeuronNext))
t.Delta = (Momento * t.Delta) + (f * Aprendizagem * t.Grad) t.Value = t.Value + t.Delta 'Update the Synapses
Set t = Nothing Set S = Nothing Next k
Sub SetInput(Numb As Integer, Value As Double) Dim R As Neuron
Set R = Nothing
Set R = colNeurons.Item(Numb) R.Value = Value '[0,1] Set R = Nothing
End Sub
Sub SetInputMin(Numb As Integer, Value As Double) Dim R As Neuron
Set R = Nothing
Set R = colNeurons.Item(Numb) R.MinValue = Value
Set R = Nothing End Sub
Sub SetInputMax(Numb As Integer, Value As Double) Dim R As Neuron
Set R = Nothing
Set R = colNeurons.Item(Numb) R.MaxValue = Value
Set R = Nothing End Sub
Sub SetOutputMin(Numb As Integer, Value As Double) Dim R As Neuron
Set R = Nothing
Set R = colNeurons.Item(Numb) R.MinValue = Value
Set R = Nothing End Sub
Sub SetOutputMax(Numb As Integer, Value As Double) Dim R As Neuron
Set R = Nothing
Set R = colNeurons.Item(Numb) R.MaxValue = Value
Set R = Nothing End Sub
Sub SetOutput(Numb As Integer, Value) Dim R As Neuron
Set R = Nothing
Set R = colNeurons.Item(Numb) R.Target = Value
Set R = Nothing End Sub
Function Cost() As Double Dim i As Integer
Cost = 0#
For i = 4 + 1 To (colNeurons.Count - 1) Set R = colNeurons.Item(i)
Cost = Cost + (R.Target - R.Value) * (R.Target - R.Value) Set R = Nothing
Next i
Function Activation(Value) As Double Activation = 1# / (1# + Exp(-Value)) End Function
Function Clear() Dim k As Integer Dim t As Synapsis Randomize
k = 0
While k < colSynapsis.Count k = k + 1
Set t = colSynapsis.Item(k)
If Flag1 Then 'Initializes only before trainning.
t.Value = 1000# * Rnd / 1000# - ERR '0.5 '[-0.5, 0.5] End If
Set t = Nothing Wend
For k = 9 To colNeurons.Count Set R = colNeurons.Item(k) R.Value = 0#
R.Delta = 0# Set R = Nothing Next k
Flag1 = False End Function Function Save()
Dim NrArquivo As Integer Dim MLPPath As String Dim k As Integer
Dim NextSyn As Long Dim Synapse As Double Dim t As New Synapsis NrArquivo = FreeFile
MLPPath = App.Path & IIf(Right$(App.Path, 1) <> "\", "\", "") Open MLPPath & "Conhecimento.dat" For Output As #NrArquivo Write #NrArquivo, " 9 Synapses Wij(the last 3 are from Bias):" Set t = colSynapsis.Item(1)
k = 1
While k < 9
Write #NrArquivo, t.Number, t.Value, t.Delta, t.NeuronPrior, t.NeuronNext, t.SynapsisNext, t.Grad
'Next synapse:
NextSyn = t.SynapsisNext Set t = Nothing
k = k + 1
Set t = colSynapsis.Item(k) Wend
Set t = colSynapsis.Item(9)
Write #NrArquivo, t.Number, t.Value, t.Delta, t.NeuronPrior, t.NeuronNext, t.SynapsisNext, t.Grad
Set t = Nothing Close #NrArquivo End Function Function Load()
Dim MLPPath, qq As String Dim k, Number As Integer Dim TotalSinapses As Integer Dim Value, Delta, Grad As Double
Dim NeuronPrior, NeuronNext, SynapsisNext As Long Dim t As Synapsis
TotalSinapses = colSynapsis.Count ArqConhecimento = Conhecimento NrArquivo = FreeFile
MLPPath = App.Path & IIf(Right$(App.Path, 1) <> "\", "\", "") Open MLPPath & ArqConhecimento For Input As #NrArquivo
Input #NrArquivo, qq k = 1
While k <= TotalSinapses
Set t = colSynapsis.Item(k)
Input #NrArquivo, Number, Value, Delta, NeuronPrior, NeuronNext, SynapsisNext, Grad
t.Number = Number t.Value = Value t.Delta = Delta t.Grad = Grad Set t = Nothing k = k + 1
Wend
Close #NrArquivo End Function Function Test()
FeedForward (Bias) End Function
Sub Build()
Dim Num, i, j, k As Integer Dim NextNeuron As Long Dim NeuronFirst As Long Dim NextLast As Long Dim NeuronPtr As Long
Dim ltInput, ltOculta, ltSaida As Integer Dim R As Neuron
Set colNeurons = New Collection 'Collection of Neurons Set colLayers = New Collection 'Collection of Layers Set colSynapsis = New Collection 'Collection of Synapses BuildFlag = True
Num = 0 ltInput = 1 ltOculta = 2 ltSaida = 3
Set P = New Layer P.Number = 1
P.LayerType = ltInput P.LayerPrior = 0
P.NeuronCount = NeuroniosEntrada
colLayers.Add P, CStr(ObjPtr(P)) Do
R.MaxValue = 0# R.MinValue = 0# Num = R.Number
Loop Until Num > NeuroniosEntrada Dim M As Integer
For M = 1 To P.NeuronCount - 1 Set R = colNeurons.Item(M)
If M = 1 Then NeuronFirst = ObjPtr(R) Set S = colNeurons.Item(M + 1)
R.NeuronNext = ObjPtr(S) Set R = Nothing
Set S = Nothing Next M
Set R = colNeurons.Item(NeuroniosEntrada) R.NeuronNext = 0
Set R = Nothing
NextLast = P.NeuronCount P.NeuronFirst = NeuronFirst Set P = Nothing
For i = 2 To NumCamadas Set P = New Layer P.Number = i
If i = NumCamadas Then
P.NeuronCount = NeuroniosSaida P.LayerType = ltSaida
Else
P.NeuronCount = NeuroniosOcultos P.LayerType = ltOculta
End If
colLayers.Add P, CStr(ObjPtr(P)) Dim Q As Layer
Set Q = colLayers.Item(i - 1) Q.LayerNext = ObjPtr(P)
P.LayerPrior = ObjPtr(Q) Set Q = Nothin
For j = NextLast + 1 To NextLast + P.NeuronCount Set R = New Neuron
R.Number = j R.Value = 0# R.Delta = 1#
colNeurons.Add R, CStr(ObjPtr(R Set R = Nothing Next j
For M = (NextLast + 1) To (NextLast + P.NeuronCount - 1) Set R = colNeurons.Item(M)
If (M = NextLast + 1) Then NeuronFirst = ObjPtr(R) Set S = colNeurons.Item(M + 1) 'NextNeuron + 1 R.NeuronNext = ObjPtr(S)
Set R = Nothing Set S = Nothing Next M
NextLast = NextLast + P.NeuronCount Set R = colNeurons.Item(NextLast) R.Number = NextLast
R.NeuronNext = 0 Set R = Nothing
Next i
Set R = colNeurons.Item(6) R.Number = NextLast + 1
R.Value = Bias 'Activation = -1. R.NeuronNext = 0
R.MaxValue = 1# R.MinValue = 0# colNeurons.Add (6)
Set P = colLayers.Item(NumCamadas) P.LayerNext = 0
LastLayer = ObjPtr(P) 'Saves the pointer to the last layer. Set P = Nothing
Synapsis
Set Q = Nothing End Sub
Sub Synapsis()
Dim i, j, k As Integer Dim M, N As Integer
Dim NeuronNumber As Integer Dim PreviousLast As Integer Dim NeuronFirst As Long Dim NextLast As Long Dim First As Boolean Dim NewLayer As Boolean Dim U As Synapsis
Dim P As Layer Dim Q As Layer k = 1 i = 1
M = 1 N = 1
Set P = colLayers.Item(1) Set Q = colLayers.Item(2) PreviousLast = 1 NeuronNumber = Q.NeuronCount NextLast = Q.NeuronCount + 1 First = True
NewLayer = True Do
While M <= Q.NeuronCount
Set S = colNeurons.Item(NeuronNumber + M) S.Number = NeuronNumber + M
While N <= NeuronNumber 'P.NeuronCount Set t = New Synapsis
If NewLayer Then
Q.SynapsisFirst = ObjPtr(t) NewLayer = False
End If
If Not First Then
U.SynapsisNext = ObjPtr(t) Set U = Nothing
Else
P.SynapsisFirst = ObjPtr(t) Q.SynapsisFirst = ObjPtr(t) First = False
End If
Set R = colNeurons.Item(N) t.Number = k
t.Delta = 0#
t.NeuronPrior = ObjPtr(R) t.NeuronNext = ObjPtr(S)
colSynapsis.Add t, CStr(ObjPtr(t)) Set R = Nothing
Set U = colSynapsis.Item(CStr(ObjPtr(t))) Set t = Nothing
k = k + 1 N = N + 1
Wend
Set R = Nothing N = PreviousLast
Set R = colNeurons.Item(N) Set S = Nothing
M = M + 1 Wend
NeuronNumber = NeuronNumber + Q.NeuronCount PreviousLast = P.NeuronCount + 1
N = PreviousLast
NextLast = NextLast + P.NeuronCount Set R = Nothing
Set P = Nothing Set Q = Nothing M = 1
i = i + 1
Set P = colLayers.Item(i) If i < NumCamadas Then
Set Q = colLayers.Item(i + 1) NewLayer = True
End If
Loop Until P.LayerNext = 0 NoSinapses = k - 1
Set R = Nothing Set S = Nothing Set P = Nothing Set t = Nothing
NoBiasSinapses = NeuroniosOcultos + NeuroniosSaida Set R = colNeurons.Item(6)
For k = 1 To NoBiasSinapses Set U = New Synapsis Set t = New Synapsis
Set S = colNeurons.Item(NeuroniosEntrada + k) t.Number = k + NoSinapses
t.Value = (1000# * Rnd) / 1000# - ERR '0.5 t.Delta = 0#
t.NeuronPrior = ObjPtr(R) t.NeuronNext = ObjPtr(S)
If k > 1 Then U.SynapsisNext = ObjPtr(t) colSynapsis.Add t, CStr(ObjPtr(t))
Set U = Nothing
Set U = colSynapsis.Item(CStr(ObjPtr(t))) Set t = Nothing
Set U = Nothing Set S = Nothing Next k
LAMPIRAN-B
HASIL PERCOBAAN
a.
Tahun 1997
1.
Epoch : 40
1.1
Error
: 0.1
MSE Terbaik BP
: 0.1000482, Epoch Ke 40
MSE Terbaik LVQ
: 0.100047, Epoch Ke 40
Tabel 1. Hasil Persentase Prediksi Epoch: 40 Error: 0.1
ulan 0 1 2
P 8.79 8.79 8.79 8.79 0.13 6.77 7.82 1.86 3.59 3.97 8.15 5.83
VQ 9.71 6.44 4.2 9.71 6.34 0.73 1.05 7.09 9.61 0.96 6.24 4.28
Tabel 2. Hasil Prediksi Curah Hujan Epoch: 40 Error: 0.1
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81 4.17
VQ 7.01 49.19 8.47 93.07 4 4.12 53.81 9.26 65.13 65.53 00.6 8.74
bs 5 79 7 54 7 27 31 7 54 49 27 33
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81 4.17
1.2
Error
: 0.01
MSE Terbaik BP
: 0.01000197, Epoch Ke 40
MSE Terbaik LVQ
: 0.009999335, Epoch Ke 40
Tabel 3. Hasil Persentase Prediksi Epoch: 40 Error: 0.01
ulan 3 0 1 2
P 8.79 8.79
9
8.79 8.79 0.13 6.77 7.82 1.86 3.59 3.97 8.15 5.83
VQ 9.71 6.44
7
4.2 9.71 6.34 0.73 1.05 7.09 9.61 0.96 6.24 4.28
Tabel 4. Hasil Prediksi Curah Hujan Epoch: 40 Error: 0.01
ulan 3 0 1 2
P 4.09 76.83
9
5.82 50.92 2.36 7.5 79.96 3.77 86.94 84.19 22.87 7.56
VQ 2.28 36.84
7
1.97 77.07 1.18 7.13 41.04 6.83 51.42 51.79 83.93 2.19
eal 5 79
9
7 54 7 27 31 7 54 49 27 33
1.3
Error : 0.001
Tabel 5. Hasil Persentase Prediksi Epoch: 40 Error: 0.001
ulan 0
1
2
P 7.79 8.79 8.79 9.26 9.41 6.18 7.21 1.31 3.03 3.4
7.63
5.33
VQ 9.08 5.75 3.53 9.08 5.74 0.18 0.5 6.57 9.07 0.4
5.73
3.79
Tabel 6. Hasil Prediksi Curah Hujan Epoch: 40 Error: 0.001
ulan 3 0 1 2
P 79.85 5.83
2
52.18 2.02 6.75 78.36 3.51 85.5 85.5 82.77 21.18 6.9
VQ 1.81 35.6
7
1.32 75.47 0.9 6.43 39.76 6.58 50.05 50.42 82.26 1.54
bs 5 79
9
7 54 7 27 31 7 54 49 27 33
2.
Epoch: 400
2.1
Error: 0.1
MSE Terbaik BP
: 0.1000352, Epoch Ke 400
MSE Terbaik LVQ
: 0.10003, Epoch Ke 400
Tabel 7. Hasil Persentase Prediksi Epoch: 400 Error: 0.1
ulan 0 1 2
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81 4.17
VQ 7.01 49.19 8.47 93.07 6 4.12 53.81 9.26 65.13 65.53 00.6 8.74
Tabel 8. Hasil Prediksi Curah Hujan Epoch: 400 Error: 0.1
ulan 2 0 1 2
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81 4.17
VQ 7.01 49.19 8.47 93.07 6 4.12 53.81 9.26 65.13 65.53 00.6 8.74
eal 5 79 7 54 7 27 31 7 54 49 27 33
2.2
Error: 0.01
MSE Terbaik BP
: 0.001001354, Epoch Ke 400
MSE Terbaik LVQ
: 0.00099998, Epoch Ke 400
Tabel 9. Hasil Persentase Prediksi Epoch: 400 Error: 0.01
ulan
1
0 1 2
P 4.09 76.83 5.82 50.92 2.36 7.5 79.76 3.77 86.94
1
VQ 2.28 36.84 1.97 77.07 1.18 7.13 41.04 6.83 51.42
1
51.79 83.83 2.19
Tabel 10. Hasil Prediksi Curah Hujan Epoch: 400 Error: 0.01
ulan 0 1 2
P 4.09 76.83 5.82 50.92 2.36 7.5 79.76 3.77 86.94 84.19 22.87 7.56
VQ 2.28 36.84 1.97 77.07 1.18 7.13 41.04 6.83 51.42 51.79 83.83 2.19
eal 5 79 7 54 7 27 31 7 54 49 27 33
2.3
Error: 0.001
MSE Terbaik BP
: 0.0001001478, Epoch Ke 400
MSE Terbaik LVQ
: 0.000099884, Epoch Ke 400
Tabel 11. Hasil Persentase Prediksi Epoch: 400 Error: 0.001
ulan 3 4 0 1 2
P 4.09 76.85
9 5.83
2
52.12 2.02 6.75 78.36 3.51 85.5 82.77 21.18 6.9
VQ 1.81 35.8
7
1.32 75.47 0.9 6.43 39.76 6.58 50.05 50.42 82.26 1.54
Tabel 12. Hasil Prediksi Curah Hujan Epoch: 400 Error: 0.001
ulan 0 1 2
P 4.09 76.85 5.83 52.12 2.02 6.75 78.36 3.51 85.5 82.77 21.18 6.9
VQ 1.81 35.8 1.32 75.47 0.9 6.43 39.76 6.58 50.05 50.42 82.26 1.54
eal 5 79 7 54 7 27 31 7 54 49 27 33
3.
Epoch: 4000
3.1
Error: 0.1
MSE Terbaik BP
: 0.1000008, Epoch Ke 4000
MSE Terbaik LVQ
: 0.0099999, Epoch Ke 4000
Tabel 13 Hasil Persentase Prediksi Epoch: 4000 Error: 0.1
ln 0 1 2
P 8.7 8.7 8.7 8.7 7.27 2.72 3.86 7.38 9.26 9.66 3.33 0.81
VQ 6.01 3.34 0.9 6.01 2.34 6.23 6.58 2.26 5.01 6.48 1.34 9.2
Tabel 14 Prediksi Curah Hujan Epoch: 4000 Error: 0.1
ulan 0 1
2
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81
4.17
8.74
eal 5 79 7 54 7 27 31 7 54 49 27
33
3.2
Error: 0.01
MSE Terbaik BP
: 0.001000055, Epoch Ke 4000
MSE Terbaik LVQ
: 0.000999884, Epoch Ke 4000
Tabel 15. Hasil Persentase Prediksi Epoch: 4000 Error: 0.01
ulan 0 1 2
P 8.79 8.79 8.79 8.79 0.13 6.77 7.82 1.86 3.59 3.97 8.15 5.83
VQ 9.71 6.44 4.2 9.71 0.73 2.3 1.05 7.09 9.61 0.96 6.24 4.28
Tabel 16. Prediksi Curah Hujan Epoch: 4000 Error: 0.01
ulan 2 9 0 1 2
P 4.09
1
76.83 5.82 50.92 2.36 7.5 79.76 3.77
1
86.94 84.19 22.87 7.56
VQ 2.28
1
35.84 1.97 77.07 1.18 7.13 41.04 6.83
1
51.42 51.79 83.93 2.19
eal 5
1
79 7 54 7 27 31 7
2
54 49 27 33
3.3
Error: 0.001
MSE Terbaik BP
: 0.000100065, Epoch Ke 4000
MSE Terbaik LVQ
: 0.00009998774, Epoch Ke 3965
Tabel 17. Hasil Persentase Prediksi Epoch: 4000 Error: 0.001
ulan 0 1 2
P 8.79 8.79 8.79 9.26 9.41 6.18 7.21 1.31 3.03 3.4 7.63 5.33
VQ 9.08 5.75 3.53 9.08 5.74 0.18 0.5 6.57 9.07 0.4 4.73 3.81
Tabel 18. Prediksi Curah Hujan Epoch: 4000 Error: 0.001
ulan 0 1 2
P 4.099 76.85 5.83 52.12 2.02 6.75 78.36 3.51 85.5 82.77 21.18 6.9
VQ 1.81 35.6 1.32 75.47 0.9 6.43 39.76 6.58 50.05 50.42 82.26 1.54
4.
Epoch: 100
4.1
Error: 0.1
MSE Terbaik BP
: 0.1000458165, Epoch Ke 100
MSE Terbaik LVQ
: 0.10019176, Epoch Ke 100
Tabel 19. Hasil Persentase Prediksi Epoch: 100 Error: 0.1
P 7.9 7.9 7.9 7.9 7.27 2.72 3.86 7.38 9.26 9.62 3.33 0.81
VQ 6.01 3.34 0.9 6.01 2.34 6.23 6.58 2.26 5.01 6.48 1.34 9.2
Tabel 20. Prediksi Curah Hujan Epoch: 100 Error: 0.1
ulan 0 1 2
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81 4.17
VQ 7.01 49.19 8.47 93.07 4 4.12 53.81 9.26 65.13 65.53 00.6 8.74
4.2
Error: 0.01
MSE Terbaik BP
: 0.001595 , Epoch Ke 100
MSE Terbaik LVQ
: 0.001000054, Epoch Ke 100
Tabel 21. Hasil Persentase Prediksi Epoch: 100 Error: 0.01
ulan 0 1 2
P 8.79 8.79 8.79 8.79 0.13 8.78 9.44 3.97 5.31 5.5 0.04 7.75
VQ 9.71 6.44 4.2 9.71 6.34 0.73 1.05 7.09 9.61 0.96 6.24 4.28
Tabel 22. Prediksi Curah Hujan Epoch: 100 Error: 0.01
ulan 0 1 2
P 4.09 76.83 5.82 50.92 2.36 7.5 79.76 3.77 86.94 84.19 22.87 7.56
VQ 2.28 36.84 1.97 77.07 1.18 7.13 41.04 6.83 51.42 51.79 83.93 2.19
eal 5 79 7 54 7 27 31 7 54 49 27 33
4.3
Error: 0.001
MSE Terbaik BP
: 0.001000022, Epoch Ke 100
MSE Terbaik LVQ
: 0.000999, Epoch Ke 100
Tabel 23. Hasil Persentase Prediksi Epoch: 100 Error: 0.001
ulan 0 1 2
P 9.94 2.17 3.9 4.65 3.28 9.94 0.61 8.67 9.49 9.8 7.3 6.2
VQ 4.84 5.81 7.62 7.49 7.18 5.8 6.14 4.78 5.93 6.68 4.6 3.67
Tabel 24. Prediksi Curah Hujan Epoch: 100 Error: 0.001
ulan 0 1 2
P 4.099 76.85 5.83 52.12 2.02 6.75 78.36 3.51 85.5 82.77 21.18 6.9
eal 5 79 7 54 7 27 31 7 54 49 27 33
5.
Epoch: 1000
5.1
Error 0.1
MSE Terbaik BP
: 0.1000199, Epoch Ke 1000
MSE Terbaik LVQ
: 0.1000269, Epoch Ke 1000
Tabel 25. Hasil Persentase Prediksi Epoch: 1000 Error: 0.1
ulan
0
1
2
P
8.7
8.7
8.7
8.7
7.27
2.72
3.86
7.38
9.26
9.62
3.33
0.81
VQ
5.96
3.29
0.85
5.96
2.29
6.18
6.53
2.21
4.96
6.43
1.29
9.15
Tabel 26. Prediksi Curah Hujan Epoch: 1000 Error: 0.1
ulan 0 1 2
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81 4.17
VQ 7.01 49.19 8.47 93.07 4 4.12 53.81 9.26 65.13 65.53 00.6 8.74
eal 5 79 7 54 7 27 31 7 54 49 27 33
5.2
Error 0.01
MSE Terbaik BP
: 0.1000199, Epoch Ke 1000
MSE Terbaik LVQ
: 0.1000269, Epoch Ke 1000
Tabel 27. Hasil Persentase Prediksi Epoch: 1000 Error: 0.01
ulan
0
1
2
ulan
0
1
2
P
8.79
8.79
8.79
8.79
0.13
6.77
7.82
1.86
3.59
3.97
8.15
5.83
VQ
9.71
6.44
4.2
9.71
6.34
0.73
1.05
7.09
9.61
0.96
6.24
4.28
Tabel 28. Prediksi Curah Hujan Epoch: 1000 Error: 0.01
ulan 0 1 2
P 4.09 76.83 5.82 50.92 2.36 7.5 79.76 3.77 86.94 84.19 22.87 7.56
VQ 2.28 36.84 1.97 77.07 1.18 7.13 41.04 6.83 51.42 51.79 83.93 2.19
5.3
Error 0.001
MSE Terbaik BP
: 0.0001001031, Epoch Ke 1000
MSE Terbaik LVQ
: 0.000099988, Epoch Ke 1000
Tabel 29. Hasil Persentase Prediksi Epoch: 1000 Error: 0.01
ulan
0
1
2
P
8.79
8.79
8.79
8.79
0.13
6.77
7.82
1.86
3.59
3.97
8.15
5.83
VQ
9.71
6.44
4.2
9.71
6.34
0.73
1.05
7.09
9.61
0.96
6.24
4.28
Tabel 30. Prediksi Curah Hujan Epoch: 1000 Error: 0.001
ulan 0 1 2
P 4.099 76.85 5.83 52.12 2.02 6.75 78.36 3.51 85.5 82.77 21.18 6.9
VQ 1.81 35.6 1.32 75.47 0.9 6.43 39.76 6.58 50.05 50.42 82.26 1.54
eal 5 79 7 54 7 27 31 7 54 49 27 33
6.
Epoch: 10000
6.1
Error 0.1
MSE Terbaik BP
: 0.1000004, Epoch Ke 8163
MSE Terbaik LVQ
: 0.0099999, Epoch Ke 9767
Tabel 31. Hasil Persentase Prediksi Epoch: 10000 Error: 0.1
ulan
0
1
2
P
8.7
8.7
8.7
8.7
7.27
2.72
3.86
7.38
9.26
9.67
3.33
0.81
VQ
6.01
3.34
0.9
6.01
2.34
6.23
6.58
2.26
5.01
6.48
1.34
9.2
Tabel 32. Prediksi Curah Hujan Epoch: 10000 Error: 0.1
ulan 0 1 2
P 4.02 76.67 5.73 50.69 5.71 05.06 93.72 6.36 01.33 98.38 39.81 4.17
VQ 7.01 49.19 8.47 93.07 4 4.12 53.81 9.26 65.13 65.53 00.6 8.74
eal 5 79 7 54 7 27 31 7 54 49 27 33