User‎ > ‎

Calcolo Combinatorio con Excel - Il caso di Classe 2

Ho, già (in un altro articolo) affrontato il problema del calcolo combinatorio con n oggetti e k classi. Nel lavoro precedente vengono utilizzati al massimo 9 oggetti (in particolare i numeri da 1 a 9). In questo articolo mi focalizzerò sulle disposizioni e combinazioni di classe 2 ovvero formate da 2 elementi.
Il caso particolare del calcolo per k=2 permette lo sviluppo con un qualsiasi numero di oggetti (il solo limite è il numero delle righe disponibili nel foglio di calcolo). Consente inoltre di adoperare logiche che definisco *meccaniche* in quanto non necessitano del calcolo matriciale, anche se, per gli amanti del genere, non mancheranno curiose soluzioni di questo tipo.  

N.B.
In tutti gli esempi viene utilizzato un range definito come A2:A16 che contiene 15 oggetti. Tale range è stato definito in modo statico solo per velocizzare l'aggiornamento delle formule.
Tutte le formule funzioneranno anche utilizzando un intervallo dinamico (che permetterebbe l'accodamento di nuovi oggetti).
In fondo alla pagina sono disponibili tutti i file di esempio.


Disposizioni con ripetizioni di classe 2

Dati i 3 oggetti A,B e C le disposizioni con ripetizioni di classe 2 sono:
AA,AB,AC,BA,BB,BC,CA,CB,CC.
Il caso delle disposizioni con ripetizioni è il più semplice.
Le formule nella versione italiana e inglese:
=INDICE(rng;INT((RIF.RIGA(A1)-1)/RIGHE(rng))+1)&";"&INDICE(rng;RESTO(RIF.RIGA(A1)-1;RIGHE(rng))+1)

versione inglese:

=INDEX(rng,INT((ROW(A1)-1)/ROWS(rng))+1)&";"&INDEX(rng,MOD(ROW(A1)-1,ROWS(rng))+1)
La formula non richiede molte spiegazioni ed ovviamente potrebbe essere utilizzata all'occorrenza distintamente su due colonne utilizzando le due formule:
 
=INDICE(rng;INT((RIF.RIGA(A1)-1)/RIGHE(rng))+1)

=INDICE(rng;RESTO(RIF.RIGA(A1)-1;RIGHE(rng))+1)

versione inglese:

=INDEX(rng,INT((ROW(A1)-1)/ROWS(rng))+1)

=INDEX(rng,MOD(ROW(A1)-1,ROWS(rng))+1)
Curiosa nella sua semplicità è la soluzione matriciale:
=rng&";"&MATR.TRASPOSTA(rng)

versione inglese:

=rng&";"&TRANSPOSE(rng)
E' una formula che restituisce una matrice di risultati e richiede una conferma con Ctrl+Maiusc+Invio dopo aver selezionato un'area quadrata sufficientemente ampia da poter contenere tutti i risultati.

Disposizioni semplici di classe 2

Dati i 3 oggetti A,B e C le disposizioni semplici di classe 2 sono:
AB,AC,BA,BC,CA,CB.
Le formule somigliano molto alle precedenti bisogna però escludere le copie in cui gli oggetti sono uguali:
=INDICE(rng;INT((RIF.RIGA(A1)-1)/(RIGHE(rng)-1))+1)&";"&INDICE(rng;RESTO(RIF.RIGA(A1)-1;RIGHE(rng)-1)+2-(RESTO(RIF.RIGA(A1)-1;RIGHE(rng)-1)<INT((RIF.RIGA(A1)-1)/(RIGHE(rng)-1))))

versione inglese:

=INDEX(rng,INT((ROW(A1)-1)/(ROWS(rng)-1))+1)&";"&INDEX(rng,MOD(ROW(A1)-1,ROWS(rng)-1)+2-(MOD(ROW(A1)-1,ROWS(rng)-1)<INT((ROW(A1)-1)/(ROWS(rng)-1))))
E' una formula meccanica che deve essere trascinata in basso e non consuma righe in eccesso.
 
La funzione matriciale si può invece adattare così:
=SE(rng<>MATR.TRASPOSTA(rng);rng&MATR.TRASPOSTA(rng);NON.DISP())

versione inglese:

=IF(rng<>TRANSPOSE(rng),rng&TRANSPOSE(rng),NA())
Come la precedente è una formula che restituisce una matrice di risultati e richiede una conferma con Ctrl+Maiusc+Invio dopo aver selezionato un'area quadrata sufficientemente ampia da poter contenere tutti i risultati.

Combinazioni di classe 2

Dati i 3 oggetti A,B e C le combinazioni di classe 2 sono:
AB,AC,BC.
In questo caso propongo una soluzione con colonna di appoggio (in colonna C):
=SE(RESTO(RIF.RIGA(A1)-1;RIGHE(rng)-1)<INT((RIF.RIGA(A1)-1)/(RIGHE(rng)-1));"";10^4*(INT((RIF.RIGA(A1)-1)/(RIGHE(rng)-1))+1)+(RESTO(RIF.RIGA(A1)-1;RIGHE(rng)-1)+2))

versione inglese:

=IF(MOD(ROW(A1)-1,ROWS(rng)-1)<INT((ROW(A1)-1)/(ROWS(rng)-1)),"",10^4*(INT((ROW(A1)-1)/(ROWS(rng)-1))+1)+(MOD(ROW(A1)-1,ROWS(rng)-1)+2))
in colonna D le combinazioni utilizzando questa:

=INDICE(rng;INT(PICCOLO($C:$C;RIF.RIGA(A1)))/10^4)&";"&INDICE(rng;--DESTRA(PICCOLO($C:$C;RIF.RIGA(A1));4))

versione inglese:

=INDEX(rng,INT(SMALL($C:$C,ROW(A1)))/10^4)&";"&INDEX(rng,--RIGHT(SMALL($C:$C,ROW(A1)),4))

E questa variante più *particolare* valida fino a 60 oggetti (in colonna E):

=SE(RESTO(RIF.RIGA(A1)-1;RIGHE(rng)-1)<INT((RIF.RIGA(A1)-1)/(RIGHE(rng)-1));"";ORARIO(0;INT((RIF.RIGA(A1)-1)/(RIGHE(rng)-1))+1;(RESTO(RIF.RIGA(A1)-1;RIGHE(rng)-1)+2)))

versione inglese:

=IF(MOD(ROW(A1)-1,ROWS(rng)-1)<INT((ROW(A1)-1)/(ROWS(rng)-1)),"",TIME(0,INT((ROW(A1)-1)/(ROWS(rng)-1))+1,(MOD(ROW(A1)-1,ROWS(rng)-1)+2)))

in colonna F le combinazioni utilizzando questa:
=INDICE(rng;MINUTO(PICCOLO($E:$E;RIF.RIGA(A1))))&";"&INDICE(rng;SECONDO(PICCOLO($E:$E;RIF.RIGA(A1))))
 
versione inglese:

=INDEX(rng,MINUTE(SMALL($E:$E,ROW(A1))))&";"&INDEX(rng,SECOND(SMALL($E:$E,ROW(A1))))

In entrambi i casi la colnna di appoggio serve solo perchè i risultati non sarebbero ordinati.
 
L'adattamento alla matriciale quadrata è molto semplice:
=SE(rng>MATR.TRASPOSTA(rng);MATR.TRASPOSTA(rng)&";"&rng;NON.DISP())

versione inglese:

=IF(rng>TRANSPOSE(rng),TRANSPOSE(rng)&";"&rng,NA())

E' ancora una formula che restituisce una matrice di risultati e richiede una conferma con Ctrl+Maiusc+Invio dopo aver selezionato un'area quadrata sufficientemente ampia da poter contenere tutti i risultati.

Infine una soluzione senza appoggio:
=INDICE(rng&";"&MATR.TRASPOSTA(rng);PICCOLO(SE(RIF.RIGA(rng)<MATR.TRASPOSTA(RIF.RIGA(rng));RIF.RIGA(rng)-1);RIF.RIGA(A1));--DESTRA(PICCOLO(SE(RIF.RIGA(rng)<MATR.TRASPOSTA(RIF.RIGA(rng));--((RIF.RIGA(rng)-1)&TESTO(MATR.TRASPOSTA(RIF.RIGA(rng)-1);"0000")));RIF.RIGA(A1));4))

versione inglese:

=INDEX(rng&";"&TRANSPOSE(rng),SMALL(IF(ROW(rng)<TRANSPOSE(ROW(rng)),ROW(rng)-1),ROW(A1)),--RIGHT(SMALL(IF(ROW(rng)<TRANSPOSE(ROW(rng)),--((ROW(rng)-1)&TEXT(TRANSPOSE(ROW(rng)-1),"0000"))),ROW(A1)),4))
da confermare con Ctrl+Maiusc+Invio e trascinare in basso.
 

Ĉ
roberto mensa,
Dec 6, 2010, 7:08 AM
Ĉ
roberto mensa,
Dec 6, 2010, 7:07 AM
Ĉ
roberto mensa,
Dec 6, 2010, 7:07 AM