Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
%Algoritmo genético para predição de números a partir de dicas fornecidas %pelo usuário - Víttor Paulo" %Através de informações fornecidas pelo usuário, o programa procura o %número que melhor se encaixar nas descrições; o programa mostrará um total %de cinco respostas, esperando-se que a primeira seja o número pensado, e %caso não seja, que ele pelo menos esteja entre os 5 mostrados. %Planejado para os números de 1 a 99 (1 ou 2 dígitos) %Limpeza de variáveis e prompt clear; clc; Pontos=[0,0]; %Vetor para contagem de pontos; 3 pontos para o programa se acertar de primeira, um ponto se acertar entre os cinco primeiros, %e 50 pontos para o usuário se o número não for desvendado (Desafio: de forma honesta, fazer mais pontos que a máquina em 10 rodadas) Rep=0; %Variável para repetição do programa %Saudação e instrução inicial (disp(sprintf(...)) para não ficar mostrando ans no prompt) disp(sprintf('Olá! Este programa tentará adivinhar em qual número (inteiro) de 1 a 99 você está pensando.\nPense em um número e responda as perguntas:(Aperte Enter para continuar)\n')); pause; %Não começar antes do usuário escolher um número e apertar Enter while Rep==0 %Repetir o programa inteiro disp(sprintf('Quantos dígitos tem o seu número?')); %Primeira pergunta: obtendo o número de dígitos Perg_1=input(''); while ((Perg_1<1||Perg_1>2)||Perg_1~=floor(Perg_1)) %Forçar a escolha de um número válido (1 ou 2 dígitos; valor positivo e inteiro) disp(sprintf('O número escolhido não é válido, pense em outro e informe quantos dígitos tem:')); Perg_1=input(''); end %Direcionamento das perguntas seguintes de acordo com o número de dígitos if (Perg_1==1) %Para 1 dígito disp(sprintf('\nO seu número é maior do que 5?\n0.Sim\n1.Não\n')); %Segunda pergunta (1 dígito): x>5? Perg_2=input(''); while (Perg_2~=0&&Perg_2~=1) %Forçar escolha de opção válida Perg_2=input('Opção inválida, responda de novo'); end %Para números de 1 a 5 if Perg_2==1 disp(sprintf('\nO número 15 pode ser dividido pelo seu número sem deixar resto?\n0.Sim\n1.Não\n')); %Terceira pergunta: 1, 3 ou 5? Perg_3=input(''); while (Perg_3~=0&&Perg_3~=1) %Forçar escolha de opção válida Perg_3=input('Opção inválida, responda de novo'); end disp(sprintf('\nSeu número pode ser usado para dividir 16 sem deixar resto?\n0.Sim\n1.Não\n')); %Quarta pergunta: 1, 2 ou 4? Perg_4=input(''); while (Perg_4~=0&&Perg_4~=1) %Forçar escolha de opção válida Perg_4=input('Opção inválida, responda de novo'); end disp(sprintf('\nE com o número 17, divisão exata?\n0.Sim\n1.Não\n')); %Quinta pergunta: é 1? Perg_5=input(''); while (Perg_5~=0&&Perg_5~=1) %Forçar escolha de opção válida Perg_5=input('Opção inválida, responda de novo'); end disp(sprintf('\nÚltima pergunta: O seu número divide exatamente o número 18?\n0.Sim\n1.Não\n')); %Última pergunta: 1, 2 ou 3? Perg_6=input(''); while (Perg_6~=0&&Perg_6~=1) %Forçar escolha de opção válida Perg_6=input('Opção inválida, responda de novo'); end %Para números de 6 a 9 else disp(sprintf('\nO seu número pode ser dividido exatamente por algum número menor que 5 (exceto o 1?)\n0.Sim\n1.Não\n')); %Terceira pergunta: 6, 8 ou 9? Perg_3=input(''); while (Perg_3~=0&&Perg_3~=1) %Forçar escolha de opção válida Perg_3=input('Opção inválida, responda de novo'); end Perg_3=Perg_3+2;%Diferenciar do primeiro caso do if; em vez de 0-1, ser 2-3 disp(sprintf('\nO número 18 pode ser dividido pelo seu número sem deixar resto?\n0.Sim\n1.Não\n')); %Quarta pergunta: 6 ou 9? Perg_4=input(''); while (Perg_4~=0&&Perg_4~=1) %Forçar escolha de opção válida Perg_4=input('Opção inválida, responda de novo'); end Perg_4=Perg_4+2;%Diferenciar do primeiro caso do if; em vez de 0-1, ser 2-3 disp(sprintf('\nÚltima pergunta: seu número divide 24 sem deixar resto?\n0.Sim\n1.Não\n')); %Última pergunta: 6 ou 8? Perg_5=input(''); while (Perg_5~=0&&Perg_5~=1) %Forçar escolha de opção válida Perg_5=input('Opção inválida, responda de novo'); end Perg_5=Perg_5+2; Perg_6=2; %Para ter o mesmo número de "perguntas" do primeiro caso end Num=[Perg_1,Perg_2,Perg_3,Perg_4,Perg_5,Perg_6]; %Vetor com as respostas fornecidas para comparação %Para números de 1 a 9, não é necessário utilizar algoritmo genético completo, uma única geração resolve o problema %Montagem da população inicial (e única) Pop=[[1;2;3;4;5;6;7;8;9],ones(9,1)*Perg_1,zeros(9,5)]; %Primeira coluna com os números em teste, a segunda com o número de dígitos Fitness=zeros(9,1); %Vetor para os fitness; for i=1:9 %Cálculos linha por linha if Pop(i,1)>5 %Segunda pergunta %x>5 Pop(i,3)=0; %Segunda pergunta if Pop(i,1)~=7 %Terceira pergunta Pop(i,4)=2; %Sim else Pop(i,4)=3; %Não end if Pop(i,1)==6||Pop(i,1)==9 %Quarta pergunta Pop(i,5)=2; %Sim else Pop(i,5)=3; %Não end if Pop(i,1)==6||Pop(i,1)==8 %Quinta pergunta Pop(i,6)=2; %Sim else Pop(i,6)=3; %Não end Pop(i,7)=2;%"Pergunta" seis, diferenciar do outro caso else %x<=5 Pop(i,3)=1; if (Pop(i,1)==1||Pop(i,1)==3)||(Pop(i,1)==5) %Terceira pergunta Pop(i,4)=0; %Sim else Pop(i,4)=1; %Não end if (Pop(i,1)==1||Pop(i,1)==2)||(Pop(i,1)==4) %Quarta pergunta Pop(i,5)=0; %Sim else Pop(i,5)=1; %Não end if Pop(i,1)==1 %Quinta pergunta Pop(i,6)=0; %Sim else Pop(i,6)=1; %Não end if (Pop(i,1)==1||Pop(i,1)==2)||(Pop(i,1)==3) %Sexta pergunta Pop(i,7)=0; %Sim else Pop(i,7)=1; %Não end end for j=2:7 %Varrer coluna por coluna dentro da mesma linha para aplicar o fitness if Pop(i,j)==Num(1,j-1); %Se a resposta da população bate com a fornecida Fitness(i,1)=Fitness(i,1)+1; %Acrescentar um ponto ao fitness end end Fitness(i,1)=Fitness(i,1)/6; %Cálculo da porcentagem: total de coincidentes/total de respostas end for i=1:9 %Ajuste da população pelo fitness (ordem crescente) Vetor_Aux=Pop(i,1:7); %Vetores para ajudar na troca Fit_Aux=Fitness(i,1); for j=i+1:9 %Verificar da posição atual em diante if Fitness(j,1)>Fitness(i,1) %Se achar um maior for k=1:7 %Troca casa por casa da população Pop(i,k)=Pop(j,k); Pop(j,k)=Vetor_Aux(1,k); Vetor_Aux(1,k)=Pop(i,k); end %Troca do fitness Fitness(i,1)=Fitness(j,1); Fitness(j,1)=Fit_Aux; Fit_Aux=Fitness(i,1); end end end %-----------------------------------------------------------------------------------------------------------------------------------------------------------% else %Para dois dígitos disp(sprintf('\nSeu número termina com o dígito 0?\n0.Sim\n1.Não\n')); Perg_2=input(''); %O número escolhido termina em 0? while (Perg_2~=0&&Perg_2~=1) %Forçar escolha de opção válida Perg_2=input('Opção inválida, responda de novo'); end if Perg_1==2 %Perguntas para números de dois dígitos if Perg_2==0 %Com final 0 disp(sprintf('\nO primeiro dígito do seu número é maior do que 5?\n0.Sim\n1.Não\n')); Perg_3=input(''); %60, 70, 80 ou 90? while (Perg_3~=0&&Perg_3~=1) %Forçar escolha de opção válida Perg_3=input('Opção inválida, responda de novo'); end if Perg_3==0 %x>50 disp(sprintf('\nSeu número pode ser dividido exatamente por 30?\n0.Sim\n1.Não\n')); Perg_4=input(''); %60 ou 90? while (Perg_4~=0&&Perg_4~=1) %Forçar escolha de opção válida Perg_4=input('Opção inválida, responda de novo'); end disp(sprintf('\nÚltima pergunta: seu número pode ser dividido exatamente por 20?\n0.Sim\n1.Não\n')); Perg_5=input(''); %60 ou 80? while (Perg_5~=0&&Perg_5~=1) %Forçar escolha de opção válida Perg_5=input('Opção inválida, responda de novo'); end Perg_6=NaN; %Perguntas não usadas Perg_7=NaN; Perg_8=NaN; else %x<=50 disp(sprintf('\nO primeiro dígito do seu número é ímpar?\n0.Sim\n1.Não\n')); Perg_4=input(''); %10, 30 ou 50? while (Perg_4~=0&&Perg_4~=1) %Forçar escolha de opção válida Perg_4=input('Opção inválida, responda de novo'); end Perg_4=Perg_4+2; %Diferenciar do caso anterior disp(sprintf('\nSeu número é menor que 35?\n0.Sim\n1.Não\n')); Perg_5=input(''); %10, 20 ou 30? while (Perg_5~=0&&Perg_5~=1) %Forçar escolha de opção válida Perg_5=input('Opção inválida, responda de novo'); end Perg_5=Perg_5+2; %Diferenciar do caso anterior disp(sprintf('\nÚltima pergunta: O seu número pode ser dividido exatamente por 6?\n0.Sim\n1.Não\n')); Perg_6=input(''); %30? while (Perg_6~=0&&Perg_6~=1) %Forçar escolha de opção válida Perg_6=input('Opção inválida, responda de novo'); end Perg_6=Perg_6+2; %Diferenciar do caso anterior Perg_7=NaN; %Perguntas não usadas Perg_8=NaN; end else %Demais números disp(sprintf('\nOs dígitos são repetidos?\n0.Sim\n1.Não\n')); Perg_3=input(''); %Múltiplos de 11? while (Perg_3~=0&&Perg_3~=1) %Forçar escolha de opção válida Perg_3=input('Opção inválida, responda de novo'); end Perg_3=Perg_3+4; %Diferenciar do outro caso if Perg_3==4 %Números múltiplos de 11 disp(sprintf('\nSeu número é menor que 60?\n0.Sim\n1.Não\n')); Perg_4=input(''); %11, 22, 33, 44 ou 55? while (Perg_4~=0&&Perg_4~=1) %Forçar escolha de opção válida Perg_4=input('Opção inválida, responda de novo'); end Perg_4=Perg_4+4; %Diferenciar do outro caso disp(sprintf('\nSeu número é par?\n0.Sim\n1.Não\n')); Perg_5=input(''); %22, 44, 66 ou 88? while (Perg_5~=0&&Perg_5~=1) %Forçar escolha de opção válida Perg_5=input('Opção inválida, responda de novo'); end Perg_5=Perg_5+4; %Diferenciar do outro caso disp(sprintf('\nSeu número está entre 30 e 80?\n0.Sim\n1.Não\n')); Perg_6=input(''); %33, 44, 55, 66 ou 77? while (Perg_6~=0&&Perg_6~=1) %Forçar escolha de opção válida Perg_6=input('Opção inválida, responda de novo'); end Perg_6=Perg_6+4; %Diferenciar do outro caso disp(sprintf('\nÚltima pergunta: a soma dos seus dígitos é menor do que 10?\n0.Sim\n1.Não\n')); Perg_7=input(''); %11, 22, 33 ou 44? while (Perg_7~=0&&Perg_7~=1) %Forçar escolha de opção válida Perg_7=input('Opção inválida, responda de novo'); end Perg_7=Perg_7+4; %Diferenciar os casos Perg_8=NaN; %Pergunta não usada else %Números sem dígitos repetidos e sem final 0 disp(sprintf('\nOs dígitos estão em ordem crescente?\n0.Sim\n1.Não\n')); Perg_4=input(''); %Primeiro dígito maior que o segundo? while (Perg_4~=0&&Perg_4~=1) %Forçar escolha de opção válida Perg_4=input('Opção inválida, responda de novo'); end Perg_4=Perg_4+6; %Diferenciar dos outros casos disp(sprintf('\nPelo menos um dígito do seu número é menor ou igual a 3?\n0.Sim\n1.Não\n')); Perg_5=input(''); %Seu número tem pelo menos um dígito 1, 2 ou 3? while (Perg_5~=0&&Perg_5~=1) %Forçar escolha de opção válida Perg_5=input('Opção inválida, responda de novo'); end Perg_5=Perg_5+6; %Diferenciar dos outros casos disp(sprintf('\nPelo menos um dígito do seu número é maior que 3 e menor ou igual a 6?\n0.Sim\n1.Não\n')); Perg_6=input(''); %Seu número tem pelo menos um dígito 4, 5 ou 6? while (Perg_6~=0&&Perg_6~=1) %Forçar escolha de opção válida Perg_6=input('Opção inválida, responda de novo'); end Perg_6=Perg_6+6; %Diferenciar dos outros casos disp(sprintf('\nSeu número é par?\n0.Sim\n1.Não\n')); Perg_7=input(''); %Termina em 2, 4, 6 ou 8? while (Perg_7~=0&&Perg_7~=1) %Forçar escolha de opção válida Perg_7=input('Opção inválida, responda de novo'); end Perg_7=Perg_7+6; %Diferenciar dos outros casos disp(sprintf('\nÚltima pergunta: Qual a soma dos dígitos?\n')); Perg_8=input(''); %Qual a soma dos dígitos? while (Perg_8<=1||Perg_8>18)||(Perg_8~=floor(Perg_8)) %Forçar escolha de soma válida Perg_8=input('Essa soma é impossível para as condições definidas. Refaça a soma'); end end end %Algoritmo genético para adivinhar o número de dois dígitos Num=[Perg_1,Perg_2,Perg_3,Perg_4,Perg_5,Perg_6,Perg_7,Perg_8]; %Vetor com os dados fornecidos pelo usuário Pop=zeros(70,11); %População com o número pronto, os dígitos separados e espaço para as 8 perguntas; 50 indivíduos Fitness=zeros(70,1);%Vetor com o fitness de cada indivíduo for i=1:length(Pop) %Criação da população com números de dois dígitos aleatórios Pop(i,2)=1+round(rand*8); %Sorteio do primeiro dígito (não pode ser 0) Pop(i,3)=round(rand*9); %Sorteio do segundo dígito Pop(i,1)=10*Pop(i,2)+Pop(i,3); %Montagem do número testado (resposta) for j=1:i-1 %Verificar se há número repetido e reescolher %Funciona, mas não em 100% das vezes if Pop(i,1)==Pop(j,1) j=0; %Se repetiu, volta o contador j e escolher de novo o número Pop(i,2)=1+round(rand*8); %Sorteio do primeiro dígito (não pode ser 0) Pop(i,3)=round(rand*9); %Sorteio do segundo dígito Pop(i,1)=10*Pop(i,2)+Pop(i,3); %Montagem do número testado (resposta) end end end for i=1:length(Pop)%Atribuição dos dados e fitness Pop(i,4)=2; %Atributo: número de dígitos (perg. 1) if Pop(i,3)==0 %Números com final 0 (perg. 2) (Primeiro caso) Pop(i,5)=0; %Sim if Pop(i,2)>5 %Números maiores que 50 (perg. 3, caso 1) Pop(i,6)=0; %Sim if Pop(i,2)==6||Pop(i,2)==9 %É 60 ou 90 (perg. 4, caso 1) Pop(i,7)=0; %Sim else Pop(i,7)=1; %Não end if Pop(i,2)==6||Pop(i,2)==8 %É 60 ou 80 (perg. 5, caso 1) Pop(i,8)=0; %Sim else Pop(i,8)=1; %Não end Pop(i,9)=NaN; %Pergunta não usada nesse caso (perg. 6) else %Números menores ou iguais a 50 Pop(i,6)=1;%Não é maior que 50 if (Pop(i,2)==1||Pop(i,2)==3)||(Pop(i,2)==5) %É 10, 30 ou 50 (perg. 4, caso 2) Pop(i,7)=2; %Sim else Pop(i,7)=3; %Não end if Pop(i,2)<=3%É 10, 20 ou 30 (perg. 5, caso 2) Pop(i,8)=2; %Sim else Pop(i,8)=3; %Não end if Pop(i,2)==3 %É 30 (perg. 6, caso 2) Pop(i,9)=2; %Sim else Pop(i,9)=3;%Não end end Pop(i,10)=NaN; %Perguntas não usadas no primeiro caso Pop(i,11)=NaN; else Pop(i,5)=1; %Não termina com 0 if Pop(i,2)==Pop(i,3) %Dígitos repetidos (perg. 3, caso 3) Pop(i,6)=4; %Sim if Pop(i,1)<60 %É menor que 60 (perg. 4, caso 3) Pop(i,7)=4; %Sim else Pop(i,7)=5; %Não end if (Pop(i,3)==2||Pop(i,3)==4)||(Pop(i,3)==6||Pop(i,3)==8) %É par (perg. 5, caso 3) Pop(i,8)=4; %Sim else Pop(i,8)=5; %Não end if (Pop(i,1)>30&&Pop(i,1)<80)%Entre 30 e 80 (perg. 6, caso 3) Pop(i,9)=4; %Sim else Pop(i,9)=5; %Não end if (Pop(i,2)+Pop(i,3)<10) %Soma dos dígitos menor do que 10 (perg. 7, caso 3) Pop(i,10)=4; %Sim else Pop(i,10)=5; %Não end Pop(i,11)=NaN; %Pergunta não utilizada no caso else Pop(i,6)=5; %Não repete dígitos nem termina em 0 if Pop(i,2)<Pop(i,3) %Dígitos em ordem crescente (perg. 4, caso 4) Pop(i,7)=6; %Sim else Pop(i,7)=7; %Não end if Pop(i,2)<=3||Pop(i,3)<=3 %Pelo menos um dígito é menor ou igual a 3 (perg. 5, caso 4) Pop(i,8)=6; %Sim else Pop(i,8)=7; %Não end if (Pop(i,2)>3&&Pop(i,2)<=6)||(Pop(i,3)>3&&Pop(i,3)<=6) %Pelo menos um dígito é maior que 3 e menor ou igual a 6 (perg. 6, caso 4) Pop(i,9)=6; %Sim else Pop(i,9)=7; %Não end if (Pop(i,3)==2||Pop(i,3)==4)||(Pop(i,3)==6||Pop(i,3)==8) %O número é par (perg. 7, caso 4) Pop(i,10)=6; %Sim else Pop(i,10)=7; %Não end Pop(i,11)=Pop(i,2)+Pop(i,3); %Soma dos dígitos end end Aux=0; %Auxiliar para contagem dos pontos do fitness for j=4:11 %Atribuição do fitness if Pop(i,j)==Num(1,j-3) %Se os dados batem com as informações obtidas Aux=Aux+1; end end Fitness(i,1)=Aux/8; %Atribuição do fitness end for x=1:length(Pop) %Ajuste da população pelo fitness (ordem crescente) Vetor_Aux=Pop(x,1:11); %Vetores para ajudar na troca Fit_Aux=Fitness(x,1); for j=x+1:length(Pop) %Verificar da posição atual em diante if Fitness(j,1)>Fitness(x,1) %Se achar um maior for k=1:11 %Troca casa por casa da população Pop(x,k)=Pop(j,k); Pop(j,k)=Vetor_Aux(1,k); Vetor_Aux(1,k)=Pop(x,k); end %Troca do fitness Fitness(x,1)=Fitness(j,1); Fitness(j,1)=Fit_Aux; Fit_Aux=Fitness(x,1); end end end %Avanço das gerações (total arbitrário: 200) for ger=1:200 [Limite,col]=size(Pop); %Salvar o tamanho original da população Pop=Pop(1:Limite*0.4,1:11); %Eliminação (Sobram só 40% dos indivíduos) Fitness=Fitness(1:Limite*0.4,1); while length(Pop)<Limite%Criação de novos indivíduos Novo=zeros(1,11);%Novo indivíduo [a,b]=size(Pop); %Atualização das dimensões Pai1=Pop(1+round(rand*(a-1)),1:b); %Primeiro pai é um indivíduo aleatório Pai2=Pop(1+round(rand*(a-1)),1:b); %Segundo pai é outro indivíduo aleatório while Pai2(1,1)==Pai1(1,1) %Verificar se não foram escolhidos dois iguais Pai2=Pop(1+round(rand*(a-1)),1:b); %Escolher outro se for end for i=2:3 %Geração do novo indivíduo, com base nos dois dígitos de cada pai if rand<=0.7 %Crossing over, 70% de chance de acontecer Novo(1,i)=Pai2(1,i); %Se acontecer, pega o do pai 2 else Novo(1,i)=Pai1(1,i); %Se não, mantém o do 1 end if rand<=0.05 %Mutação, 5% de chance de acontecer if i==2 %Se acontecer no primeiro dígito Novo(1,i)=1+round(rand*8); %Sorteia um número de 1 a 9 (0 não pode) else Novo(1,i)=round(rand*9); %Sorteia um número de 0 a 9 end end end Novo(1,1)=Novo(1,2)*10+Novo(1,3); %Montagem do número resposta Novo(1,4)=2; %Atributo: número de dígitos (perg. 1) Igual=0; %Auxiliar de indivíduo repetido for i=1:a if Novo(1,1)==Pop(i,1) %Se o novo for igual a algum que já tem, acusar Igual=1; end end if Igual==0 %Se não for repetido, produzir os dados e calcular fitness if Novo(1,3)==0 %Números com final 0 (perg. 2) (Primeiro caso) Novo(1,5)=0; %Sim if Novo(1,2)>5 %Números maiores que 50 (perg. 3, caso 1) Novo(1,6)=0; %Sim if Novo(1,2)==6||Novo(1,2)==9 %É 60 ou 90 (perg. 4, caso 1) Novo(1,7)=0; %Sim else Novo(1,7)=1; %Não end if Novo(1,2)==6||Novo(1,2)==8 %É 60 ou 80 (perg. 5, caso 1) Novo(1,8)=0; %Sim else Novo(1,8)=1; %Não end Novo(1,9)=NaN; %Pergunta não usada nesse caso (perg. 6) else %Números menores ou iguais a 50 Novo(1,6)=1;%Não é maior que 50 if (Novo(1,2)==1||Novo(1,2)==3)||(Novo(1,2)==5) %É 10, 30 ou 50 (perg. 4, caso 2) Novo(1,7)=2; %Sim else Novo(1,7)=3; %Não end if Novo(1,2)<=3%É 10, 20 ou 30 (perg. 5, caso 2) Novo(1,8)=2; %Sim else Novo(1,8)=3; %Não end if Novo(1,2)==3 %É 30 (perg. 6, caso 2) Novo(1,9)=2; %Sim else Novo(1,9)=3;%Não end end Novo(1,10)=NaN; %Perguntas não usadas no primeiro caso Novo(1,11)=NaN; else Novo(1,5)=1; %Não termina com 0 if Novo(1,2)==Novo(1,3) %Dígitos repetidos (perg. 3, caso 3) Novo(1,6)=4; %Sim if Novo(1,1)<60 %É menor que 60 (perg. 4, caso 3) Novo(1,7)=4; %Sim else Novo(1,7)=5; %Não end if (Novo(1,3)==2||Novo(1,3)==4)||(Novo(1,3)==6||Novo(1,3)==8) %É par (perg. 5, caso 3) Novo(1,8)=4; %Sim else Novo(1,8)=5; %Não end if (Novo(1,1)>30&&Novo(1,1)<80)%Entre 30 e 80 (perg. 6, caso 3) Novo(1,9)=4; %Sim else Novo(1,9)=5; %Não end if (Novo(1,2)+Novo(1,3)<10) %Soma dos dígitos menor do que 10 (perg. 7, caso 3) Novo(1,10)=4; %Sim else Novo(1,10)=5; %Não end Novo(1,11)=NaN; %Pergunta não utilizada no caso else Novo(1,6)=5; %Não repete dígitos nem termina em 0 if Novo(1,2)<Novo(1,3) %Dígitos em ordem crescente (perg. 4, caso 4) Novo(1,7)=6; %Sim else Novo(1,7)=7; %Não end if Novo(1,2)<=3||Novo(1,3)<=3 %Pelo menos um dígito é menor ou igual a 3 (perg. 5, caso 4) Novo(1,8)=6; %Sim else Novo(1,8)=7; %Não end if (Novo(1,2)>3&&Novo(1,2)<=6)||(Novo(1,3)>3&&Novo(1,3)<=6) %Pelo menos um dígito é maior que 3 e menor ou igual a 6 (perg. 6, caso 4) Novo(1,9)=6; %Sim else Novo(1,9)=7; %Não end if (Novo(1,3)==2||Novo(1,3)==4)||(Novo(1,3)==6||Novo(1,3)==8) %O número é par (perg. 7, caso 4) Novo(1,10)=6; %Sim else Novo(1,10)=7; %Não end Novo(1,11)=Novo(1,2)+Novo(1,3); %Soma dos dígitos end end Aux=0; %Auxiliar para contagem dos pontos do fitness for j=4:11 %Atribuição do fitness if Novo(1,j)==Num(1,j-3) %Se os dados batem com as informações obtidas Aux=Aux+1; end end Fitness_Novo=Aux/8; %Atribuição do fitness Pop=[Pop;Novo]; %Acréscimo do novo indivíduo e do seu respectivo fitness Fitness=[Fitness;Fitness_Novo]; end end Pop=Pop(1:Limite,1:11); %Evitar que fique maior do que o original Fitness=Fitness(1:Limite,1); for x=1:length(Pop) %Ajuste da população pelo fitness (ordem crescente) Vetor_Aux=Pop(x,1:11); %Vetores para ajudar na troca Fit_Aux=Fitness(x,1); for j=x+1:length(Pop) %Verificar da posição atual em diante if Fitness(j,1)>Fitness(x,1) %Se achar um maior for k=1:11 %Troca casa por casa da população Pop(x,k)=Pop(j,k); Pop(j,k)=Vetor_Aux(1,k); Vetor_Aux(1,k)=Pop(x,k); end %Troca do fitness Fitness(x,1)=Fitness(j,1); Fitness(j,1)=Fit_Aux; Fit_Aux=Fitness(x,1); end end end end end end %Exibição dos resultados Resp=Pop(1,1); %Resposta é o primeiro número da primeira linha Vetor_Resp=Pop(1:5,1);%As cinco melhores respostas, segundo o programa %Exibição da resposta, com condicional para exibir as outras disp(sprintf('\nVocê pensou no número: %d?\n0.Sim\n1.Não\n',Resp)); Outras_resp=input(''); while Outras_resp~=1&&Outras_resp~=0 Outras_resp=input('Opção inválida, responda de novo'); end if Outras_resp==1 disp(sprintf('\nAs cinco melhores respostas encontradas foram: (em ordem decrescente de semelhança)\n')); disp(Vetor_Resp); disp(sprintf('\nO seu número aparece nessa lista?\n0.Sim\n1.Não\n')); Aux_ponto=input(''); while Aux_ponto~=1&&Aux_ponto~=0 Aux_ponto=input('Opção inválida, responda de novo'); end end if Outras_resp==0 Pontos(1,2)=Pontos(1,2)+3; else if Outras_resp==1&&Aux_ponto==0 Pontos(1,2)=Pontos(1,2)+1; else Pontos(1,1)=Pontos(1,1)+50; end end disp(sprintf('\nSua pontuação:%d\nPontuação da máquina:%d\n',Pontos(1,1),Pontos(1,2))); %Exibição da pontuação total disp(sprintf('*Obs:\nO programa acertou de primeira: 3 pontos para a máquina\nO programa recorreu ao Top 5: 1 ponto para a máquina\nO programa não adivinhou: 50 pontos para você')); disp(sprintf('\nQuer jogar de novo?\n0.Sim\n1.Não\n')); Rep=input(''); while Rep~=1&&Rep~=0 Rep=input('Opção inválida, responda de novo'); end clc; %Limpa a tela end
Compartilhar