2

我需要做什么:

获取n 个染色体的种群,计算每个染色体的优度/适应度,使用权重随机选择,并从种群中返回最佳染色体。在我的例子中, n是 10,染色体是一个从 1 到 3 的整数数组。

示例:[1,3,2,1,1,1,2,3,3,2,1...k]。(k 为 81)

轮盘选择的工作原理链接

父母是根据他们的健康状况来选择的。染色体越好,被选中的机会就越大。想象一个轮盘赌,其中放置了种群中的所有染色体,根据其适应度函数,每个染色体都有很大的位置。

在此处输入图像描述

然后一个弹珠被扔在那里并选择染色体。具有更大适应度的染色体将被选择更多次。

这可以通过以下算法进行模拟。

  1. [Sum]计算种群中所有染色体适应度的总和 - sum S。
  2. [选择]从区间 (0,S) - r 生成随机数。
  3. [循环]遍历总体并从 0 - sum s 对适应度求和。当总和 s 大于 r 时,停止并返回您所在的染色体。

如何使用具有整数的染色体编写自定义轮盘赌选择?


我发现的这个函数仅适用 于群体中的一个染色体链接:

% ---------------------------------------------------------
% 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 = fortune_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
  choice = chosen_index;

我不知道如何编写评估整个染色体的优度/适应度函数,然后迭代哪个是最佳解决方案?

我需要这样的东西,但有整数:

在此处输入图像描述

拜托,欢迎任何想法。

编辑: 我想出了什么:

function [ selected_chromosome ] = RouletteWheelSelection( population )
% ---------------------------------------------------------
% Roulette Wheel Selection Algorithm. A set of weights
% represents the probability of selection of each
% individual in a group of choices. It returns the chosen chromosome.
% ---------------------------------------------------------
  struct_size = size(population.chromosomes);
  num_of_chromosomes = struct_size(1);

  for cnt = 1:num_of_chromosomes
      qk = cumsum(population.chromosomes(cnt,:));
      goodness(cnt) = sum(qk);
  end

  total_goodness = sum(goodness);
  for cnt2 = 1:num_of_chromosomes
      probabilities(cnt2) = goodness(cnt2) / total_goodness;
  end

  index = sum(rand >= cumsum([0, probabilities]));

  selected_chromosome = population.chromosomes(index, :);
end
4

0 回答 0