BIENVENIDO

Hola que tal a todos los enamorados de Matlab o que simplemente esten haciendo algo en este programa. dejen sus comentarios. espero pueda ayudarles esto en algo

Ejemplo de Algoritmo Genetico en Matlab AG codigo y funciones (Maximizando un funcion)

Este es un programa de au ALGORITMO GENETICO en Matlab

Cabe aclarar que el programa lo copie de un libro. Me paso que buscaba en la internet algun ejemplo de codigo de programa hecho en Matlab y pues batalle mucho asi que aqui les dejo una ayuda y ustedes puedan avanzar en sus estudios

Este programa resuelve la ecuacion de un circuito: ENCUENTRA LA MAXIMA POTENCIA


ESTE ES EL MAIN

% Main
popuSize=20;% Poblacion inicial
xover_rate=1.0;%Tasa de cruzamiento
mutate_rate=0.01;%Tasa de mutación
bit_n=16;%Número de bits para cada variable
limit=0;

global Vth;
global Rth;
global Xth;

%Se pide por los valores de entrada
Vth=input('Valor de la resistencia Vth: ');
if isempty(Vth)
    Vth=0;
end
Rth=input('Valor de la resistencia Rth: ');
if isempty(Rth)
    Rth=0;
end
Xth=input('Valor de la impedancia Xth: ');
if isempty(Xth)
    Xth=0;
end

obj_fcn='G_Pfunction2';%Funcion objetivo
var_n=2;%Numero de variables de entrada
range=[0,Rth;-Xth,Xth];%Rango de la entradas
%Grafica de la funcion potencia
syms RL;
syms XL;
z=(0.5*(Vth^2)*RL)/((Rth+RL)^2+(Xth+XL)^2);
figure;
ezsurf(z,[0,Rth,-Xth,Xth]);
xlabel('Load Resistance');ylabel('Load Impedance');title('Potencia');
%Mapa de contornos de la funcion potencia
figure;
ezcontour(z,[0,2*Rth,-2*Xth,2*Xth]);
hold off;
xlabel('Load Resistance');ylabel('Load Impedance');title('Potencia');

% Creacion de la poblacion inicial
popu=rand(popuSize,bit_n*var_n)>0.5;

fprintf('Población inicial.\n');

for i=1:popuSize
    for j=1:bit_n*var_n
        fprintf('%1.0f',popu(i,j));
    end
    fprintf('\n');
end

upper=zeros(50,1);%Creación de la matriz de mejor individuo

% Loop Principal
i=0;
% Cuando el ind. más apto no mejora después de 20 generaciones el GA
% termina
while(limit<=20)
    i=i+1;
    k=i;
    % Reseteo de variables
    delete(findobj(0,'tag','member'));
    delete(findobj(0,'tag','count'));
    % Evaucación  de la función para cada miembro dde la población
    fcn_value=evalpopu(popu,bit_n,range,obj_fcn);
    if (i==1)
        fprintf('Población inicial\n');
        for j=1:popuSize
            fprintf('f(%f,%f)=%f\n',...
                bit2num(popu(j,1:bit_n),range(1,:)),...
                bit2num(popu(j,bit_n+1:2*bit_n),range(2,:)),...
                fcn_value(j));
        end
    end
   
   
    % Llenar la matriz con los mejores individuos
    upper(i)=max(fcn_value);
   
    % Registro de si el ind. más apto mejora o no
    if (i>=2)
        if(upper(i)==upper(i-1))
            limit=limit+1;
        else
            limit=0;
        end
    end
   
    % Grafica de los mejores individuos
   
    [best,index]=max(fcn_value);
    fprintf('Generacion %i:',i);
    fprintf('f(%f,%f)=%f\n',...
        bit2num(popu(index,1:bit_n),range(1,:)),...
        bit2num(popu(index,bit_n+1:2*bit_n),range(2,:)),...
        best);
    % Creación  de la siguiente  pblación  con selección, cruze y mutación
    popu=nextpopu(popu,fcn_value,xover_rate,mutate_rate,k);
    if (mod(i,10)==0)
        fprintf('Población después de la %d° generación.\n',i);
        fprintf('Precione cualquier tecla ...\n');
        pause;
    end
    %end
end
[best,index]=max(fcn_value);
fprintf('\nMaxima potencia:%i Watts\n',best);
fprintf('Cuando: Rth=%f ohms,Xth=%fj ohms\n',...
    bit2num(popu(index,1:bit_n),range(1,:)),...
    bit2num(popu(index,bit_n+1:2*bit_n),range(2,:)));

AHORA VIENEN LAS FUNCIONES


function z=G_Pfunction2(input)
% Regresa el valor de la función de acuerdo al input

global PREV_PT;% Salida de la función anterior
global Vth;
global Rth;
global Xth;
RL=input(1);XL=input(2);
z=(0.5*(Vth^2)*RL)/((Rth+RL)^2+(Xth+XL)^2);
% Gráfica de la función potencia
property='Marker';
line(RL,XL,property,'o','markersize',10,...
    'clipping','off','erase','xor','color','k',...
    'tag','member','linewidth',2);
if~isempty(PREV_PT),%Actualizar la gráfica
    line([PREV_PT(1) RL],[PREV_PT(2) XL],'linewidth',1,...
        'clipping','off','erase','none',...
        'color','w','tag','traj');
end

PREV_PT=[RL XL];

drawnow;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5555

function out=evaleach(string,bit_n,range,obj_fcn)
% EVALEACH Evaluación de cadaindividuo
% string: cadena de bits que representa un individuo

var_n=length(string)/bit_n;
input=zeros(1,var_n);
% Ciclo para convertir cada individuo de bits a decimal
for i=1:var_n
    input(i)=bit2num(string((i-1)*bit_n+1:i*bit_n),range(i,:));
end
out=feval(obj_fcn,input);%Regresa el valor de salida

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5

function new_popu=nextpopu(popu,fitness,xover_rate,mut_rate,k)
new_popu=popu;
popu_s=size(popu,1);
string_leng=size(popu,2);
%=======ELITISMO: Se conservan los mejores 2 individuos
tmp_fitness=fitness;
[a,index1]=max(tmp_fitness);% Encuentra el mejor
tmp_fitness(index1)=min(tmp_fitness);
[a,index2]=max(tmp_fitness);% Encuentra el segundo mejor
new_popu([1 2],:)=popu([index1 index2],:);
% Se reescala la función de ajuste
fitness=fitness-min(fitness);% Positiva
total=sum(fitness);
if(k==1)
    fprintf('Función de ajuste despues de nueva escala\n');
    for i=1:popu_s
        fprintf('%10.3f\n',fitness(i));
    end
    fprintf('La suma de cada ajuste %10.5f\n',total);
end
if total==0
    fprintf('====Error====\n');
    fitness=ones(popu_s,1)/popu_s;% Sum es 1
else
    fitness=fitness/sum(fitness); % Sum es1
end
cum_prob=cumsum(fitness);
if(k==1)
    fprintf('La probabilidad de cada cromosoma, y su pro. acumulada\n');
    for i=1:popu_s
        fprintf('%10.3f %10.3f\n',fitness(i),cum_prob(i));
    end
end

%=====SELECCIÓN Y CRUZAMIENTO
for i=2:popu_s/2;
    % ====Se seleccionan dos padres de acuerdo con su nivel de ajuste
    tmp=find(cum_prob-rand>0);
    parent1=popu(tmp(1),:);
    tmp=find(cum_prob-rand>0);
    parent2=popu(tmp(1),:);
    %===Se determina si se cruza o no
    if rand<xover_rate
        % Operación de cruzamiento
        xover_point=ceil(rand*(string_leng-1));
        new_popu(i*2-1,:)=...
            [parent1(1:xover_point) parent2(xover_point+1:string_leng)];
        new_popu(i*2,:)=...
            [parent2(1:xover_point) parent1(xover_point+1:string_leng)];
    end
    if(k==1)
        fprintf('Punto de cruce = %d\n',xover_point);
        fprintf('Padre1\n');
        for j=1:string_leng
            fprintf('%d',parent1(j));
        end
        fprintf('\n');
        fprintf('Padre2\n');
        for j=1:string_leng
            fprintf('%d',parent2(j));
        end
        fprintf('\n');
        fprintf('Nueva población1\n');
        for j=1:string_leng
            fprintf('%d',new_popu(i*2-1,j));
        end
        fprintf('\n');
        fprintf('Nueva población2\n');
        for j=1:string_leng
            fprintf('%d',new_popu(i*2,j));
        end
        fprintf('\n');
    end
end

if (k==1)
    fprintf('El resultado depués del cruce de la primera pobablición\n');
    for i=1:popu_s
        for j=1:string_leng
            fprintf('%d',new_popu(i,j));
        end
        fprintf('\n');
        fprintf('\n');
    end
end
%====MUTATION (Los elites no se mutan)
mask=rand(popu_s,string_leng)<mut_rate;
new_popu=xor(new_popu,mask);
if(k==1)
    fprintf('El resultado dela mutación de la población\n');
    for i=1:popu_s
        for j=1:string_leng
            fprintf('%d',new_popu(i,j));
        end
        fprintf('\n');
        fprintf('\n');
    end
end
% Se restauran los miembros elite
new_popu([1 2],:)=popu([index1 index2],:);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




function fitness=evalpopu(popu,bit_n,range,obj_fcn)
% EVALPOPU Evaluación de ajuste de la población

global count% Contador global de individuos
pop_n=size(popu,1);
fitness=zeros(pop_n,1);
% Evaluación miembro por miembro
for count=1:pop_n
    fitness(count)=evaleach(popu(count,:),bit_n,range,obj_fcn);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5




function num=bit2num(bit,range)
%BIT2NUM Conversión de cadena de bits a número decimal
integer=polyval(bit,2);
num=integer*((range(2)-range(1))/(2^length(bit)-1))+range(1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%555



%*************************************************************************%
%*                                                                       *%
%* Creacion de la poblacion inicial aleatoriamente                       *%
%* TECLEADO POR:  Lc. Javier Cruz                                               *%
%*                                                                       *%
%*************************************************************************%
clc;
tamaPoblacion=20;
cromosoma=11;
pobla=rand(tamaPoblacion,cromosoma);
for i=1:tamaPoblacion;
    for j=1:cromosoma;
        if pobla(i,j)>0.5
           pobla(i,j)=1;
        else
            pobla(i,j)=0;
        end
    end
end
pobla;

pobla1=pobla(5,:);




EL PROGRAMA CORRIDO PARA ESTOS VALORES

Valor de la resistencia Vth: 3
Valor de la resistencia Rth: 2
Valor de la impedancia Xth: 5
Población inicial.
01111000011011101011101011011110
11111111001001001110001010100011
11011010010110110001100000101010
01010110001110100001101110110011
01011000101000111101101001101111
10101100111011110110010101101111
11100100111000111001001010010101
10101110001001101110010101000011
01010000010110010011111001111111
10100010010011010101110111001011
10111001100110110101010011110011
00001101000101011100110001111001
10011000001001010101100011100110
01000100000011000100111101001000
01101110110011100010100110001001
10000111110000110000011110100010
11110010110001100100010000101011
10000000010110000010100110101010
10100011110000001000100110011111
00011110001011101100001110001111
Población inicial
f(0.940871,2.299611)=0.068363
f(1.993317,3.853132)=0.095096
f(1.705928,-4.056077)=0.524905
f(0.673655,-3.917983)=0.364392
f(0.692485,3.532692)=0.038925
f(1.351064,-1.037690)=0.225767
f(1.788205,0.725948)=0.170714
f(1.360555,3.955673)=0.066914
f(0.627726,-2.558709)=0.219572
f(1.267994,-1.336156)=0.236728
f(1.450065,-1.681621)=0.284766
f(0.102205,2.987335)=0.006742
f(1.188647,-1.527352)=0.240652
f(0.531624,-1.903029)=0.149516
f(0.865675,-3.377508)=0.359215
f(1.060655,-4.701839)=0.504726
f(1.896696,-2.337148)=0.383171
f(1.002701,-3.372473)=0.386809
f(1.279316,0.375906)=0.145178
f(0.235782,2.639124)=0.016747
Generacion 1:f(1.705928,-4.056077)=0.524905
Función de ajuste despues de nueva escala
     0.062
     0.088
     0.518
     0.358
     0.032
     0.219
     0.164
     0.060
     0.213
     0.230
     0.278
     0.000
     0.234
     0.143
     0.352
     0.498
     0.376
     0.380
     0.138
     0.010
La suma de cada ajuste    4.35406
La probabilidad de cada cromosoma, y su pro. acumulada
     0.014      0.014
     0.020      0.034
     0.119      0.153
     0.082      0.236
     0.007      0.243
     0.050      0.293
     0.038      0.331
     0.014      0.345
     0.049      0.394
     0.053      0.446
     0.064      0.510
     0.000      0.510
     0.054      0.564
     0.033      0.597
     0.081      0.678
     0.114      0.792
     0.086      0.879
     0.087      0.966
     0.032      0.998
     0.002      1.000
Punto de cruce = 2
Padre1
11111111001001001110001010100011
Padre2
01101110110011100010100110001001
Nueva población1
11101110110011100010100110001001
Nueva población2
01111111001001001110001010100011
Punto de cruce = 7
Padre1
10111001100110110101010011110011
Padre2
01010110001110100001101110110011
Nueva población1
10111000001110100001101110110011
Nueva población2
01010111100110110101010011110011
Punto de cruce = 20
Padre1
11011010010110110001100000101010
Padre2
01010110001110100001101110110011
Nueva población1
11011010010110110001101110110011
Nueva población2
01010110001110100001100000101010
Punto de cruce = 16
Padre1
10101100111011110110010101101111
Padre2
10011000001001010101100011100110
Nueva población1
10101100111011110101100011100110
Nueva población2
10011000001001010110010101101111
Punto de cruce = 16
Padre1
10011000001001010101100011100110
Padre2
10100010010011010101110111001011
Nueva población1
10011000001001010101110111001011
Nueva población2
10100010010011010101100011100110
Punto de cruce = 7
Padre1
11110010110001100100010000101011
Padre2
11110010110001100100010000101011
Nueva población1
11110010110001100100010000101011
Nueva población2
11110010110001100100010000101011
Punto de cruce = 7
Padre1
01000100000011000100111101001000
Padre2
01101110110011100010100110001001
Nueva población1
01000100110011100010100110001001
Nueva población2
01101110000011000100111101001000
Punto de cruce = 5
Padre1
10000000010110000010100110101010
Padre2
11011010010110110001100000101010
Nueva población1
10000010010110110001100000101010
Nueva población2
11011000010110000010100110101010
Punto de cruce = 2
Padre1
01010110001110100001101110110011
Padre2
01101110110011100010100110001001
Nueva población1
01101110110011100010100110001001
Nueva población2
01010110001110100001101110110011
El resultado depués del cruce de la primera pobablición
11011010010110110001100000101010

10000111110000110000011110100010

11101110110011100010100110001001

01111111001001001110001010100011

10111000001110100001101110110011

01010111100110110101010011110011

11011010010110110001101110110011

01010110001110100001100000101010

10101100111011110101100011100110

10011000001001010110010101101111

10011000001001010101110111001011

10100010010011010101100011100110

11110010110001100100010000101011

11110010110001100100010000101011

01000100110011100010100110001001

01101110000011000100111101001000

10000010010110110001100000101010

11011000010110000010100110101010

01101110110011100010100110001001

01010110001110100001101110110011

El resultado dela mutación de la población
11011010010110110001100000101010

10000111110000110000011110100010

11101110110011100010100110001001

01111111001001001110001010100011

10111000001110100001111110110011

01010111100110110101010011110011

11011010010110110001101110110011

01010110001110100001100000101010

10101100111011110101100011100110

10011000001001010110010101101111

10011000001001010101110111001011

10100010010011010101100011100110

11110010110001100100010000101011

11110010100001100100010000101011

01000100110011100010100110001001

01101110000011000100111101001000

10000010010110110001100000101010

11011000010110000010100110101010

01101110110011100010100110001001

01010110001110100001101110110011

Generacion 2:f(1.705928,-4.056077)=0.524905
Generacion 3:f(1.894774,-4.056077)=0.530906
Generacion 4:f(1.705196,-4.701839)=0.555343
Generacion 5:f(1.895140,-4.702144)=0.558825
Generacion 6:f(1.955200,-4.701839)=0.559250
Generacion 7:f(1.895140,-4.759213)=0.559953
Generacion 8:f(1.897093,-4.838865)=0.561148
Generacion 9:f(1.897093,-4.838865)=0.561148
Generacion 10:f(1.955200,-4.838865)=0.561496
Población después de la 10° generación.
Precione cualquier tecla ...
Generacion 11:f(1.955200,-4.838865)=0.561496
Generacion 12:f(1.955200,-4.838865)=0.561496
Generacion 13:f(1.955200,-4.838865)=0.561496
Generacion 14:f(1.957580,-4.838560)=0.561501
Generacion 15:f(1.963500,-4.838407)=0.561519
Generacion 16:f(1.963500,-4.838865)=0.561524
Generacion 17:f(1.967407,-4.837949)=0.561525
Generacion 18:f(1.967407,-4.837949)=0.561525
Generacion 19:f(1.955688,-4.843290)=0.561548
Generacion 20:f(1.955688,-4.843442)=0.561550
Población después de la 20° generación.
Precione cualquier tecla ...
Generacion 21:f(1.963500,-4.843442)=0.561576
Generacion 22:f(1.963500,-4.843442)=0.561576
Generacion 23:f(1.963500,-4.843442)=0.561576
Generacion 24:f(1.957763,-4.995117)=0.562435
Generacion 25:f(1.957763,-4.995117)=0.562435
Generacion 26:f(1.957763,-4.995117)=0.562435
Generacion 27:f(1.957763,-4.995117)=0.562435
Generacion 28:f(1.957763,-4.995117)=0.562435
Generacion 29:f(1.959716,-4.995117)=0.562441
Generacion 30:f(1.959716,-5.000000)=0.562442
Población después de la 30° generación.
Precione cualquier tecla ...
Generacion 31:f(1.965576,-4.995117)=0.562457
Generacion 32:f(1.965576,-4.995117)=0.562457
Generacion 33:f(1.967529,-5.000000)=0.562462
Generacion 34:f(1.967529,-5.000000)=0.562462
Generacion 35:f(1.967529,-5.000000)=0.562462
Generacion 36:f(1.967529,-5.000000)=0.562462
Generacion 37:f(1.967529,-5.000000)=0.562462
Generacion 38:f(1.967529,-5.000000)=0.562462
Generacion 39:f(1.967529,-5.000000)=0.562462
Generacion 40:f(1.967529,-5.000000)=0.562462
Población después de la 40° generación.
Precione cualquier tecla ...
Generacion 41:f(1.967529,-5.000000)=0.562462
Generacion 42:f(1.989014,-4.978027)=0.562479
Generacion 43:f(1.989014,-5.000000)=0.562496
Generacion 44:f(1.998291,-5.000000)=0.562500
Generacion 45:f(1.998291,-5.000000)=0.562500
Generacion 46:f(1.998291,-5.000000)=0.562500
Generacion 47:f(1.998291,-5.000000)=0.562500
Generacion 48:f(1.998291,-5.000000)=0.562500
Generacion 49:f(1.998291,-5.000000)=0.562500
Generacion 50:f(1.998291,-5.000000)=0.562500
Población después de la 50° generación.
Precione cualquier tecla ...
Generacion 51:f(1.998291,-5.000000)=0.562500
Generacion 52:f(1.998291,-5.000000)=0.562500
Generacion 53:f(1.998779,-5.000000)=0.562500
Generacion 54:f(1.998779,-5.000000)=0.562500
Generacion 55:f(1.998779,-5.000000)=0.562500
Generacion 56:f(1.998779,-5.000000)=0.562500
Generacion 57:f(1.998779,-5.000000)=0.562500
Generacion 58:f(1.998779,-5.000000)=0.562500
Generacion 59:f(1.998779,-5.000000)=0.562500
Generacion 60:f(1.998779,-5.000000)=0.562500
Población después de la 60° generación.
Precione cualquier tecla ...
Generacion 61:f(1.999756,-5.000000)=0.562500
Generacion 62:f(1.999756,-5.000000)=0.562500
Generacion 63:f(1.999756,-5.000000)=0.562500
Generacion 64:f(1.999756,-5.000000)=0.562500
Generacion 65:f(2.000000,-5.000000)=0.562500
Generacion 66:f(2.000000,-5.000000)=0.562500
Generacion 67:f(2.000000,-5.000000)=0.562500
Generacion 68:f(2.000000,-5.000000)=0.562500
Generacion 69:f(2.000000,-5.000000)=0.562500
Generacion 70:f(2.000000,-5.000000)=0.562500
Población después de la 70° generación.
Precione cualquier tecla ...
Generacion 71:f(2.000000,-5.000000)=0.562500
Generacion 72:f(2.000000,-5.000000)=0.562500
Generacion 73:f(2.000000,-5.000000)=0.562500
Generacion 74:f(2.000000,-5.000000)=0.562500
Generacion 75:f(2.000000,-5.000000)=0.562500
Generacion 76:f(2.000000,-5.000000)=0.562500
Generacion 77:f(2.000000,-5.000000)=0.562500
Generacion 78:f(2.000000,-5.000000)=0.562500
Generacion 79:f(2.000000,-5.000000)=0.562500
Generacion 80:f(2.000000,-5.000000)=0.562500
Población después de la 80° generación.
Precione cualquier tecla ...
Generacion 81:f(2.000000,-5.000000)=0.562500
Generacion 82:f(2.000000,-5.000000)=0.562500
Generacion 83:f(2.000000,-5.000000)=0.562500
Generacion 84:f(2.000000,-5.000000)=0.562500
Generacion 85:f(2.000000,-5.000000)=0.562500
Generacion 86:f(2.000000,-5.000000)=0.562500

Maxima potencia:5.625000e-001 Watts
Cuando: Rth=2.000000 ohms,Xth=-5.000000j ohms
>>

Si les sirve aprovechenlo, es para cultivar nuestro conocimiento y mucha suerte

programa en matlab de una flecha que rota o de un relog

ESTA VEZ ESTUBE HACIENDO UN PROGRAMA QUE ROTARA UNA FIGURA Y PUES YA QUE ANDABA POR AHI PUES HICE UNO QUE  SE PARECE A UN RELOG



clc;
clear all;
close all;
%CREAMOS LA FLECHA

vx=[0 5 3 5 3];
vy=[0 0 1 0 -1];

% vx=[5 3 5 3];
% vy=[0 1 0 -1];

%CREAMOS UN CIRCULO
s=[0:1:40]*2*pi/40;
x1=5*cos(s);
y1=5*sin(s);

plot(vx,vy,x1,y1,'K',);
axis ([-10 10 -10 10]);

vec=[vx;vy];
pause(2);
% LA HACEMOS ROTAR
s=[0:1:12]*2*pi/12;
x=5*cos(s);
y=5*sin(s);
axis square

%   CONTRARIO A LAS MANECILLAS DEL RELOG
for teta=90:1:450
    B=[cosd(teta) -sind(teta);sind(teta) cosd(teta)];
    vecR=B*vec;
    xVec=vecR(1,:);
    yVec=vecR(2,:);
    plot(xVec,yVec,x,y,'.k',x1,y1,'k');
    title('MOV. CONTRARIO A LAS MANECILLAS DEL RELOG')
    axis ([-10 10 -10 10]);
    pause(eps)
end
%   EN SENTIDO DE LAS MANECILLAS DEL RELOG
for teta=-90:1:270
    B=[cosd(teta) sind(teta);-sind(teta) cosd(teta)];
    vecR=B*vec;
    xVec=vecR(1,:);
    yVec=vecR(2,:);
    plot(xVec,yVec,x,y,'.k');
    title('MOV. EN SENTIDO DE LAS MANECILLAS DEL RELOG');
    axis ([-10+teta/90 10+teta/90 -10+teta/90 10+teta/90]);
    pause(eps)
end

Espero les sea de ayuda. Aclaro no soy tan bueno escribiendo, creo ustedes lo pueden ver jaja :D. Una disculpa por eso