我需要做什么:
获取n 个染色体的种群,计算每个染色体的优度/适应度,使用权重随机选择,并从种群中返回最佳染色体。在我的例子中, n是 10,染色体是一个从 1 到 3 的整数数组。
示例:[1,3,2,1,1,1,2,3,3,2,1...k]。(k 为 81)
轮盘选择的工作原理链接:
父母是根据他们的健康状况来选择的。染色体越好,被选中的机会就越大。想象一个轮盘赌,其中放置了种群中的所有染色体,根据其适应度函数,每个染色体都有很大的位置。
然后一个弹珠被扔在那里并选择染色体。具有更大适应度的染色体将被选择更多次。
这可以通过以下算法进行模拟。
- [Sum]计算种群中所有染色体适应度的总和 - sum S。
- [选择]从区间 (0,S) - r 生成随机数。
- [循环]遍历总体并从 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