2010-10-04 97 views
2

我开始钻研GA到这里来研究一下,我似乎无法找到交叉代断点的答案。举例来说,如果我开始与家长:
Father = [A,B,B,A,C]
Mother = [D,D,B,A,A]
交叉算法的实现

在什么时候我能legitmately停止生产儿童证明所有可能的组合已经用尽?代码如下:

void reproduce(String[] father, String[] mother) {
double choice = Math.random() * 100;
if((int) choice % 10 < 2){
//start at father[1] and swap.
//Continue for other choices

这是一小片,以我利用逻辑。所以我的问题回来了,我如何合理地确定何时停止创建孩子?或者,这只是一个数学问题,我应该只看一个直排列生成器,而忽略GA?

+0

我宁愿认为遗传算法的重点在于寻找解决问题的启发式方法,并非详尽无遗。如果你不得不尝试每种组合,那么你可以在没有GAs的情况下解决问题。 – 2010-10-04 00:40:07

+0

这可能更接近我们所需要的,因为GA对我而言是新的东西,这就是为什么我似乎回到彻底搜索,因为它是我熟悉的。 – Woot4Moo 2010-10-04 00:44:04

+0

GA最适合那些无法彻底解决的问题。当我在一家工程公司工作以解决*许多*变量和约束条件下的复杂非线性方程时,我们使用了类似的东西。 – 2010-10-04 00:45:32

回答

2

首先,这应该是一个不错的方式,让孩子离开父母。这是一个单点交叉。

public String[] reproduce(String[] father, String[] mother) { 
    int[] child=new String[father.length]; 
    int crossPoint = Math.random()*father.length;//make a crossover point 
    for (int i=0;i<father.length;++i) 
    { 
    if (i<crossPoint) 
     child[i]=father[i]; 
    else 
     child[i]=mother[i]; 
    } 
    return child; 
} 

没有咖啡,所以没有保证。你可能想要检查一个错误。

+0

所以我们可以假设我们正在设置一个可以生成的排列的限制,尽管世代数可以>限制 – Woot4Moo 2010-10-04 13:17:45

+0

不确定你的意思......你不限制排列,你只是采取尽可能多的随机孩子,以填补目前的代人队伍(大约1000人左右)。正如托尼恩尼斯指出的那样,它是启发式的。你不会限制100000000000000000000000000的排列,你尽可能多地处理。 – Ishtar 2010-10-04 13:48:12

+0

这是早,我是半散漫= p – Woot4Moo 2010-10-04 15:45:52

1

由于您正在使用随机数字进行更改,因此您不能保证在X孩子之后您将尝试所有内容。如果你想尝试每个选项,你不应该使用随机数字。所以是的,用一个直排列生成器并忽略GA。

+0

如果我想以托尼的方式探索这种启发式的方法,那么这个需要怎么改变? – Woot4Moo 2010-10-04 00:50:31

+0

将启发式算法看作“好但不完美”的算法。你怎么做取决于问题。 如果你想继续使用GA的想法,但使用启发式的方式选择一个,我会使用贪婪的递归算法。选择任何可能的孩子,然后再创建一个与第一个孩子只有一个基因不同的孩子。比较两者,以及再次运行这个过程后,哪个孩子更好。继续这样做直到你找到一个更好的孩子,那么所有的兄弟姐妹都会有一个基因与之不同。 – AmaDaden 2010-10-04 20:13:18