|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 756
|
[VBA] permutazioni con ripetizioni ma con limite alle ripetizioni
Ho un array di N Elementi (es A, B, C, D) e voglio estrarre tutte le permutazioni possibili (CLASSE) es = 3.
AAA AAB AAC AAD ABB ABC ABD ACD.. .. DDD notare che ABA = AAB e scompare dall'elenco il codice qui sotto fa egregiamente il suo lavoro (trovato in rete. Public Function CombinazioniConRipetizione(ByVal arrayElementi As Variant, ByVal Classe As Byte) As Collection Dim LC As New Collection If UBound(arrayElementi) = 0 Then Set CombinazioniConRipetizione = LCEnd If If Classe = 0 Then Set CombinazioniConRipetizione = LCEnd If Dim aP() As Integer ReDim aP(Classe - 1) Dim i As Integer Dim j As Integer Dim C As String Dim cnt As Integer Do Application.StatusBar = "Sto creando la Combinazione " & LC.Count & "/" & MaxCombinazioni & "-->" & C DoEvents cnt = 0 For i = UBound(aP) To 0 Step -1Next iIf aP(i) = UBound(arrayElementi) Thencnt = cnt + 1Else Loop Set CombinazioniConRipetizione = LC End Function a questo punto vi chiedo: E' possibile limitare il numero di ripetizioni di ogni singolo elemento dell'array a N volte? ad esempio se pongo N = 2, le permutazioni (AAA e BBB e CCC e DDD) non vengono calcolate.... tenete presente che sto lavorando con classi > 10.. e il numero di combinazioni sale col fattoriale...
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One Ultima modifica di xp2400 : 28-10-2014 alle 08:23. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Per favore indenta il codice quando posti sul forum.
Puoi utilizzare questa funzione (non testata) per contare il numero di ripetizioni e scartare quindi le combinazioni che non ti interessano: Codice:
Public Function maxNumRipetizioni(arrayElementi As Variant, aP() As Integer) As Integer Dim i As Integer Dim p As Integer Dim c() As Integer Dim m As Integer ReDim c(UBound(arrayElementi)) For i = 0 To UBound(aP) p = aP(i) c(p) = c(p) + 1 If c(p) > m Then m = c(p) Next i maxNumRipetizioni = m End Function |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 756
|
Quote:
Però mi serve qualcosa che scarti la combinazione che supera max ripetizioni durante la generazione,non dopo. Questo perchè la collection in VBA non supera circa 330k item.. e io lo supero abbondantemente...
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Si avevo capito, basta che metti il codice che genera la combinazione all'interno di un if:
Codice:
If maxNumRipetizioni(arrayElementi, aP) < valore Then C = "" For i = 0 To UBound(aP) C = C & arrayElementi(aP(i)) Next i Application.StatusBar = "Sto creando la Combinazione " & LC.Count & "/" & MaxCombinazioni & "-->" & C End If Comunque nella tua routine non usi mai la collection e ci sono alcune istruzioni inutili, forse ci stai ancora lavorando? |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:34.