【发布时间】:2010-11-19 13:28:33
【问题描述】:
我目前正在用 C 语言编写键盘布局优化算法(例如由 Peter Klausler 设计的算法),并且我想按照此处 (PDF Link) 的描述实现适应度成比例的选择:
通过轮盘选择,您可以选择 人口中的成员基于 轮盘赌模型。做一个馅饼 图表,其中成员的区域 切片与整个圆的比例是 成员适应度总和 人口。如您所见,如果一个点 在圆的圆周上是 随机挑选那些人口 适应度较高的成员将有一个 被选中的概率更高。 这确保了自然选择 地点。
问题是,我不知道如何有效地实施它。我想到了两种方法:一种不可靠,另一种很慢。
第一,慢的:
对于长度为 N 的键盘池,创建一个长度为 N 的数组,其中数组的每个元素实际上包含两个元素,一个最小值和一个最大值。每个键盘都有对应的最小值和最大值,范围取决于键盘的适应度。例如,如果键盘 0 的适应度为 10,键盘 1 的适应度为 20,键盘 2 的适应度为 25,则如下所示: 代码:
array[0][0] = 0; // minimum
array[0][1] = 9; // maximum
array[1][0] = 10;
array[1][1] = 30;
array[2][0] = 31;
array[2][1] = 55;
(在这种情况下,适应度越低越好,因为这意味着需要的努力更少。)
然后生成一个随机数。无论该数字属于哪个范围,相应的键盘都会被“杀死”并替换为不同键盘的后代。根据需要重复多次。
这样做的问题是它非常慢。需要 O(N^2) 次操作才能完成。
下一个快的:
首先弄清楚键盘的最低和最高适应度是什么。然后在(最低适应度)和(最高适应度)之间生成一个随机数,并杀死所有适应度高于生成数的键盘。这是有效的,但不能保证只杀死一半的键盘。它的机制也与“轮盘赌”选择有些不同,因此它甚至可能不适用。
那么问题来了,什么是高效的实现方式?
本书第 36 页 (Link) 有一个相当有效的算法,但问题是,只有当您只进行一次或几次轮盘选择时,它才有效。有什么有效的方法可以同时进行许多轮盘赌选择吗?
【问题讨论】:
-
请将您的代码块重新格式化为代码,并修复您的 Google 图书链接。
标签: c genetic-algorithm keyboard-layout roulette-wheel-selection