Otimização e Combinação

6 respostas
U

Estou tentando fazer uma simulação de todas as combinações possíveis da mega-sena, porém ainda está precário de optimização.

O algoritmo está correto, se alguém tiver alguma ideia para optimização do mesmo eu ficarei grato.

public void calculate(){

		int a = 0, b = 0, c = 0, d = 0,e = 0,f = 0;
		long[][] array = new long[5000000][6];
		int index = 1; // current index of array.

		int nRepeat = 0;

		long time = System.currentTimeMillis();	


		for(a = 1; a <= 60; a++){ 
			if(a == b || a == c || a == d || a == e || a == f) continue;		

			for(b = 1; b <= 60; b++){
				if(b == a || b == c || b == d || b == e || b == f) continue;			

				for(c = 1; c <= 60; c++){
					if(c == a || c == b || c == d || c == e || c == f) continue;				

					for(d = 1; d <= 60; d++){
						if(d == a || d == b || d == c || d == e || d == f) continue;					

						for(e = 1; e <= 60; e++){
							if(e == a || e == b || e == c || e == d || e == f) continue;						

							for(f = 1; f <= 60; f++){
								if(f == a || f == b || f == c || f == d || f == e) continue;

								boolean A_ = false, B_ = false, C_ = false, D_ = false, E_ = false, F_ = false;

								// Start on 1, because cont 0 is correct.
								for(int i = 0; i < array.length; i++){	
									A_ = false; B_ = false; C_ = false; D_= false; E_ = false; F_ = false;	

									if(count == 0){
										array[0][0] = a; array[0][1] = b; array[0][2] = c; array[0][3] = d; array[0][4] = e; array[0][5] = f;
										break;
									}

									if(array[i][0] == 0) break;

									/* This method is to check if this combination is equal with some other. */

					                                //check A.  
                                 					for(int j = 0; j < 6; j++){  
                                   						if(a == array[i][j]) A_ = true;                                   										}  
                                					//check B.  
                                 					for(int j = 0; j < 6; j++){  
                                    						if(b == array[i][j]) B_ = true;  
                                 					}  
                                 					//check C.  
                                					for(int j = 0; j < 6; j++){  
                                    						if(c == array[i][j]) C_ = true;  
                                					}  
                                 					//check D.  
                                 					for(int j = 0; j < 6; j++){  
                                     						if(d == array[i][j]) D_ = true;  
                                 					}  
                                 					//check E.  
                                 					for(int j = 0; j < 6; j++){  
                                     						if(e == array[i][j]) E_ = true;  
                                 					}  
                                 					//check F.  
                                 					for(int j = 0; j < 6; j++){  
                                     						if(f == array[i][j]) F_ = true;  
                                 					}  

									if(A_ == true && B_ == true && C_ == true && D_ == true && E_ == true && F_ == true) break;

								} // end for.

								long finalTime = System.currentTimeMillis();
								++totalN;

								/* IF this method to be equals jump to next loop. */ 						
								if(A_ == true && B_ == true && C_ == true && D_ == true && E_ == true && F_ == true) {
									System.out.printf("\t"+a+"|"+b+"|"+c+"|"+d+"|"+e+"|"+f+" |\t Current Count: "+count+" |\t Repeat Numbers :"+nRepeat+" |\t Current Time: %.2f (minutes) |\t Total Number: "+totalN+" |\t ## This combination is repeated! ## \n", (finalTime - time) / 1000f / 60f );
									nRepeat++;
									continue;
								} 
								if(count != 0){
									array[index][0] = a; array[index][1] = b; array[index][2] = c; array[index][3] = d; array[index][4] = e; array[index++][5] = f; 			


								}

								finalTime = System.currentTimeMillis();
								++count;


								System.out.printf("\t"+a+"|"+b+"|"+c+"|"+d+"|"+e+"|"+f+" |\t Current Count: "+count+" |\t Repeat Numbers :"+nRepeat+" |\t Current Time: %.2f (minutes) |\t Total Number: "+totalN+" |\t ## This combination is available! ## \n", (finalTime - time) / 1000f / 60f );


							} // f.

						} // e.

					} // d.

				} // c.

			} // b.		

		}//a.

	}

6 Respostas

ViniGodoy

Veja a lógica. Você faz assim:
01 02 03 04 05 06
01 02 03 04 05 07
01 02 03 04 05 08

01 02 03 04 05 60

01 02 03 04 06 07
01 02 03 04 06 08
01 02 03 04 06 09
01 02 03 04 06 10

01 02 03 04 06 60

Basta seguir a progressão. Vão ser 6 for, nenhum if.

U

Mas irá repetir as dezenas não?
Ex: 1 1 2 3 4 5

O meu objeto é fazer a simulação real.

Não quero que entra na contagem também:
Ex: 1 2 3 4 5 6
e 1 2 3 4 6 5.

Att, Utroz…

ViniGodoy

Não vai repetir. Observe que em momento nenhum falei que seu for deve sempre começar em 1.

O primeiro for, do i, vai começar em 1.

O segundo, do j, vai começar em i+1.

O terceiro, do k, em j+1…

E assim por diante.

Lembre-se também que a ordem dos números não importa.

nel

ViniGodoy:
Não vai repetir. Observe que em momento nenhum falei que seu for deve sempre começar em 1.

O primeiro for, do i, vai começar em 1.

O segundo, do j, vai começar em i+1.

O terceiro, do k, em j+1…

E assim por diante.

Lembre-se também que a ordem dos números não importa.

Viny, uma curiosidade. Passou um pensamento rápido aqui, usando o Random e uns if´s, não seria mais rápido que os 6 for´s (quando entrei para a universidade, uns 4 anos atrás, usei esse lógico de “laços encadeados”) ? É mais curiosidade mesmo.

Edit: havia posto Math, mas queria dizer Random.

Abraços.

ViniGodoy

Não, pq o random gerará números repetidos. O processo que comentei gera apenas todas as combinações possíveis, sem repetições.

Ainda assim é um conjunto gigante. Afinal são
60!

54!x6!

Combinações.

nel

ViniGodoy:
Não, pq o random gerará números repetidos. O processo que comentei gera apenas todas as combinações possíveis, sem repetições.

Ainda assim é um conjunto gigante. Afinal são
60!

54!x6!

Combinações.

É, justamento por não aceitar números repetidos que desconfiava que não seria uma melhor otimização.
E é por ser essa quantidade pequena de combinações, que não posto na mega sena rsrs.

Bom, brincadeiras a parte, obrigado.
Abraços.

Criado 21 de junho de 2011
Ultima resposta 22 de jun. de 2011
Respostas 6
Participantes 3