Calcolo Combinatorio II - Il caso di K=2 Stampa
Scritto da Roberto Mensa   
Mercoledì 08 Dicembre 2010 18:45
a cura di Roberto Mensa e Paolo Ardizzoni

In altro articolo, Calcolo combinatorio - Sviluppo, ho già affrontato il problema del calcolo combinatorio con n oggetti e k classi; in tale contesto venivano utilizzati al massimo 9 oggetti (in particolare i numeri da 1 a 9).
Ora focalizzo l'attenzione 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.

 Sommario

1 - Disposizioni con ripetizioni di classe 2
2 - Disposizioni semplici di classe 2
3 - Combinazioni di classe 2

N.B.
In tutti gli esempi, vedi file allegato, 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 coppie 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 colonna 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.

 


Nota: questo articolo è una copia autorizzata dall'autore Roberto Mensa. L'originale (eventualmente più aggiornato) si trova all'indirizzo: https://sites.google.com/site/e90e50/user/calcolo-combinatorio-excel-classe-2


Sistema operativo: Windows
Applicazioni: Excel 97/2003, Excel 2007/2010

 

 

 

 

Ultimo aggiornamento Mercoledì 22 Dicembre 2010 17:26