Joelsonc3 Posted January 13 Share Posted January 13 Olá pessoal tudo bem, eu gostaria de uma orientação, qual é a melhor forma para aplicar uma buscar para garantir um processamento eficiente para um fechamento sabendo das quantidades, se é a "SOMA" e como fazer ou outra forma. Vou desenvolver em java. no nosso exemplo eu usei 5 numeros combinados de 3 em 3 que é igual 10 volantes está abaixo a lista. Aplicando uma redução para se ter uma garantia 2 acertos 100%, temos 4 volantes. Se alguém pode mostra como fazer, seja como codigo ou excel agaradeço. Assim que terminar codigo posto aqui. lista 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 resultado 1 2 3 1 4 5 2 3 4 2 3 5 Quote Link to comment Share on other sites More sharing options...
Ralf Jones Posted January 13 Share Posted January 13 @Joelsonc3 Texto do @rockcavera 1) Gerar todas as combinações de V,K e vamos por em uma lista 2) Selecione aleatoriamente uma combinação de V,K, adicione-a a sua lista Matriz e delete ela da lista do passo 1) 3) Gerar todas as combinações de V,M, coloque em uma lista e delete aquelas que fazem T ou mais pontos com a combinação selecionada no passo 2) 4) Agora você sabe a quantidade de combinações que uma única combinação de V,K consegue eliminar de V,M. Esse número vamos chamar de "Comb_VK_reduz_VM" e você obtém ele assim: Combinações de V,M - Tamanho da Lista de V,M Após a Exclusão) [1]. Temos por enquanto 3 listas: combinações de V,K; combinações de V,M; e Matriz. Cada uma com respectivamente N itens: C(V,K) - 1; C(V,M) - Comb_VK_reduz_VM; e 1 [2]. 5) Vamos obter o mínimo teórico, mas que nem sempre é alcançável. Fórmula: Ceil(C(V,M) / Comb_VK_reduz_VM) [3]. 6) Agora, enquanto a lista de V,M possuir combinações (itens), você vai fazer: 6.1) Cruzar a lista de V,K contra a lista de V,M. Ou seja, pegar uma por uma das combinação da lista de V,K e contar quantas combinações de V,M fazem T ou mais pontos com cada uma. 6.2) Depois de passar a lista toda de V,K, você vai pegar aquela combinação de V,K que mais fez T ou mais pontos com a atual lista de V,M, adicionar ela na lista Matriz, deletar da lista V,K e deletar as combinações de V,M que fazem T ou mais pontos com ela [4]. 6.3) Volte para 6) 7) Se a lista V,M não possui mais combinações, ou seja, não tem mais itens, a sua lista Matriz possui uma matriz de V,K,T,M 100% coberta. Notas: [1] É possível obter esse número de outra forma, usando calculo matemático, mas não vou ensinar aqui, sendo que é possível se obter ele no meio do caminho do algoritmo por uma simples subtração. [2] A notação "C(n, k)" é para aplicar a formula da combinação de n,k. [3] Ceil(n) é usado para especificar que um número deve ser arredondado para cima caso não seja um inteiro. Ou seja, 1,1 vai ser arredondado para 2. 1,9 vai ser arredondado para 2. [4] Caso mais de uma combinação de V,K fizer os mesmos T ou mais pontos com a atual lista de V,M, você pode escolher aleatoriamente qualquer uma. Como pode ver, o fato de o mesmo algoritmo criar matrizes com B de tamanhos distintos está relacionado ao fato da escolha aleatória nos passos 2) e passo 6.2) quando cai no caso da nota [4]. Também, você pode observar que algumas coisas foram postas para você aprender a como calcular o mínimo teórico, que as vezes pode ser a menor matriz possível. A menor matriz possível vai ser sempre maior ou igual ao mínimo teórico. Outra coisa que posso passar aqui é o cálculo do mínimo teórico de matrizes V,K,T, onde T=M. Aqui é a fórmula de Schonheim. A fórmula de Schonheim é diferente do mínimo teórico apresentado no meu algoritmo. A fórmula de Schonheim pode ser maior ou igual ao mínimo teórico. Ainda existem dois outros algoritmos que conheço para redução, que são: recozimento simulado e o PDO (Problem Dependent Optimization). Aqui neste tópico você vai encontrar maiores informações. 1 Quote Link to comment Share on other sites More sharing options...
-W6- Posted January 14 Share Posted January 14 O @Substantivo escreveu um artigo muito interessante sobre redução: aqui está o link: Quote Link to comment Share on other sites More sharing options...
-W6- Posted January 14 Share Posted January 14 informação útil sobre MINIMO TEÓRICO por @Guy Novaes video 01 video 2 Quote Link to comment Share on other sites More sharing options...
Joelsonc3 Posted January 16 Author Share Posted January 16 Em 13/01/2024 em 23:32, -W6- disse: O @Substantivo escreveu um artigo muito interessante sobre redução: aqui está o link: Obrigado pelo exemplo, eu já tenho isso, no caso que você apresenta, se acerta 4 números, você só tem cartões com 3 acertos, se acerta as 5 sorteadas, você tem quadra no exemplo apresentado. neste exemplo sempre vai haver a dependência de uma dezena. iguais >= 4, eu pergunto resolver se for igual == 4, ou seja se eu acerta apenas 4 quero encontra, por isso eu perguntei se existe alguma forma utilizando soma ou questão logica. exemplo simples de código abaixo faz isso: package Quina; import java.util.Scanner; public class Quina { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int[][] array = new int[999][5]; // matriz declaration int[] vetorA = new int[5]; // vetor declaration int qtde = 0, cont = 0, volantes = 0, reduzidos = 0; int n1, n2, n3, n4, n5; int Tamanho = 5; int iguais = 0; System.out.println("Qtde de dezenas a combinar:"); qtde = scan.nextInt(); for (n1 = 1; n1 <= qtde - 4; n1++) { vetorA[0] = n1; for (n2 = n1 + 1; n2 <= qtde - 3; n2++) { vetorA[1] = n2; for (n3 = n2 + 1; n3 <= qtde - 2; n3++) { vetorA[2] = n3; for (n4 = n3 + 1; n4 <= qtde - 1; n4++) { vetorA[3] = n4; for (n5 = n4 + 1; n5 <= qtde; n5++) { vetorA[4] = n5; volantes++; // count generated combinations for (int k = 0; k <= cont; k++) { iguais = 0; for (int i = 0; i < Tamanho; i++) { for (int j = 0; j < Tamanho; j++) { if (vetorA[i] == array[k][j]) { iguais++; } } } if (iguais >= 4) { break; } } // if iguais is less than 4, store it in the matrix if (iguais < 4) { cont++; for (int x = 0; x < Tamanho; x++) { array[cont][x] = vetorA[x]; } System.out.println("cartoes " + cont + ": " + vetorA[0] + " " + vetorA[1] + " " + vetorA[2] + " " + vetorA[3] + " " + vetorA[4]); reduzidos++; } } } } } } System.out.println("total reduzidos:" + reduzidos); System.out.println("Total volantes:" + volantes); } } 1 Quote Link to comment Share on other sites More sharing options...
Joelsonc3 Posted January 16 Author Share Posted January 16 Em 13/01/2024 em 17:09, Ralf Jones disse: @Joelsonc3 Texto do @rockcavera 1) Gerar todas as combinações de V,K e vamos por em uma lista 2) Selecione aleatoriamente uma combinação de V,K, adicione-a a sua lista Matriz e delete ela da lista do passo 1) 3) Gerar todas as combinações de V,M, coloque em uma lista e delete aquelas que fazem T ou mais pontos com a combinação selecionada no passo 2) 4) Agora você sabe a quantidade de combinações que uma única combinação de V,K consegue eliminar de V,M. Esse número vamos chamar de "Comb_VK_reduz_VM" e você obtém ele assim: Combinações de V,M - Tamanho da Lista de V,M Após a Exclusão) [1]. Temos por enquanto 3 listas: combinações de V,K; combinações de V,M; e Matriz. Cada uma com respectivamente N itens: C(V,K) - 1; C(V,M) - Comb_VK_reduz_VM; e 1 [2]. 5) Vamos obter o mínimo teórico, mas que nem sempre é alcançável. Fórmula: Ceil(C(V,M) / Comb_VK_reduz_VM) [3]. 6) Agora, enquanto a lista de V,M possuir combinações (itens), você vai fazer: 6.1) Cruzar a lista de V,K contra a lista de V,M. Ou seja, pegar uma por uma das combinação da lista de V,K e contar quantas combinações de V,M fazem T ou mais pontos com cada uma. 6.2) Depois de passar a lista toda de V,K, você vai pegar aquela combinação de V,K que mais fez T ou mais pontos com a atual lista de V,M, adicionar ela na lista Matriz, deletar da lista V,K e deletar as combinações de V,M que fazem T ou mais pontos com ela [4]. 6.3) Volte para 6) 7) Se a lista V,M não possui mais combinações, ou seja, não tem mais itens, a sua lista Matriz possui uma matriz de V,K,T,M 100% coberta. Notas: [1] É possível obter esse número de outra forma, usando calculo matemático, mas não vou ensinar aqui, sendo que é possível se obter ele no meio do caminho do algoritmo por uma simples subtração. [2] A notação "C(n, k)" é para aplicar a formula da combinação de n,k. [3] Ceil(n) é usado para especificar que um número deve ser arredondado para cima caso não seja um inteiro. Ou seja, 1,1 vai ser arredondado para 2. 1,9 vai ser arredondado para 2. [4] Caso mais de uma combinação de V,K fizer os mesmos T ou mais pontos com a atual lista de V,M, você pode escolher aleatoriamente qualquer uma. Como pode ver, o fato de o mesmo algoritmo criar matrizes com B de tamanhos distintos está relacionado ao fato da escolha aleatória nos passos 2) e passo 6.2) quando cai no caso da nota [4]. Também, você pode observar que algumas coisas foram postas para você aprender a como calcular o mínimo teórico, que as vezes pode ser a menor matriz possível. A menor matriz possível vai ser sempre maior ou igual ao mínimo teórico. Outra coisa que posso passar aqui é o cálculo do mínimo teórico de matrizes V,K,T, onde T=M. Aqui é a fórmula de Schonheim. A fórmula de Schonheim é diferente do mínimo teórico apresentado no meu algoritmo. A fórmula de Schonheim pode ser maior ou igual ao mínimo teórico. Ainda existem dois outros algoritmos que conheço para redução, que são: recozimento simulado e o PDO (Problem Dependent Optimization). Aqui neste tópico você vai encontrar maiores informações. Eu fiz um algoritmo parecido, vou tomar como exemplo a mega sena, combinado 10 números em conjuntos 6 em 6 é igual 210 jogos, se eu quero fazer um fechamento para garantir a quadra crio conjuntos 4 em 4 que da também 210. Aplicando a redução ou comparando as lista 1 e lista2, me retorna 23 volantes 100%. 4 acertos. o meu grande problema que tenho que varrer duas lista e processo se torna lento. eu busco é forma de processo ser mais rápido por isso a minha pergunta. segue abaixo: 1;2;3;4;5;6 1;2;3;4;8;10 1;2;3;5;7;10 1;2;3;7;8;9 1;2;4;6;7;9 1;2;5;6;7;8 1;2;5;6;9;10 1;2;6;8;9;10 1;3;4;5;7;9 1;3;5;6;8;9 1;3;6;7;9;10 1;4;5;6;9;10 1;4;5;7;8;10 1;4;6;8;9;10 2;3;4;5;7;10 2;3;4;5;8;9 2;3;4;6;7;8 2;3;4;6;9;10 2;4;6;7;9;10 2;5;7;8;9;10 3;5;6;7;8;10 3;5;6;8;9;10 4;5;6;7;8;9 Quote Link to comment Share on other sites More sharing options...
Ralf Jones Posted January 30 Share Posted January 30 @Joelsonc3 Tem o sistema de chaves dos italianos https://wheels.forumcommunity.net/?t=47707480 https://ljcr.dmgordon.org/cover/table.html https://ljcr.dmgordon.org/cover/show_cover.php?v=10&k=6&t=4 Method of Construction: random greedy covering Lower Bound: Schonheim C(10,6,4) = 20 | C(10,06,04,04) = 20 linhas 2 3 5 6 7 8 1 3 7 8 9 10 1 2 4 6 8 9 1 2 3 4 5 10 4 5 6 7 9 10 2 3 4 6 7 10 1 3 4 5 7 9 2 3 4 8 9 10 1 2 5 7 8 10 3 5 6 8 9 10 1 2 3 6 7 9 2 4 5 7 8 9 1 3 4 5 6 8 1 2 5 6 9 10 1 4 6 7 8 10 2 3 4 5 6 9 1 5 6 7 8 9 1 2 3 6 8 10 3 4 5 7 8 10 1 2 4 7 9 10 Quote Link to comment Share on other sites More sharing options...
Ralf Jones Posted January 31 Share Posted January 31 @Joelsonc3 o meu grande problema que tenho que varrer duas lista e processo se torna lento. eu busco é forma de processo ser mais rápido por isso a minha pergunta. Ok, eu não sei outra forma de fazer sem ter que varrer duas lista, mas e se usar um Parallel.For? Bom desculpa por não poder ajudar. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.