Stellar Blade Un'esclusiva PS5 che sta facendo discutere per l'eccessiva bellezza della protagonista. Vieni a parlarne su Award & Oscar!
 
Pagina precedente | 1 2 3 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

[RISOLTO] Velocizzare elaborazione VBA

Ultimo Aggiornamento: 13/04/2024 21:52
Post: 1.330
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Veteran
EXCEL 2016 - SPREAD32
ONLINE
07/04/2024 12:29

Ciao a tutti
la famosa discussione "Velocizzare Elaborazione VBA" del 20 marzo l'abbiamo considerata RISOLTA su richiesta di Marius, ma sappiamo bene che la ricerca non ha limiti, ed allora mi sono preso la briga di fare una verifica, di cui pubblico la foto.
Ho semplicemente conteggiato tutte le combinazioni dell' Enalotto, senza scriverle nè costruirle in RAM
Sembra che il metodo più veloce sia quello dei cicli FOR, seguito dal metodo ricorsivo, e infine da quello iterativo.
Il metodo FOR è molto veloce perchè si sa a priori quanti devono essere i cicli, e quindi non è modificabile al volo.
Gli altri 2 metodi invece possono scegliere al momento il SET di numeri da elaborare e il K (combinazioni).
Ricordo che le combinazioni si calcolano con la formula =combinazione(set;classe), cioè combinazione(90;6) per l'Enalotto, mentre
per il totocalcio le "combinazioni" che in realtà si chiamano Disposizioni con Ripetizione, sono uguali a 3 elevato il numero partite.
Poi mi è venuto in mente che ho un altro algoritmo, il quale però puo' agire solo con ragionamento "ternario" per elaborare le colonne del vecchio Totocalcio.
Ternario perchè essendo 3 i simboli del Totocalcio si puo' usare questo fatto per un algoritmo diverso da quello delle combinazioni.
Ora non vi annoio con altre spiegazioni, ma mi limito a invitare Marius44 ( in questo caso posso citarlo ) ad usare il file che allego, che sviluppa qualsiasi sistema Totocalcio, e ad aggiungere con la sua pazienza quel trucco del DEPOS, che io non ricordo bene, che è in grado poi di scrivere le combinazioni tutte in un sol colpo.
L'algoritmo puo' (e dovrebbe) rimanere intatto, bisogna solo portare successivamente le combinazioni in DEPOS (vedi Anthony47).
Marius ricorderà certo il DEPOS. ma tutti possono divertirsi con questo rompicapo domenicale.
La prova DEPOS l'ho fatta ma mi sono intrecciato poichè in questi giorni non ho calma e pazienza.


EDIT
in realtà mi sono accorto che la costruzione delle combinazioni non mette le stesse in RAM ma le scrive direttamente
il tempo trovato non fa fede, non è quello che impiegherebbe se si costruisse l'Array senza scriverlo
Quindi il buon Marius, se ha voglia, dovrebbe separatamente PRIMA costruire l'archivio e POI usare il DEPOS.
Se ce la faccio nel frattempo ci provo io, ma dovevo questa segnalazione
Scusate

A DIR LA VERTA' HO PROPOSTO UNA BOIATA CHE RICHIEDE TROPPO TEMPO. ABBANDONIAMO
[Modificato da L2018 07/04/2024 21:09]

LEO
https://t.me/LordBrum
Post: 1.245
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Veteran
Excel2019
OFFLINE
13/04/2024 19:41

Ciao Leo
come t'ho detto sono stato impegnato e non ho avuto tempo per "guardare" la tua macro
Te la rimando (ho evidenziato le variazioni apportate)
Option Explicit
Sub pan()
'Algoritmo alternativo per l'enumerazione di combinazioni, che nel caso del Totocalcio si chiamano Disposizioni con Ripetizione: 3^partite
Dim a As Long, b As Long, c As Long, i As Long, j As Long, k As Long, p As Long, q As Long, r As Long
Dim st(2) As String, se(2) As Long, t As Single
Dim oArr, depos As Range  '<<<<<<<<<<<< aggiunta
st(0) = "1": st(1) = "X": st(2) = "2"
se(0) = 1: se(1) = 2: se(2) = 3
Range("D:F").ClearContents
r = Range("A3") 'partite richieste
q = 3 ^ r       'colonne che saranno sviluppate
p = 0: While 3 ^ p < q: p = p + 1: Wend

'sviluppo ternario
'algoritmo universale semplice al posto di numerosi cicli FOR
Application.ScreenUpdating = False
'ReDim se(0 To q - 1, 0 To 2)'se inserisco questa linea e quello piu sotto si incasina il tutto
ReDim oArr(0 To q - 1, 0 To p - 1) '<<<<<<<< aggiunta
Set depos = Range("D1")  '<<<<<<<<<<<<<


Guarda le aggiunte/eliminazioni e prova. Fai sapere.
Ciao,
Mario
Post: 1.246
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Veteran
Excel2019
OFFLINE
13/04/2024 19:43

Ciao Leo
Non capisco perchè il codice fra i tagcode ha combinato un pasticcio.
Ti riallego la macro come testo

Option Explicit
Sub pan()
'Algoritmo alternativo per l'enumerazione di combinazioni, che nel caso del Totocalcio si chiamano Disposizioni con Ripetizione: 3^partite
Dim a As Long, b As Long, c As Long, i As Long, j As Long, k As Long, p As Long, q As Long, r As Long
Dim st(2) As String, se(2) As Long, t As Single
Dim oArr, depos As Range
st(0) = "1": st(1) = "X": st(2) = "2"
se(0) = 1: se(1) = 2: se(2) = 3
Range("D:F").ClearContents
r = Range("A3") 'partite richieste
q = 3 ^ r 'colonne che saranno sviluppate
p = 0: While 3 ^ p < q: p = p + 1: Wend

'sviluppo ternario
'algoritmo universale semplice al posto di numerosi cicli FOR
Application.ScreenUpdating = False
'ReDim se(0 To q - 1, 0 To 2)'se inserisco questa linea e quello piu sotto si incasina il tutto
ReDim oArr(0 To q - 1, 0 To p - 1) 'matrice
Set depos = Range("D1") 'posizione di scrittura
t = Timer
For i = 0 To q - 1: k = i
For j = p - 1 To 0 Step -1
'Cells(i + 1, j + 4) = st(k Mod 3)
'Cells(i + 1, j + 4) = se(k Mod 3)
'se(i, j) = st(k Mod 3)
oArr(i, j) = st(k Mod 3) 'assegna alla matrice
k = k \ 3
Next
Next
depos.Resize(27, 3) = oArr
Application.ScreenUpdating = True
Range("A1").Value = Timer - t
Range("A2").Value = q
Range("A3").Select

' sviluppo ternario in RAM
' qui mi sono intrecciato e non sono riuscito a mettere in RAM e a fare il giochino del DEPOS

'ReDim segno(1 To q, 0 To 2)
't = Timer
'For i = 0 To q - 1: k = i
' For j = 0 To p - 1
'segno(i + 1, j) = st(k Mod 3)
'k = k \ 3
'Next: Next
'Range("C1").Value = Timer - t
End Sub

Fai sapere. Ciao,
Mario
Post: 1.354
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Veteran
EXCEL 2016 - SPREAD32
ONLINE
13/04/2024 20:44

ciao Mario
anzitutto grazie per l'impegno profuso
non capisco l'incasinamento tag-code, ma non ricordo neppure se ti avevo mandato privatamente il file o la macro
Sta di fatto che il codice appena da te ricevuto, applicato al mio file NON funziona
ad un certo punto nel codice c'è scritto DEPOS.resize (27,3)
Bene, quello è certo un grosso errore
Al posto di 27 dovrebbe andarci il numero delle "colonne" toto, e al posto del 3 la lunghezza della "colonna" toto, in orizzontale
se 3 partite allora 3^3= 27 = depos(27,3)
se 5 partite allora 3^5= 243 = depos(243,5)
eccetera, ma questi valori dipendono proprio dal numero partite, e non so se depos accetta valori variabili
l'unica cosa che posso fare e rinviarti il mio file, solo perchè tu possa vedere il giusto funzionamento.
Il concetto di tale file è(ra) duplice
- costruire in RAM l'integrale delle colonne (3 elevato al numero partite) e misurarne il tempo
- incolonnare lo sviluppo integrale con depos, e misurarne il tempo
L'algoritmo che ho proposto è universale, quindi flessibile, volevo misurarne la velocità paragonata a quello dei files precedenti che avevamo realizzato.
E siccome c'è variabilità di segni e partite ho calcolato che 8 partite (52488 segni) sono circa equivalenti ai 3734 terni di tempo fa, ai fini del confronto velocità.
Ma ti prego comunque di lasciar perdere, anche perchè, ammesso che l'algo sia migliore
- per poche partite non serve
- per oltre 10 partite va fuori del foglio
- oltre certo numero di partite diventa comunque insostenibile a dispetto del depos
Quindi se per i giochi a estrazione si possono "avvicinare" (si fa per dire) le prestazioni di Excel a quelle del PowerBasic, nel caso del Toto non c'è match, io scrivo su disco 14 triple in 0,9 secondi (e sulla macchina vecchia).
Ripeto, lascia perdere, non ne vale la pena.
-----------
Colgo l'occasione per ribadire che l'abbinamento di cose che hai chiamato Leo_bis e Leo_ter con la storia dei numeri caldi recenti si conferma vincente, ovviamente anche per il tuo gioco.
Io sono sempre qui.
[Modificato da L2018 13/04/2024 20:59]

LEO
https://t.me/LordBrum
Post: 1.355
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Veteran
EXCEL 2016 - SPREAD32
ONLINE
13/04/2024 21:27

Mario, ho fatto un discorso inutile
ho solo corretto la tua svista (verosimilmente tale) che mi era balzata all'occhio
e
FUNZIONA !!

asp qualche minuto, ecco intanto la macro, è stato sufficiente cambiare DEPOS(27,3) in DEPOS (q,p)
Be' direi che se la cava egregiamente

Macro
Option Explicit
Sub Mario()
'Algoritmo alternativo per l'enumerazione di combinazioni, che nel caso del Totocalcio si chiamano Disposizioni con Ripetizione: 3^partite
Dim a As Long, b As Long, c As Long, i As Long, j As Long, k As Long, p As Long, q As Long, r As Long
Dim st(2) As String, se(2) As Long, t As Single
Dim oArr, depos As Range, col As Long, segni As Long
Range("D:P").ClearContents
st(0) = "1": st(1) = "X": st(2) = "2"
se(0) = 1: se(1) = 2: se(2) = 3
Range("D:F").ClearContents
r = Range("A3") 'partite richieste
q = 3 ^ r 'colonne che saranno sviluppate
p = 0: While 3 ^ p < q: p = p + 1: Wend

'sviluppo ternario
'algoritmo universale semplice al posto di numerosi cicli FOR
Application.ScreenUpdating = False
'ReDim se(0 To q - 1, 0 To 2)'se inserisco questa linea e quello piu sotto si incasina il tutto
ReDim oArr(0 To q - 1, 0 To p - 1) 'matrice
Set depos = Range("D1") 'posizione di scrittura
t = Timer
For i = 0 To q - 1: k = i
For j = p - 1 To 0 Step -1
oArr(i, j) = st(k Mod 3) 'assegna alla matrice
k = k \ 3
Next
Next
depos.Resize(q, p) = oArr
Application.ScreenUpdating = True
Range("A1").Value = Timer - t
Range("A2").Value = q
Range("A3").Select
End Sub

11 partite in 1,625 secondi, più che buono per essere Excel
in effetti sembra che il DEPOS velocizzi la scrittura di 9 o 10 volte, interessante
Caspita, ma il ringraziamento c'era comunque
Ti rimando il mio file che contiene sia il NON depos (CTRL+M) che il tuo depos (CTRL+N)
AD MAIORA !!
[Modificato da L2018 14/04/2024 11:05]

LEO
https://t.me/LordBrum
13/04/2024 21:29

Ottima lezione di matematica e statistica.

Mi ricordano tempi passati sui libri.

A proposito come si può applicare tutto ciò ad un semplice file di excel?

Grazie



Post: 1.356
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Veteran
EXCEL 2016 - SPREAD32
ONLINE
13/04/2024 21:40

Re:
rex88 (nTdQ231201), 13/04/2024 21:29:

Ottima lezione di matematica e statistica.

Mi ricordano tempi passati sui libri.
A proposito come si può applicare tutto ciò ad un semplice file di excel?
Grazie



se non è ironia, che significa applicare tutto ciò.....
non ho capito

LEO
https://t.me/LordBrum
13/04/2024 21:42

Ho sbagliato a scrivere l'italiano?
Post: 1.357
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Veteran
EXCEL 2016 - SPREAD32
ONLINE
13/04/2024 21:45

Re:
rex88 (nTdQ231201), 13/04/2024 21:42:

Ho sbagliato a scrivere l'italiano?



sempre se non è ironia, le parole sono affilate, è il concetto che non ho capito

LEO
https://t.me/LordBrum
13/04/2024 21:47

Non è ironia.

Mi sspiega Lei cosa c'è da capire in questa frase:

A proposito come si può applicare tutto ciò ad un semplice file di excel?
Post: 1.358
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Veteran
EXCEL 2016 - SPREAD32
ONLINE
13/04/2024 21:49

Re:
rex88 (nTdQ231201), 13/04/2024 21:47:

Non è ironia.

Mi sspiega Lei cosa c'è da capire in questa frase:

A proposito come si può applicare tutto ciò ad un semplice file di excel?



è LEI che me lo dovrebbe spiegare, dato che io sono un po' tardino

LEO
https://t.me/LordBrum
13/04/2024 21:52

Ha ragione.

Si è fatto tardi e domani ho impegni molto importanti.

Buonanotte.

Per me si chiude qui.
Vota: 15MediaObject4,17672 5
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 2 3 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 13:26. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com