Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有效实施“适合度相称”;轮盘赌“;挑选_C_Genetic Algorithm_Keyboard Layout_Roulette Wheel Selection - Fatal编程技术网

C 有效实施“适合度相称”;轮盘赌“;挑选

C 有效实施“适合度相称”;轮盘赌“;挑选,c,genetic-algorithm,keyboard-layout,roulette-wheel-selection,C,Genetic Algorithm,Keyboard Layout,Roulette Wheel Selection,我目前正在用C编写一个键盘布局优化算法(如Peter Klausler设计的算法),我想实现一个适应度比例选择,如下所述(): 使用您选择的轮盘赌选择 基于 轮盘模型。做个馅饼 图表,其中成员的 切片与整个圆的比率 成员人数占总数的百分比 人口。正如你所看到的,如果 在圆的周长上是 随机挑选那些人 能力较高的成员将拥有 被选中的概率更高。 这确保了自然选择的重要性 地点 问题是,我不知道如何有效地实施它。我想到了两种方法:一种是不可靠的,另一种是缓慢的 首先,慢的一个: 对于长度为N的键盘池,创

我目前正在用C编写一个键盘布局优化算法(如Peter Klausler设计的算法),我想实现一个适应度比例选择,如下所述():

使用您选择的轮盘赌选择 基于 轮盘模型。做个馅饼 图表,其中成员的 切片与整个圆的比率 成员人数占总数的百分比 人口。正如你所看到的,如果 在圆的周长上是 随机挑选那些人 能力较高的成员将拥有 被选中的概率更高。 这确保了自然选择的重要性 地点

问题是,我不知道如何有效地实施它。我想到了两种方法:一种是不可靠的,另一种是缓慢的

首先,慢的一个:

对于长度为N的键盘池,创建一个长度为N的数组,其中数组的每个元素实际上包含两个元素,一个最小值和一个最大值。每个键盘都有相应的最小值和最大值,范围取决于键盘的适用性。例如,如果键盘0的适合度为10,键盘1的适合度为20,键盘2的适合度为25,则如下所示: 代码:

(在这种情况下,适合度越低越好,因为这意味着需要的工作越少。)

然后生成一个随机数。无论该数字属于哪个范围,相应的键盘都会被“删除”,并替换为不同键盘的后代。根据需要重复多次

问题是速度非常慢。需要O(N^2)个操作才能完成

下一个是快速的:

首先,找出键盘的最低和最高匹配度。然后生成一个介于(最低适应度)和(最高适应度)之间的随机数,并杀死所有适应度高于生成数的键盘。这是有效的,但不能保证只杀死一半的键盘。它也有一些不同于“轮盘赌轮”选择的机制,所以它甚至可能不适用

所以问题是,什么是有效的实现


这本书()第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 */
        }
    }
}