(*Condiciones
particulares del problema*)
f[x_]:=x-IntegerPart[x];
funcion[x_]:=Sin[6*f[Cos[2*x]]]*Cos[f[x]+2];
intervalo={0,4};
individuos=10; (* como minimo, se toma la menor potencia
de 2 > individuos, 16*)
poblacion=2*individuos+2; (* Numero de individuos que
puede haber como maximo *)
iter=10;(* Numero de iteraciones *)
nuitermuta=4; (* cada cuantas iteraciones se producen
mutaciones *)
numuta=10; (* numero maximo de mutaciones que se
producen cada vez *)
(*Inicio
del algoritmo*)
A=Plot[funcion[x],{x,intervalo[[1]],intervalo[[2]]}];
longint=intervalo[[2]]-intervalo[[1]];
propo=longint/(individuos+1);
lista={intervalo[[1]],intervalo[[2]]};
For[i=1,i<=individuos,i++,
lista=Append[lista,N[intervalo[[1]]+i*propo]]
];
Print["inicio: ",Sort[lista]];
(*Iteraciones*)
For[kk=1,kk<=iter,kk++,
{
Print["*******
Iteracion: ", kk];
funlis=N[funcion[lista]];
(*Reproduccion*)
While[Length[lista]<=poblacion,
{
alfa=Random[Real,{0,Sqrt[Max[funlis]-Min[funlis]]}]^2+Min[funlis];
Print["Se
reproducen los menores de: ",alfa];
longlist=Length[lista];
For[i=1,i<=longlist,i++,
{
If[funlis[[i]]<=alfa,
{
beta=Random[Integer,{1,longlist}];
gama=Random[Real,{0,1}];
res=N[gama*lista[[i]]+(1-gama)*lista[[beta]]];(*nuevo
individuo*)
lista=Append[lista,res];
funlis=Append[funlis,funcion[res]]
}
]
}
]
}
];
Print["Hijos: ",Sort[lista]];
(*
Mutaciones *)
If[Mod[kk,nuitermuta]==0,
{
alfa=Random[Integer,{1,numuta+1}];
For[s=1, s<=alfa, s++,
{
beta=Random[Real,{intervalo[[1]],intervalo[[2]]}];
Print["Nueva Mutacion: ",beta, " con valor: ",funcion[beta]];
lista=Append[lista,beta];
funlis=Append[funlis,funcion[beta]]
}
]
}
];
(*Muertes*)
qui=Length[lista]-poblacion-1;
Print["Quitar
",qui," individuos."];
salto=0;
While[qui>=0,
{
If[salto==0, alfa=Sqrt[Random[Real,{0,(Max[funlis]-Min[funlis])^2}]]+Min[funlis]]
Print["Se mueren el
inmediatamente mayores de: ",alfa];
mi=10^100; (* Un numero
muy grande *)
funlis=N[funcion[lista]];
For[j=1,j<=Length[lista],j++,
{
If[funlis[[j]]>alfa
&& funlis[[j]]<=mi,
{
mi=funlis[[j]];
jj=j
}
]
}
];
If[mi!=10^100, (* el
numero muy grande de arriba *)
{
qui--;
lista=Delete[lista,jj];
funlis=Delete[funlis,jj];
salto=0
},
{
alfatem=alfa;
alfa=alfatem/2;
salto=1
}
]
}
];
Print["Supervivientes:
",Sort[lista]];
B=ListPlot[Table[{lista[[i]], funlis[[i]]}, {i,
longlist}],
PlotStyle->{PointSize[0.03],RGBColor[1, 0,
0]}];
Show[A,B];
}
];
(*Solucion*)
res=funcion[lista];
Print["Resultado: minimo:",Min[res]," en el punto:
",lista[[Position[res,Min[res]][[1]][[1]]]]]