我正在研发国际象棋引擎,并使用基因表达式编程方法来发展评估功能。
由于国际象棋没有神谕,我的健身功能只能找到两个人的相对适合度(通过执行国际象棋比赛)。
由于我没有绝对的适应度量,我可能最终得到一些以循环方式相互优于的个体($ R_A_B(A)> R_A_B(B),R_B_C(B)> R_B_C (C),R_A_C(C)> R_A_C(A)$)
那么,在这种情况下,有哪些方法可以有效地发展个体,我怎样才能避免陷入如此混乱? 谢谢:))
答案 0 :(得分:1)
循环方式(R_A_B(A)> R_A_B(B),R_B_C(B)> R_B_C(C),R_A_C(C)> R_A_C(A))不能完全避免,因为国际象棋游戏是完美NP问题的良好示例和此类系统的详细行为无法准确评估。
让我们考虑棋盘位置 P 。让我们表示由个人A生成的变体形成棋盘中的位置 P 属于集合 Ap 。让我们考虑另一组 Bp ,其中由 B 定义的评估函数用于获取该位置的变体。让我们定义一个函数Q(x),它测试任何个体在游戏进行时提供的变化的质量。所以在 P 让Q( Ap )> Q( Bp )然后对于任何其他位置 p',Q( Bp')> Q(的 AP'强>)。
不可能发展一个为所有职位产生最佳变化的个体,因为你自己说过国际象棋没有神谕;
但这不会成为一个问题。在这里,我建议了一种可能有用的方法;
而不是试图为这样一个混乱中的个人提供独特的排名,为什么他们不能被平等对待?如果他们得到平等对待,可能出现的一个问题是前几代人可能在很大程度上陷入如此圆形的混乱(太多人的力量相等)。因此,在前几代使用不同的适应度函数来提高其效率足以解决基本的国际象棋难题(通过使用更简单的终点定义适应度函数)并没有错。后代将在这个圆形混乱中落下的次数较少,这不会成为问题。如果适应度函数取决于特定人群中两个人之间的比赛结果,那么这将把这种进化的终点设定为:获得假设函数G(x)的游戏强度(这是永远不可能的) 。因此,所产生的个体将试图在更广泛的范围内发展,试图在所有董事会情况下变得完美(如果在初始世代中存在的个体具有弱的游戏力量,这将减慢该过程)。
我建议的另一种方法是尝试定义一个常数函数N(x),使其在更高的时间复杂度下工作(即通过检查更多变化来评估比从特定世代中选择的个体更长的时间) 。现在我们可以分别比较值R_A_N(A),R_B_N(B),R_C_N(C)以按顺序对它们进行排序。为此目的,没有必要为此创建唯一的常量评估函数,可以为此选择任何随机个体。
使用选择性个体N(用于搜索更大深度)然后尝试找到R_A_N(A),更像是在图中选择原点,其中仅知道某些点的相对位置。在这里,人口相对于选定的个体发展; N不必是具有固定参数的常数函数,它也可以是存在于该圆形混乱中的个体之一,其被制造为在测试更多数量的变化(更高的搜索深度)的引擎中运行。如果将个体A选择为N,并且使其自身以更大的深度运行,那么很明显,以较高深度运行的个体A击败A以较低的深度运行。在这里,我们可以定义一个适应度函数,该函数取决于国际象棋比赛的最终结果以外的因素;例如,
所以定义R_A_N(A),R_B_N(B),......这种方式可以避免这种循环混乱。