Algoritmi genetici (1 Viewer)

Skarso

Forumer attivo
allora il “cromosoma” di ogni individuo è costituito da una stringa di 20 caratteri
la prima parte di lunghezza LLvar1 ( 5 nel caso ) si riferisce a dist1
la seconda parte di lunghezza LLvar2 ( 5 nel caso ) si riferisce a dist2
in 5 caratteri se si adotta la notazione binaria ( 0 – 1 ) si possono avere 32 combinazioni con valori da 0 a 31 in numeri decimali
la terza parte di lunghezza LLvar3 ( 10 nel caso ) si riferisce alle 5 regole, ogni regola occupando 2 caratteri
poiché 2 caratteri danno luogo a 4 valorii tra 0 e 3, mentre a noi per ogni regola servono solo 3 valori
valore = 1 à sell
valore = 2 à flat
valore = 3 à buy
per ricavare il valore sommeremo il contenuto dei 2 bytes
ovviamente si potevano scegliere altre rappresentazioni ma questa sembra abbastanza semplice
si accettano cmq suggerimenti
sotto il codice di inizializzazione:

Codice:
'
    ' FILL TABCROMO
    '
    LLvar1 = 5       ' dist1
    LLvar2 = 5       ' dist2
    LLvar3 = 10      ' rules 2 x 5
    Ncromo = 20
    Nvar = 1: Nmeio = 10
    k = 2: LLcromo = Nvar * (LLvar1 + LLvar2 + LLvar3)
    '
    ReDim Bestx(1 To Nmeio) As Double
    ReDim Tabcromo(1 To Ncromo) As Variant
    ReDim Limeio(1 To Nmeio) As Variant
    '
    For i = 1 To Ncromo
        Tabcromo(i) = ""
        For j = 1 To LLcromo
            n = Boule(k)
            If n = 0 Then
                Tabcromo(i) = Tabcromo(i) + "0"
            Else
                Tabcromo(i) = Tabcromo(i) + "1"
            End If
        Next j
    Next i
    '
 
    For i = 1 To Nmeio
        Bestx(i) = -999
        Limeio(i) = Tabcromo(i)
    Next i
    '
    '
End Sub
 

Skarso

Forumer attivo
queste sono altre 2 routines utili per la conversione da numeri decimali a binari e viceversa:

Codice:
Sub Convtobin(num As Long, com As Variant)
    Dim i     As Integer
    Dim j     As Integer
    Dim n     As Integer
    Dim p     As Integer
    Dim z     As Long
    '
    n = Len(com) - 1
    For z = n To 0 Step -1
        p = p + 1
        If Fix(num / (2 ^ z)) > 0 Then
            Mid(com, p, 1) = "1"
            num = num - (2 ^ z)
        Else
            Mid(com, p, 1) = "0"
        End If
    Next z
    '
End Sub
Public Function Convtodec(cromo, lenght)
    Dim i     As Integer
    Dim j     As Integer
    Dim com   As Integer
    Dim S     As String
    '
    j = 0
    For i = lenght To 1 Step -1
        S = Left(cromo, i)
        If Right(S, 1) = "1" Then
        'If mid(cromo, i, 1) = "1" Then
            com = com + 2 ^ j
        End If
        j = j + 1
    Next i
    '
    Convtodec = com
    '
End Function
 

Skarso

Forumer attivo
e questa è la routine per il calcolo di una nuova generazione di 20 individui:

Codice:
Public Sub Newgen()
    Dim i         As Integer
    Dim j         As Integer
    Dim m         As Integer
    Dim p         As Integer
    Dim q         As Integer
    Dim r         As Integer
    Dim x         As Integer
    Dim cut1      As Integer
    Dim cut2      As Integer
    Dim tab2()    As Variant
    Dim cromoa    As Variant
    Dim cromob    As Variant
    Dim cromoc    As Variant
    Dim cromod    As Variant
    Dim S         As String
    Dim T         As String
    '
    ReDim tab2(1 To Ncromo) As Variant
    '
    ' azzera x nuova generazione
    For p = 1 To Ncromo
        Tabcromo(p) = ""
    Next p
    r = 0
    '
    ' CONSERVA THE BEST-ONE
    '
    r = r + 1
    tab2(r) = Limeio(1)
    '
    ' MUTAZIONE
    '
    For p = 1 To 3
        cromoa = Limeio(p)
        x = LLcromo
        cut1 = Boule(x) + 1
        S = Left(cromoa, cut1)
        If Right(S, 1) = "0" Then
            Mid(cromoa, cut1, 1) = "1"
        Else
            Mid(cromoa, cut1, 1) = "0"
        End If
        r = r + 1
        tab2(r) = cromoa
    Next p
    '
    '
    ' CROSSOVER
    '
    ' i nuovi cromosomi tra 5 e Ncromo / 2 si ottengono col crossover
    ' tra 2 cromosomi appartenenti al gruppo Nmeio
    ' i rimanenti tra Ncromo / 2 + 1 e Ncromo si ottengono col crossover
    ' tra uno del gruppo Nmeio ed uno nuovo casuale
    '
    Do While r <= Ncromo - 2
        If r <= Ncromo / 2 Then
            ' scegli 2 cromo del gruppo limeio estratti casualmente
            cut1 = 1: cut2 = 1
            Do While cut1 = cut2
                cut1 = Boule(Nmeio) + 1    ' num casuale tra 1 e Nmeio
                cut2 = Boule(Nmeio) + 1    ' num casuale tra 1 e Nmeio
            Loop
            cromoa = Limeio(cut1)
            cromob = Limeio(cut2)
        Else
            ' scegli 1 cromo del gruppo limeio casualmente
            cut1 = Boule(Nmeio) + 1
            cromoa = Limeio(cut1)
            ' costruisci 1 cromo tutto casuale
            x = 2
            cromob = ""
            For i = 1 To LLcromo
                q = Boule(x)
                If q = 1 Then
                    cromob = cromob + "1"
                Else
                    cromob = cromob + "0"
                End If
            Next i
        End If
        ' crossover tra cromoa e cromob in 3 pezzi
        ' primo pezzo
        cut1 = Boule(LLcromo - 4) + 1       ' num casuale tra 1 e LLcromo - 4
        cromoc = Left(cromoa, cut1)
        cromod = Left(cromob, cut1)
        ' secondo pezzo
        m = LLcromo - cut1
        cut2 = Boule(m) + 1                 ' num casuale tra 1 e m
        S = Left(cromob, cut1 + cut2)
        cromoc = cromoc + Right(S, cut2)
        'cromoc = cromoc + mid(cromob, cut1 + 1, cut2)
        S = Left(cromoa, cut1 + cut2)
        cromod = cromod + Right(S, cut2)
        'cromod = cromod + mid(cromoa, cut1 + 1, cut2)
        ' terzo pezzo ( eventuale )
        If Len(cromoc) < LLcromo Then
        cromoc = cromoc + Right(cromoa, LLcromo - cut1 - cut2)
        cromod = cromod + Right(cromob, LLcromo - cut1 - cut2)
        End If
        '
        r = r + 1
        tab2(r) = cromoc
        r = r + 1
        tab2(r) = cromod
    Loop
    '
    ' trasferisci nuova generazione
    For p = 1 To Ncromo
        Tabcromo(p) = tab2(p)
    Next p
    '
End Sub
 

Skarso

Forumer attivo
qualora i 3 lettori del thread non si fossero già annoiati, consiglierei la lettura del seguente “papero” abbastanza semplice per chiarirsi le idee sul funzionamento dei GA:
 

Allegati

  • AlgoritmiGenetici-1.pdf
    39,1 KB · Visite: 774

reef

...
qualora i 3 lettori del thread non si fossero già annoiati, consiglierei la lettura del seguente “papero” abbastanza semplice per chiarirsi le idee sul funzionamento dei GA:

Francesco, non è questione di noia, è che davvero ci vuole del tempo per seguirti, ed ora siamo pure "penalizzati" dalle festività natalizie. :D
I tuoi 3D andrebbero messi "in rilievo", come fiore all'occhiello della sezione, per il grado di approfondimento, il background e la fornitura dei codici.
Non è piaggeria, bisogna rendersi conto del tempo qualificato che impieghi in questa "frustrante" attività di divulgazione e proselitismo (nel senso nobile del termine).
:)
 

Skarso

Forumer attivo
Francesco, non è questione di noia, è che davvero ci vuole del tempo per seguirti, ed ora siamo pure "penalizzati" dalle festività natalizie. :D
I tuoi 3D andrebbero messi "in rilievo", come fiore all'occhiello della sezione, per il grado di approfondimento, il background e la fornitura dei codici.


e siamo a 4 lettori . . . ;)
ma certo ci vuole tempo x assimilare concetti nuovi, magari x far prima potete porre domande, anche se sono davvero scarso come dimostrato nel caso dei triangoli, proverò a rispondere . . .
quanto alla presunta maggiore utilità di questo tipo di thread ci credo poco, ci sono threads che ritengo stupidi e inutili eppure forse tanto stupidi e inutili non sono se ricevono oltre 1 milione di visite . . . :rolleyes:
a meno che non abbia ragione ancora una volta Einstein quando parla del concetto di infinito . . . :D
 

marofib

Forumer storico
il problema e' che se ho bisogno di un algoritmo genetico lo vado a comprare..come vado a comprare un sistema operativo ecc
la vita e' breve e non possiamo smazzarcela a fare una cosa che cmq sara' scadente

meglio concentarsi sull'assemblaggio
 

Skarso

Forumer attivo
capisco che in un forum pubblico non si possa impedire ad eventuali disturbatori, kazzeggiatori, perditempo, distruttori di professione etc di intervenire, quindi prima di continuare vorrei precisare che le critiche pertinenti e aventi scopo costruttivo sono bene accette anzi auspicate, mentre le critiche non pertinenti e/o aventi scopo di disturbo provenienti da soggetti sopra menzionati, verranno ignorate
 
Risposta

Ciao Skarso, sono un nuovo utente del forum è sono interessato a coprendere come vorresti applicare tale strumento di programmazione ad un'analisi su serie storica. Purtroppo, nonostante abbia letto la dispensa, non sono stato in grado di comprendere a fondo lo strumento. Se potessi esporre in maniera più semplice il funzionamento e l'obiettivo ( in termini pratici) potresti veramente farmi una cortesia. Coridali saluti.
 

Users who are viewing this thread

Alto