MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

7
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; INTELIGENCIA ARTIFICIAL 1

Transcript of MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

Page 1: MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

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 1

Page 2: MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

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 2

Page 3: MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

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 3

Page 4: MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

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 4

Page 5: MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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 tocend--------------------------------------------------------------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 5

Page 6: MATLAB AG CODIGO TRABAJO 2 PARCIAL.docx

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 6