galerio
13-10-2017, 10:16
Sto cercando di creare uno script che calcoli il numero di combinazioni possibili in una matrice binaria (ad esempio 6x6 o anche più grande) che soddisfi (come unico dato noto) una determinata somma di ciascuna riga e di ciascuna colonna. (ogni riga e ogni colonna possono avere anche somme differenti)
Per esempio, una matrice binaria 3x3 in cui la somma di ciascuna riga e di ciascuna colonna è sempre 1 le risultanti matrici saranno:
|0|0|1|
|0|1|0|
|1|0|0|
poi
|0|0|1|
|1|0|0|
|0|1|0|
poi
|0|1|0|
|1|0|0|
|0|0|1|
poi
|0|1|0|
|0|0|1|
|1|0|0|
poi
|1|0|0|
|0|1|0|
|0|0|1|
e infine
|1|0|0|
|0|0|1|
|0|1|0|
Quindi in tutto sono 6
A me non interessa vedere le matrici riempite, ma solo contare quante combinazioni sono possibili.
In VisualBasic questo script lo fa, ma in maniera forse poco efficiente (va ad occuparmi al massimo il 20% della cpu).
Inoltre pensavo che mi mostrasse il numero progressivo della combinazione trovata man mano in tempo reale, e invece mostra tali numeri solo alla fine dell'esecuzione, quando ormai vedo già anche il numero finale..
Questo esempio è per calcolare una matrice di ordine 6 in cui la somma in ciascuna riga e in ciascuna colonna è sempre 3
Module Module1
Sub Main()
Dim ct As Integer
ct = 0
Dim a(35)
For a0 = 0 To 1
For a1 = 0 To 1
For a2 = 0 To 1
For a3 = 0 To 1
For a4 = 0 To 1
For a5 = 0 To 1
For a6 = 0 To 1
For a7 = 0 To 1
For a8 = 0 To 1
For a9 = 0 To 1
For a10 = 0 To 1
For a11 = 0 To 1
For a12 = 0 To 1
For a13 = 0 To 1
For a14 = 0 To 1
For a15 = 0 To 1
For a16 = 0 To 1
For a17 = 0 To 1
For a18 = 0 To 1
For a19 = 0 To 1
For a20 = 0 To 1
For a21 = 0 To 1
For a22 = 0 To 1
For a23 = 0 To 1
For a24 = 0 To 1
For a25 = 0 To 1
For a26 = 0 To 1
For a27 = 0 To 1
For a28 = 0 To 1
For a29 = 0 To 1
For a30 = 0 To 1
For a31 = 0 To 1
For a32 = 0 To 1
For a33 = 0 To 1
For a34 = 0 To 1
For a35 = 0 To 1
If (a0 + a1 + a2 + a3 + a4 + a5 = 3 And a6 + a7 + a8 + a9 + a10 + a11 = 3 And a12 + a13 + a14 + a15 + a16 + a17 = 3 And a18 + a19 + a20 + a21 + a22 + a23 = 3 And a24 + a25 + a26 + a27 + a28 + a29 = 3 And a30 + a31 + a32 + a33 + a34 + a35 = 3 And a0 + a6 + a12 + a18 + a24 + a30 = 3 And a1 + a7 + a13 + a19 + a25 + a31 = 3 And a2 + a8 + a14 + a20 + a26 + a32 = 3 And a3 + a9 + a15 + a21 + a27 + a33 = 3 And a4 + a10 + a16 + a22 + a28 + a34 = 3 And a5 + a11 + a17 + a23 + a29 + a35 = 3) Then
ct = ct + 1
Debug.Print(ct)
End If
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Debug.Print(ct)
End Sub
End Module
Come posso migliorare il codice, sfuttare appieno il processore e tutti i suoi core e visualizzare il numero di combinazioni trovate in tempo rale durante l'esecuzione?
Tenete conto che non so programmare :p
Grazie
Per esempio, una matrice binaria 3x3 in cui la somma di ciascuna riga e di ciascuna colonna è sempre 1 le risultanti matrici saranno:
|0|0|1|
|0|1|0|
|1|0|0|
poi
|0|0|1|
|1|0|0|
|0|1|0|
poi
|0|1|0|
|1|0|0|
|0|0|1|
poi
|0|1|0|
|0|0|1|
|1|0|0|
poi
|1|0|0|
|0|1|0|
|0|0|1|
e infine
|1|0|0|
|0|0|1|
|0|1|0|
Quindi in tutto sono 6
A me non interessa vedere le matrici riempite, ma solo contare quante combinazioni sono possibili.
In VisualBasic questo script lo fa, ma in maniera forse poco efficiente (va ad occuparmi al massimo il 20% della cpu).
Inoltre pensavo che mi mostrasse il numero progressivo della combinazione trovata man mano in tempo reale, e invece mostra tali numeri solo alla fine dell'esecuzione, quando ormai vedo già anche il numero finale..
Questo esempio è per calcolare una matrice di ordine 6 in cui la somma in ciascuna riga e in ciascuna colonna è sempre 3
Module Module1
Sub Main()
Dim ct As Integer
ct = 0
Dim a(35)
For a0 = 0 To 1
For a1 = 0 To 1
For a2 = 0 To 1
For a3 = 0 To 1
For a4 = 0 To 1
For a5 = 0 To 1
For a6 = 0 To 1
For a7 = 0 To 1
For a8 = 0 To 1
For a9 = 0 To 1
For a10 = 0 To 1
For a11 = 0 To 1
For a12 = 0 To 1
For a13 = 0 To 1
For a14 = 0 To 1
For a15 = 0 To 1
For a16 = 0 To 1
For a17 = 0 To 1
For a18 = 0 To 1
For a19 = 0 To 1
For a20 = 0 To 1
For a21 = 0 To 1
For a22 = 0 To 1
For a23 = 0 To 1
For a24 = 0 To 1
For a25 = 0 To 1
For a26 = 0 To 1
For a27 = 0 To 1
For a28 = 0 To 1
For a29 = 0 To 1
For a30 = 0 To 1
For a31 = 0 To 1
For a32 = 0 To 1
For a33 = 0 To 1
For a34 = 0 To 1
For a35 = 0 To 1
If (a0 + a1 + a2 + a3 + a4 + a5 = 3 And a6 + a7 + a8 + a9 + a10 + a11 = 3 And a12 + a13 + a14 + a15 + a16 + a17 = 3 And a18 + a19 + a20 + a21 + a22 + a23 = 3 And a24 + a25 + a26 + a27 + a28 + a29 = 3 And a30 + a31 + a32 + a33 + a34 + a35 = 3 And a0 + a6 + a12 + a18 + a24 + a30 = 3 And a1 + a7 + a13 + a19 + a25 + a31 = 3 And a2 + a8 + a14 + a20 + a26 + a32 = 3 And a3 + a9 + a15 + a21 + a27 + a33 = 3 And a4 + a10 + a16 + a22 + a28 + a34 = 3 And a5 + a11 + a17 + a23 + a29 + a35 = 3) Then
ct = ct + 1
Debug.Print(ct)
End If
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Debug.Print(ct)
End Sub
End Module
Come posso migliorare il codice, sfuttare appieno il processore e tutti i suoi core e visualizzare il numero di combinazioni trovate in tempo rale durante l'esecuzione?
Tenete conto che non so programmare :p
Grazie