L
LuigiB
Guest
Ciao a tutti , prendendo spunto da una richiesta di LottoTom sono qui a presentare una nuova funzione presente nello spazioscript
che sapientemente utilizzata permette di agire internamente sullo sviluppo dei sistemi integrali facendo saltare delle colonne e velocizzando cosi l'elaborazione di sistemi prima impossibili da elaborare.
La funzione è molto semplice non è lei che fa quello che ho detto nel titolo del post ma è lo script che propongo che per suo mezzo lo fa.
Questo script che fa uso della citata nuova funzione potrebbe sembrare complesso ma se si segue la spiegazione
si capisce senza problemi , per ora non diciamo ancora il nome di questa nuova funzione del linguaggio
La prima cosa necessaria è capire come Spaziometria internamente sviluppa i sistemi integrali.
Il nostro esempio si basa su un sistema di 90 numeri in decine le cui combinazioni integrali sono 5.720.645.481.903
ad esempio per cercare la decina piu ritardata su due ruote mentre prima era impossibile ora ci vogliono 51 minuti sul mio pc , ovviamente con combinazioni inferiori ci vuole ancora meno tempo.
Per capire lo script vediamo prima come spaziometria sviluppa internamente le combinazioni dei sistemi integrali.
La prima cosa che fa è crearsi una matrice con il numero di righe pari alla classe di sviluppo
ogni riga contiene i numeri che possono comparire in ciascuna delle posizioni
vediamo che in questo caso ogni riga contiene 81 numeri
dopo aver creato la matrice inizia lo sviluppo delle colonne ,
internamente Spaziometria ha un array che chiameremo Puntatore
Questo array ha il numero di elementi pari alla classe di sviluppo
dato che il nostro esempio è a classe 10 questo array Puntatore internamente
è definito Puntatore(10)
per ognuna delle 10 posizioni Puntatore memorizzza un numero che va da 1 a 81
cioè un valore compreso tra 1 e il numero massimo di numeri presenti in una riga.
gestendo l'incremento dei valori nell'array Puntatore Spaziometria sviluppa le colonne
al primo passaggio tutti gli elementi dell'array puntatore avranno valore 1
identificando grazie alla matrice la decina 1.2.3.4.5.6.7.8.9.10
poi l'ultimo lelemento di puntatore si incrementa di 1 e si è pronti per leggere la colonan successiva.
quando l'incremento di 1 produce un valore superiore ad 81 (cioè al numero di numeri per riga)
allora il puntatore individua l'elemento precedente a quello che ha superato il limite e lo incrementa
a sua volta di 1 portando poi tutti i valori successivi dell'array allo stesso valore individuato e il giro ricomincia
co la colonna successiva , al termine l'ultima colonna vedrà l'array puntatore avere i valori 81.81.81.81.81.81.81.81.81.81
identificando quindi la decina 81.82.83.84.85.86.87.88.89.90
quanto spiegato si puo capire meglio guardando la successiva immagine
la nuova funzione che ho anticipato si chiama ForzaIncrementoPuntatoreSvilSisInt
proprio perche consente di agire sull'array puntatore incrementando il valore di una determinata posizione
si capisce che incrementando arbitrariamente una delle posizioni del puntatore si ha l'effetto di far saltare
dei cicli e quindi un sacco di colonne.
Come possiamo sfruttare questo fatto a nostro favore per cercare la lunghetta piu ritardata ?
Lo dimostra lo script successivo.
Che cosa fa lo script ?
Sviluppa 90 numeri in decine e trova la lunghetta piu ritardata per ambo su 2 ruote , questi valori sono facilmente cambiabili.
come funziona ?
Lo script inizia a sviluppare le decine , ogni decina viene scomposta in ambi , per ognuno di questi ambi vine calcolato il ritardo.
Mano mano che lo script elabora le colonne avrà individuato un ritardo massimo sempre maggiore , ogni volta che uno degli ambi
ottenuti dalla scomposizione della decina corrente ha un ritardo inferiore a quello max gia trovato vuol dire che siamo in presenza
di una colonna (di una decina) che finche contierrà quella combinazione (l'ambo) non potrà mai avere un ritardo maggiore di quello che gia sappiamo
allora dobbiamo sfruttare questo fatto per fare in modo di far saltare tutte le decine che contengono l'ambo incriminato
Per farlo dobbiamo vedere come cade il nostro ambo dentro la matrice di sviluppo interna di spaziomeria , una volta che abbiamo visto in quale posizione cade l'ultimo numero dell'ambo sappiamo che con la funzione ForzaIncrementoPuntatoreSvilSisInt dobbiamo incrementare il valore dell'elemento trovato nell'array Puntatore , in questo modo salteremo delle colonne , per rendere ancora piu efficace la ricerca l'algoritmo cerca la combinaxione piu conveniente tra gli ambi per far saltare piu colonne possibili , infatti sono da preferire gl ambi che vedono il secondo numero comparire nella posizione piu bassa possibile da 1 a 10 della decina, il tutto per chi ha voglia si capisce con lo script ,
VALIDO PER SPAZIOMETRIA 1.5.46
SI POSSONO CAMBIARE CLASSE DI SVILUPPO , SORTE , RUOTE
PER QUESTIONI DI PERFORMANCE VENCONO REGISTRATE SOLO UNA COLONNA PER RITARDO.
SE SI VOGLIONO VEDEREL E COLONNE ALLO STESSO RITARDO BISOGNA CAMBIARE UNA LINEA NELLO SCRIPT
MA SARA PIU LENTO
che sapientemente utilizzata permette di agire internamente sullo sviluppo dei sistemi integrali facendo saltare delle colonne e velocizzando cosi l'elaborazione di sistemi prima impossibili da elaborare.
La funzione è molto semplice non è lei che fa quello che ho detto nel titolo del post ma è lo script che propongo che per suo mezzo lo fa.
Questo script che fa uso della citata nuova funzione potrebbe sembrare complesso ma se si segue la spiegazione
si capisce senza problemi , per ora non diciamo ancora il nome di questa nuova funzione del linguaggio
La prima cosa necessaria è capire come Spaziometria internamente sviluppa i sistemi integrali.
Il nostro esempio si basa su un sistema di 90 numeri in decine le cui combinazioni integrali sono 5.720.645.481.903
ad esempio per cercare la decina piu ritardata su due ruote mentre prima era impossibile ora ci vogliono 51 minuti sul mio pc , ovviamente con combinazioni inferiori ci vuole ancora meno tempo.
Per capire lo script vediamo prima come spaziometria sviluppa internamente le combinazioni dei sistemi integrali.
La prima cosa che fa è crearsi una matrice con il numero di righe pari alla classe di sviluppo
ogni riga contiene i numeri che possono comparire in ciascuna delle posizioni
vediamo che in questo caso ogni riga contiene 81 numeri
dopo aver creato la matrice inizia lo sviluppo delle colonne ,
internamente Spaziometria ha un array che chiameremo Puntatore
Questo array ha il numero di elementi pari alla classe di sviluppo
dato che il nostro esempio è a classe 10 questo array Puntatore internamente
è definito Puntatore(10)
per ognuna delle 10 posizioni Puntatore memorizzza un numero che va da 1 a 81
cioè un valore compreso tra 1 e il numero massimo di numeri presenti in una riga.
gestendo l'incremento dei valori nell'array Puntatore Spaziometria sviluppa le colonne
al primo passaggio tutti gli elementi dell'array puntatore avranno valore 1
identificando grazie alla matrice la decina 1.2.3.4.5.6.7.8.9.10
poi l'ultimo lelemento di puntatore si incrementa di 1 e si è pronti per leggere la colonan successiva.
quando l'incremento di 1 produce un valore superiore ad 81 (cioè al numero di numeri per riga)
allora il puntatore individua l'elemento precedente a quello che ha superato il limite e lo incrementa
a sua volta di 1 portando poi tutti i valori successivi dell'array allo stesso valore individuato e il giro ricomincia
co la colonna successiva , al termine l'ultima colonna vedrà l'array puntatore avere i valori 81.81.81.81.81.81.81.81.81.81
identificando quindi la decina 81.82.83.84.85.86.87.88.89.90
quanto spiegato si puo capire meglio guardando la successiva immagine
la nuova funzione che ho anticipato si chiama ForzaIncrementoPuntatoreSvilSisInt
proprio perche consente di agire sull'array puntatore incrementando il valore di una determinata posizione
si capisce che incrementando arbitrariamente una delle posizioni del puntatore si ha l'effetto di far saltare
dei cicli e quindi un sacco di colonne.
Come possiamo sfruttare questo fatto a nostro favore per cercare la lunghetta piu ritardata ?
Lo dimostra lo script successivo.
Che cosa fa lo script ?
Sviluppa 90 numeri in decine e trova la lunghetta piu ritardata per ambo su 2 ruote , questi valori sono facilmente cambiabili.
come funziona ?
Lo script inizia a sviluppare le decine , ogni decina viene scomposta in ambi , per ognuno di questi ambi vine calcolato il ritardo.
Mano mano che lo script elabora le colonne avrà individuato un ritardo massimo sempre maggiore , ogni volta che uno degli ambi
ottenuti dalla scomposizione della decina corrente ha un ritardo inferiore a quello max gia trovato vuol dire che siamo in presenza
di una colonna (di una decina) che finche contierrà quella combinazione (l'ambo) non potrà mai avere un ritardo maggiore di quello che gia sappiamo
allora dobbiamo sfruttare questo fatto per fare in modo di far saltare tutte le decine che contengono l'ambo incriminato
Per farlo dobbiamo vedere come cade il nostro ambo dentro la matrice di sviluppo interna di spaziomeria , una volta che abbiamo visto in quale posizione cade l'ultimo numero dell'ambo sappiamo che con la funzione ForzaIncrementoPuntatoreSvilSisInt dobbiamo incrementare il valore dell'elemento trovato nell'array Puntatore , in questo modo salteremo delle colonne , per rendere ancora piu efficace la ricerca l'algoritmo cerca la combinaxione piu conveniente tra gli ambi per far saltare piu colonne possibili , infatti sono da preferire gl ambi che vedono il secondo numero comparire nella posizione piu bassa possibile da 1 a 10 della decina, il tutto per chi ha voglia si capisce con lo script ,
Codice:
Option Explicit
Sub Main
Dim k,s
Dim nClasse,nColonneTot
ReDim aNumeri(90)
Dim aCol
Dim nRitmaxTrovato,nRitMax
Dim nSorte
Dim nPosDaIncr
Dim nFine
Dim nColValide
Dim nRitardoNat
Dim nTimerStart
nFine = EstrazioneFin
ReDim aR(2)
aR(1) = BA_
aR(2) = CA_
nSorte = 2
nClasse = 10 ' sviluppo in decine
' da qui in poi non cambiare niente
nTimerStart = Timer
nRitardoNat = 1 / Prob(nClasse,nSorte,UBound(aR))
nRitmaxTrovato = nRitardoNat
nRitmaxTrovato = CInt(InputBox("Inserire il ritardo minimo." & vbCrLf & "Il valore proposto è il ritardo naturale","Ritardo minimo",nRitmaxTrovato))
Call Scrivi("integrali : " & Combinazioni(90,nClasse))
' imposto i numeri da sviluppare
For k = 1 To 90
aNumeri(k) = k
Next
'inizializza lo sviluppo
nColonneTot = InitSviluppoIntegrale(aNumeri,nClasse)
nColValide = 0
k = 0
' ciclo che continua fiono a quando le colonne non finiscono
Do While GetCombSviluppo(aCol)
k = k + 1 ' conteggio colonna corrente
nRitMax = RitardoCombinazioneTurbo(aR,aCol,nSorte,nFine)
'If nRitMax >= nRitmaxTrovato Then
If nRitMax > nRitmaxTrovato Then
nColValide = nColValide + 1
nRitmaxTrovato = nRitMax
' costruisco la stringa che contiene la colonna
s = FormatSpace(k,10,True) & "- " & FormatSpace(StringaNumeri(aCol),nClasse * 3) & " Rit : " & FormatSpace(nRitMax,10,True)
Call Scrivi(s)
Else
' cerca le sottocolonne che contravvengono al RitMax
' e individua quella piu conveniente per far saltare piu combinazioni possibili
nPosDaIncr = GetPosDaIncr(aCol,nRitmaxTrovato,aR,nSorte,nFine)
Call ForzaIncrementoPuntatoreSvilSisInt(nPosDaIncr)
End If
If k Mod 100 = 0 Then
Call AvanzamentoElab(1,100,GetPercCombSviluppate)
'Call AvanzamentoElab(1,nColonneTot,GetCombSviluppate)
Call Messaggio("Colonna " & k & " valide " & nColValide)
If ScriptInterrotto Then Exit Do
End If
Loop
Call Scrivi("svil : " & k)
Call Scrivi("Tempo elab : " & FormattaSecondi(Timer - nTimerStart))
End Sub
Function GetPosDaIncr(aCol,nRitMax,aR,nClasse,nFine)
Dim k,Colonne,j,nRit
Dim nUltimoNumComb
Dim nRetIdPosDaIncr,nPosDaIncrPiuBassa
Dim nNumeriDaPrendere
ReDim aSubCol(nClasse)
' questa funzione riceve la combinazione sviluppata dall'algoritmo principale e la scompone
' sviluppando le colonne di classe uguale alla sorte cercata (valore passato in nClasse)
' calcola il ritardo delle colonne scomposte , appena trova colonne con ritardo piu basso
' di quello massimo conosciuto allora cerca la colonna migliore.
' al termine torna la posizione da incrementare nello sviluppo integrale per fare in modo di saltare colonne
' aCol -- > Combinazione da scomporre in classe nClasse
' nRitMax -- > Ritardo massimo trovato durante la routine
' aR -- > Ruote analizzate
' nClasse -- > Sorte per la quale si analizza aCol
' nFine -- > Estrazione dalla quale calcolare il ritardo
nNumeriDaPrendere = UBound(aCol) - 1 ' prendiamo i numeri della colonna escludendo l'ultimo numero
' l'ultimo numero va escluso perche le colonne che lo conterrebbero per
' via dell'algoritmo non sarebbero utili a far saltare colonne
nPosDaIncrPiuBassa = 100 ' si parte da un numero alto impossibile
' imposto i numeri da sviluppare creando un array per contenerli
' i numeri sono letti dalla combinazione sviluppata passata dall'algoritmo principale
ReDim aN(nNumeriDaPrendere)
For k = 1 To nNumeriDaPrendere
aN(k) = aCol(k)
Next
' sviluppo le colonne in memoria in pratica scompongo aCol
' in subcombinazioni della classe uguale alal sorte che analizzo (valore in nClasse)
Colonne = SviluppoIntegrale(aN,nClasse)
' ciclo sulle colone sviluppate per cercare la piu conveniente per saltare piu
' colonne possibili nell'algoritmo principale
For k = 1 To UBound(Colonne)
' alimento un array con i numeri per calcolare il ritardo dell subcolonna
For j = 1 To nClasse
aSubCol(j) = Colonne(k,j)
Next
' calcola ritardo
nRit = RitardoCombinazioneTurbo(aR,aSubCol,nClasse,nFine)
If nRit < nRitMax Then
'se il ritardo è minore del Ritardo Max conosciuto fino a quel momento allora
'cerco la colonna che abbia le qualità per far saltare piu colonne possibili
' devo individuare in che posizione si trova l'ultimo numero della subcolonna
' piu la posizione è bassa maggiore saranno le colonne saltate dall'algoritmo
For j = 1 To nNumeriDaPrendere 'UBound(aCol)-1
If aCol(j) = aSubCol(nClasse) Then
' ho individuato il numero contenuto nell'ultima posizione della sub colonna
' e so in che posizione si trova nella colonna aCol
If j < nPosDaIncrPiuBassa Then
' cerco la posizione piu bassa possibile
nPosDaIncrPiuBassa = j
End If
' esce dal ciclo perche il numero è stato trovato
Exit For
End If
Next
End If
Next
If nPosDaIncrPiuBassa <> 100 Then
' al termine se la variabile nPosDaIncrPiuBassa è diversa dal valore dato per default
' vuol dire che sappiamo quale posizione andare ad incrementare per far saltare delle colonne
GetPosDaIncr = nPosDaIncrPiuBassa
Else
' se nPosDaIncrPiuBassa rimane al suo valre di default torna 0 e non salta colonne
GetPosDaIncr = 0
End If
End Function
Function FormattaSecondi(s)
'Questa Function trasforma il numero di secondi passato come parametro in una stringa
' passando i secondi si ottengono ore minuti e secondi in formato hh:mm:ss
' s ---> Numero di secondi da formattare
' ritorna una stringa il cui formato è hh:mm:ss (la function non funziona se in totale abbiamo piu di 99 ore )
Dim hh
Dim Mm
Dim Ss
Dim TimeStr
hh = s \ 3600
Mm =(s Mod 3600) \ 60
Ss = s -((hh * 3600) +(Mm * 60))
TimeStr = Format2(hh) & ":" & Format2(Mm) & ":" & Format2(Ss)
FormattaSecondi = TimeStr
End Function
VALIDO PER SPAZIOMETRIA 1.5.46
SI POSSONO CAMBIARE CLASSE DI SVILUPPO , SORTE , RUOTE
PER QUESTIONI DI PERFORMANCE VENCONO REGISTRATE SOLO UNA COLONNA PER RITARDO.
SE SI VOGLIONO VEDEREL E COLONNE ALLO STESSO RITARDO BISOGNA CAMBIARE UNA LINEA NELLO SCRIPT
MA SARA PIU LENTO
Ultima modifica di un moderatore: