在matlab中用遗传算法找到最小的数学函数,我知道matlab有GA的工具箱但是我希望它能在程序上得到它)

时间:2016-12-15 06:35:47

标签: genetic-algorithm genetic-programming genetics

find minimum of math function with genetic algorithm in matlab

此files-main.m需要进行哪些修改?

global population;
global fitness;
global popsize;
format bank;
popsize=50;
report=zeros(popsize,2);
selected=ones(1,50);
fitness=zeros(1,50);
population = randi([0 1], 50, 10);
for j=1:popsize
calFitness();
for i=1:popsize
   selected(1,i)=(rol_wheel(fitness));
end;
population =recombin(population,selected);
report(j,:)=[min(fitness),mean(fitness)];
end

calFitness

function [] = calFitness(  )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here
global population;
global fitness;
global popsize;
%population=population.*2;
for i=1:popsize
    x=bin2dec(num2str(population(i,:)))/2;
    fitness(1,i)= abs(x*sin(sqrt(abs(x))));

 %disp(fitness);
end

%disp();

rol_wheel

    % ---------------------------------------------------------
% Roulette Wheel Selection Algorithm. A set of weights
% represents the probability of selection of each
% individual in a group of choices. It returns the index
% of the chosen individual.
% Usage example:
% fortune_wheel ([1 5 3 15 8 1])
%    most probable result is 4 (weights 15)
% ---------------------------------------------------------
function choice = rol_wheel(weights)
  accumulation = cumsum(weights);
  p = rand() * accumulation(end);
  chosen_index = -1;
  for index = 1 : length(accumulation)
    if (accumulation(index) > p)
      chosen_index = index;
      break;
    end
  end
  %keyboard
  choice = chosen_index;

recombin

function pop = recombin( popu,selected )
global popsize;
pop=zeros(50,10);
for i=1:popsize/2
    rc=randi([1,10]);
    for j=1:10
            pop(i,1:rc-1)=popu(selected(i),1:rc-1);
            pop(i,rc:end)=popu(selected(i+25),rc:end);
            pop(i+25,1:rc-1)=popu(selected(i+25),1:rc-1);
            pop(i+25,rc:end)=popu(selected(i),rc:end);
          %keyboard
    end
end  
end

我想找到这个文件的最小功能。现在需要做哪些修改?

1 个答案:

答案 0 :(得分:0)

你需要健身替换

fitness(1,i)= abs(x*sin(sqrt(abs(x))));

代表

fitness(1,i)= 1 / abs(x*sin(sqrt(abs(x))));或类似的东西;

但是你需要增加一些零分割保护。