You are on page 1of 6

MATLAB - PROBLEMA DEL AGENTE VIAJERO CODIGO

-------------------------------------------------------------GENETICOS-------------------------------------------------function geneticos
clc
clear all
close all
tic
cont=1;
nciudad = 12;%n=num de ciudades
fin = 40;%final de programa
poblacion = nciudad*2;%numero de poblacion
hijo={};
uno=[1:nciudad];
ciudad = 1 + 119*rand(nciudad,2);
minx = min(ciudad(:,1));
maxx = max(ciudad(:,1));
miny = min(ciudad(:,2));
maxy = max(ciudad(:,2));
axis([minx-1 maxx+1 miny-1 maxy+1]);
grid on;
hold on;
for i=1:poblacion
pob(i,:)=randperm(nciudad);
hijo(i) ={ciudad(pob(i,:),:)};
distancia(i) = evalua(hijo{i});
end
hs=dibuja(ciudad,uno);
pob2=[];
%%%%%%%%%%%%%repetir aqui
while cont~=fin
if cont > 1
for ooo=1:poblacion
hijo(ooo) ={ciudad(pob(ooo,:),:)};
distancia(ooo) = evalua(hijo{ooo});
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%
dismin = min(distancia);
disminpos=find(dismin == distancia);
disminpos=disminpos(1,1);
mejor1 = pob(disminpos,:);
pob2(1,:)=mejor1;
disp('mejor');disp(mejor1);disp(dismin);
distancia(disminpos)=1000;
dismin = min(distancia);
disminpos=find(dismin == distancia);
disminpos=disminpos(1,1);
mejor2 = pob(disminpos,:);
pob2(2,:)=mejor2;
C = ciudad(mejor1,:);
INTELIGENCIA ARTIFICIAL

delete(hs);
hs=dibuja(C,mejor1);
pppp=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%5selecciona poblacion por torneo
while pppp~=poblacion
i=0;
while i~=2
num = int16(1+(nciudad-1)*rand());
r=1;
a = zeros(1,num);
disselect = zeros(1,num);
n=0;
while n~=num
y = int16(1+(nciudad-1)*rand());
while y>nciudad
y = int16(1+(nciudad-1)*rand());
end
a(1,r)=y;
z = find(y == a);
w = size(z,2);
if w == 1;
select(r,:)=pob(y,:);
disselect(r)=distancia(y);
r=r+1;
n=n+1;
end
end
p=min(disselect);
indice=find(p == disselect);
indice = indice(1,1);
padre(i+1,:)=select(indice,:);
if i==1
if padre(1,:)==padre(2,:)
i=i-1;
end
end
i=i+1;
end
select = [];
%%%%%%%%%%%%%%%%%%%%%fin de torneo
hijo1num=padre(1,:);%disp(hijo1num);
hijo2num=padre(2,:);%disp(hijo2num);
k=0;
cambio=0;z=0;z1=0;
if k == 0; %%%%%%%%%%%%%%%%%%%%%%%%cruza pmx
%disp('cruza pmx');
f = int16(1+((nciudad/2)-1)*rand());
g = int16((nciudad/2)+(nciudad/2)*rand());
while f ==1 && g == 10
INTELIGENCIA ARTIFICIAL

f = int16(1+((nciudad/2)-1)*rand());
g = int16((nciudad/2)+(nciudad/2)*rand());
end
cambio = (f:g);
z=hijo1num(1,cambio);%disp('hijo1');disp(hijo1num);
z1=hijo2num(1,cambio);%disp('hijo2');disp(hijo2num);
%pause;
cruza1=hijo1num(cambio);%disp('cruza1');disp(cruza1);
cruza2=hijo2num(cambio);%disp('cruza2');disp(cruza2);
%pause
o=1;
entro=0;posi1=0;posi2=0;
for p=1:length(cruza1)
for q=1:length(cruza1)
if cruza1(p)==cruza2(q)
posi1(o)=p;
posi2(o)=q;
o=o+1;
entro=entro+1;
end
end
end
if entro == 0
posi1 = 0;
end
if posi1~=0
rephijo1=cruza1;%disp('rephijo1 = cruza1');disp(rephijo1);
rephijo2=cruza2;%disp('rephijo2 = cruza2');disp(rephijo2);
rephijo1(posi1)=0;%disp('rephijo1 = z');disp(rephijo1);
rephijo2(posi2)=0;%disp('rephijo2 = z1');disp(rephijo2);
z=rephijo1;
z1=rephijo2;
end
hijo1num(cambio)=0;%disp('hijo1num');disp(hijo1num);
hijo2num(cambio)=0;%disp('hijo2num');disp(hijo2num);
%pause;
cindex=1;c1index=1;
c=0;c1=0;
for i=1:length(z)
if z(1,i)==0
continue;
else
c(1,cindex)=find(z(1,i) == hijo2num);
cindex=cindex+1;
INTELIGENCIA ARTIFICIAL

end
end
for i=1:length(z1)
if z1(1,i)==0
continue;
else
c1(1,c1index)=find(z1(1,i) == hijo1num);
c1index=c1index+1;
end
end
%disp('inidices c hijo2');disp(c);
%disp('indices c1 hijo1');disp(c1);

memoria1=0;memoria2=0;
memoria1=hijo1num;
memoria2=hijo2num;
si = find(0==c);
tama=length(c);
tama2=length(si);
si2 = find(0==c1);
tama3=length(c1);
tama4=length(si2);
if tama == tama2 && tama3 == tama4
continue;
else
hijo1num(1,c1)=memoria2(1,c);%disp('hijo1num');disp(hijo1num);
hijo2num(1,c)=memoria1(1,c1);%disp('hijo2num');disp(hijo2num);
%pause;
end
hijo1num(1,cambio)=cruza2;%disp('hijo1num');disp(hijo1num);
hijo2num(1,cambio)=cruza1;%disp('hijo2num');disp(hijo2num);
%pause;
hijo1cruza=hijo1num;%disp('hijo1cruza');disp(hijo1cruza);
hijo2cruza=hijo2num;%disp('hijo2cruza');disp(hijo2cruza);
%pause;fin de cruza pmx
end
pppp=size(pob2,1);
pob2(pppp+1,:)=(hijo1cruza);
pob2(pppp+2,:)=(hijo2cruza);
hijo1num=0;hijo2num=0;hijo1cruza=0;hijo2cruza=0;
%pause;
pppp=size(pob2,1);
end
INTELIGENCIA ARTIFICIAL

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%mutacion
%disp('inicia mutacion');
for mutar=1:int16(poblacion/3)
indexmuta = int16(3+(nciudad-3)*rand());
while indexmuta>10
indexmuta = int16(1+(nciudad-1)*rand());
end
indimuta=pob2(indexmuta,:);
indexmuta1 = int16(1+(nciudad-1)*rand());
indexmuta2 = int16(1+(nciudad-1)*rand());
while indexmuta1 == indexmuta2
indexmuta2 = int16(1+(nciudad-1)*rand());
end
memoriamuta1=indimuta;
memoriamuta2=indimuta;
indimuta(indexmuta1)=memoriamuta1(indexmuta2);
indimuta(indexmuta2)=memoriamuta2(indexmuta1);
pob2(indexmuta,:)=indimuta;
end
pob=[];
pob=pob2;
pob2=[];
%disp('nueva poblacion');disp(pob);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fin mutacion
cont = cont+1;%bandera fin
hijo1num=0;hijo2num=0;hijo1cruza=0;hijo2cruza=0;
indimuta=0;
disp('CONTADOR ===');disp(cont);
distancia=[];
pause(.5);
%pause;
end
toc
end
--------------------------------------------------------------DIBUJA ------------------------------------------------------function hs = dibuja(C,P)
[n,m]=size(C);
xa = C(1,1);
ya = C(1,2);
r = num2str(P(1));
h = text(xa,ya,r);
hs = [h];
for ix=2:n
x = C(ix,1);
y = C(ix,2);
h1 = plot([xa x],[ya y],'r');
r = num2str(P(ix));
h2 = text(x,y,r);
INTELIGENCIA ARTIFICIAL

hs = [hs;h1;h2];
xa = x;
ya = y;
end
x = C(1,1);
y = C(1,2);
h=plot([xa x],[ya y],'r');
hs = [hs;h];
-----------------------------------------------------------------EVALUA-------------------------------------------------------function R = evalua(C)
B = [C(2:end,:); C(1,:)];
Z = sqrt(sum((C -B).^2,2));
R = sum(Z);

INTELIGENCIA ARTIFICIAL

You might also like