Buscar

Script ("jogo") que prevê números pensados (1-99)

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

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais