C 有效实施“适合度相称”;轮盘赌“;挑选
我目前正在用C编写一个键盘布局优化算法(如Peter Klausler设计的算法),我想实现一个适应度比例选择,如下所述(): 使用您选择的轮盘赌选择 基于 轮盘模型。做个馅饼 图表,其中成员的 切片与整个圆的比率 成员人数占总数的百分比 人口。正如你所看到的,如果 在圆的周长上是 随机挑选那些人 能力较高的成员将拥有 被选中的概率更高。 这确保了自然选择的重要性 地点 问题是,我不知道如何有效地实施它。我想到了两种方法:一种是不可靠的,另一种是缓慢的 首先,慢的一个: 对于长度为N的键盘池,创建一个长度为N的数组,其中数组的每个元素实际上包含两个元素,一个最小值和一个最大值。每个键盘都有相应的最小值和最大值,范围取决于键盘的适用性。例如,如果键盘0的适合度为10,键盘1的适合度为20,键盘2的适合度为25,则如下所示: 代码: (在这种情况下,适合度越低越好,因为这意味着需要的工作越少。) 然后生成一个随机数。无论该数字属于哪个范围,相应的键盘都会被“删除”,并替换为不同键盘的后代。根据需要重复多次 问题是速度非常慢。需要O(N^2)个操作才能完成 下一个是快速的: 首先,找出键盘的最低和最高匹配度。然后生成一个介于(最低适应度)和(最高适应度)之间的随机数,并杀死所有适应度高于生成数的键盘。这是有效的,但不能保证只杀死一半的键盘。它也有一些不同于“轮盘赌轮”选择的机制,所以它甚至可能不适用 所以问题是,什么是有效的实现C 有效实施“适合度相称”;轮盘赌“;挑选,c,genetic-algorithm,keyboard-layout,roulette-wheel-selection,C,Genetic Algorithm,Keyboard Layout,Roulette Wheel Selection,我目前正在用C编写一个键盘布局优化算法(如Peter Klausler设计的算法),我想实现一个适应度比例选择,如下所述(): 使用您选择的轮盘赌选择 基于 轮盘模型。做个馅饼 图表,其中成员的 切片与整个圆的比率 成员人数占总数的百分比 人口。正如你所看到的,如果 在圆的周长上是 随机挑选那些人 能力较高的成员将拥有 被选中的概率更高。 这确保了自然选择的重要性 地点 问题是,我不知道如何有效地实施它。我想到了两种方法:一种是不可靠的,另一种是缓慢的 首先,慢的一个: 对于长度为N的键盘池,创
这本书()第36页有一个稍微有效的算法,但问题是,只有在轮盘赌选择只有一次或几次时才有效。有没有什么有效的方法可以同时进行许多轮盘赌选择?首先,如果你想“杀死”你的选择(可能是一个高分的键盘),听起来你在谈论不适合的分数 我认为没有必要维护两个阵列。我认为最简单的方法是维护一个分数数组,然后遍历该数组进行选择:
/* These will need to be populated at the outset */
int scores[100];
int totalScore;
for (gen = 0; gen < nGenerations; ++gen) {
/* Perform a selection and update */
int r = rand() % totalScore; /* HACK: using % introduces bias */
int t = 0;
for (i = 0; i < 100; ++i) {
t += scores[i];
if (r < t) {
/* Bingo! */
totalScore -= scores[i];
keyboards[i] = generate_new_keyboard_somehow();
scores[i] = score_keyboard(keyboards[i]);
totalScore += scores[i]; /* Now totalScore is correct again */
}
}
}
/*这些需要在开始时填充*/
整数分数[100];
积分总分;
对于(gen=0;gen
每次选择/更新n个键盘都需要O(n)个时间。请将您的代码块重新格式化为代码,并修复您的Google Books链接。
/* These will need to be populated at the outset */
int scores[100];
int totalScore;
for (gen = 0; gen < nGenerations; ++gen) {
/* Perform a selection and update */
int r = rand() % totalScore; /* HACK: using % introduces bias */
int t = 0;
for (i = 0; i < 100; ++i) {
t += scores[i];
if (r < t) {
/* Bingo! */
totalScore -= scores[i];
keyboards[i] = generate_new_keyboard_somehow();
scores[i] = score_keyboard(keyboards[i]);
totalScore += scores[i]; /* Now totalScore is correct again */
}
}
}