Algoritmi genetici

mi chiedo se qualcuno conosce un programma per disegnare delle figure geometriche in particolare triangoli da inserire nel corpo di un testo
mi sarebbe utile nelle spiegazioni, grazie in anticipo a chi vorrà suggerire
 
non sono molto bravo a spiegare per cui penso che un esempio pratico valga più di tante spiegazioni . . .
per mostrare la eventuale efficacia dei GA tenteremo di stimare ex-ante su pochi dati ben 7 parametri , una impresa davvero ardua se non vogliamo commettere overfitting . . .
cercheremo di applicare il procedimento al titolo Fiat anno 2011 solo 247 dati per la previsione del rendimento dalle 1600 di oggi all’ open di domani
dividiamo l’ intervallo di variazione del predittore ( input1 = 100*(( prezzo 16/prezzo apertura )- 1 ) ) in 5 parti
dovremo cercare di stimare sia i fuzzy sets ossia le ascisse dei loro 5 punti centrali che le 5 regole relative
le ascisse dei 5 punti centrali sono:
zero = 0
mlow = 0 – dist1
low = 0 – dist1 – dist2
mhigh = 0 + dist1
high = 0 + dist1 + dist2
avendo supposto x semplicità una simmetria rispetto allo 0 sia per i valori negativi che positivi ( malgrado sappiamo che la volatilità è eteroschedastica ) la stima dei 5 punti si riduce alla stima delle 2 variabili dist1 e dist2

ecco una rappresentazione grafica dei fuzzy sets che saranno utilizzati e di cui devono essere stimate le ascisse
chiameremo dist1 = distanza tra i punti zero e mhigh oppure tra zero e mlow
chiameremo dist2 = distanza tra i punti mhigh e high oppure tra mlow e low

1324222748fuzzysets.png
 
mi scuso se le figure dei fuzzy sets non sono venute molto bene, ma tanto per rendere l’ idea . . . :-o
dopo le risposte ad eventuali domande sulla prima parte, seguirà una noiosa serie di pezzi di codice che cercherò di spiegare sommariamente visto che il linguaggio è abbastanza semplice
intanto per mantenere l’ attenzione dei 3 lettori interessati, anticipo che l’ esperimento di stimare ben 7 parametri contemporaneamente non solo è riuscito ma il risultato del TS così costruito è molto buono . . . ;)
 
avverto che tra un po' devo uscire, proseguirò a pezzi nei prossimi giorni lavoro permettendo . . .
intanto cominciamo con le dichiarazioni aggiountive relative al GA:

Codice:
'
' ==============================
' VARIABILI X ALGORITMO GENETICO
' ==============================
'
Dim Ncromo        As Integer     ' num individui
Dim Nvar            As Integer     ' num variabili
Dim Nmeio          As Integer     ' num migliori
Dim LLvar1         As Integer     ' lunghezza singola variabile
Dim LLvar2         As Integer     ' lunghezza singola variabile
Dim LLvar3         As Integer     ' lunghezza singola variabile
Dim LLcromo       As Long        ' lunghezza singolo cromosoma
Dim Numero        As Variant     ' num iniziale x random
Dim Bestx()        As Double      ' tabella valori migliori individui
Dim Limeio()       As Variant     ' tabella cromosomi dei migliori individui
Dim Tabcromo()  As Variant
Dim Rnum           As Range
'
 
x procedere in maniera casuale si inserisce inizialmente un numero di max 8 cifre che servirà da “seme” per i successivi
Codice:
[/SIZE][/FONT]
[FONT=Calibri][SIZE=3]   '
    Set Rnum = Foglio1.Range("seme")
    '
    Numero = InputBox("digita nuovo seme max 8 cifre")
    Rnum = Numero
    '[/SIZE][/FONT]
[FONT=Calibri][SIZE=3]
mentre la routine per l’ estrazione dei numeri casuali secondo l’ algoritmo di Park e Miller è la seguente:
Codice:
[/FONT][/SIZE]
[SIZE=3][FONT=Calibri]Public Function Boule(k As Integer)
    Dim z         As Integer
    Dim a         As Long
    Dim m         As Long
    Dim Midv      As Long
    Dim Mids      As String
    Dim S         As String
    '
    a = 7 ^ 5: m = 2 ^ 31 - 1
    '
    Numero = a * Numero - m * Fix(a * Numero / m)
    S = Left(Numero, 8)
    Mids = Right(S, 4)
    'Mids = mid$(Numero, 4, 4)
    Midv = Val(Mids)
    Boule = Midv - k * Fix(Midv / k)
    '
End Function[/FONT][/SIZE]
[SIZE=3][FONT=Calibri]
 
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
 

Users who are viewing this thread

Back
Alto