Optimization 博弈agent启发式评价函数优化的遗传算法

Optimization 博弈agent启发式评价函数优化的遗传算法,optimization,artificial-intelligence,genetic-algorithm,depth-first-search,game-theory,Optimization,Artificial Intelligence,Genetic Algorithm,Depth First Search,Game Theory,这是对这一问题的回答: ,特别是@David(这是第一个答案) 背景:我正在使用遗传算法优化游戏代理中的超参数,该代理使用minimax/alpha-beta修剪(迭代深化)。特别是,我想使用遗传算法优化启发式(评估)函数参数。我使用的评估函数是: f(w)=w*我的移动次数-(1-w)*对手移动次数 要优化的唯一参数是[0,1]中的w 以下是我编写遗传算法的方法: 创建一个随机的群体,比如说100个代理 让他们随机玩1000个游戏,并进行替换 让父母成为表现最好的因素,让一些表现较差的因素混合

这是对这一问题的回答: ,特别是@David(这是第一个答案)

背景:我正在使用遗传算法优化游戏代理中的超参数,该代理使用minimax/alpha-beta修剪(迭代深化)。特别是,我想使用遗传算法优化启发式(评估)函数参数。我使用的评估函数是:

f(w)=w*我的移动次数-(1-w)*对手移动次数

要优化的唯一参数是[0,1]中的w

以下是我编写遗传算法的方法:

  • 创建一个随机的群体,比如说100个代理
  • 让他们随机玩1000个游戏,并进行替换
  • 让父母成为表现最好的因素,让一些表现较差的因素混合在遗传多样性中
  • 随机繁殖一些父母来创造孩子*繁殖过程:我们将孩子定义为父母体重的平均值。 i、 e.儿童体重=0.5(父亲体重+母亲体重)
  • 新的人口是由父母和新出生的孩子组成的
  • 随机变异1%的人群,如下所示:newWeight=agent.x+random.uniform(-0.01,0.01),并考虑轻微的边界情况(即适当地小于零且大于一)
  • 进化10次(即对新种群重复)

  • 我的问题:请评估上面的加粗点。特别是,有没有人有更好的繁殖方法(而不是简单地平均父母的体重),有没有人有更好的变异方法,而不是仅仅添加random.uniform(-0.01,0.01)?

    看起来你实际上并没有将遗传算法应用于你的代理,而是直接在表型/重量上的简单进化。我建议你试着引入一种新的体重,并进化出这个基因组。例如,将权重表示为二进制字符串,并对字符串的每个位应用演化,这意味着每个位都有可能发生变异。这称为点突变。你可以应用许多其他的突变,但这只是一个开始

    你会注意到,你的代理人不会陷入局部极小值,因为有时一个小的基因改变可以极大地改变表型/体重

    好吧,听起来可能很复杂,其实不是。让我举个例子:

    假设以10为基数的权重为
    42
    。这将是二进制的
    101010
    。现在,您已经在二进制表示的每一位上实现了1%的变异率。假设最后一位被翻转了。然后我们有二进制的
    101011
    ,或者十进制的
    43
    。没有这么大的变化。另一方面,对第二位执行相同的操作会使您获得二进制或十进制的
    111010
    。注意这个大跳跃。这正是我们想要的,并让您的代理群体更快地搜索解决方案空间的更大部分

    关于繁殖。你可以试试交叉。假设你有很多权重,每个权重都有一个基因编码。如果将整个基因组(所有二进制数据)表示为一个长的二进制字符串,则可以合并两个父基因组的部分。再次举个例子。以下是“父亲”和“母亲”的基因组和表型:

    Weight Name:          W1     W2     W3     W4     W5
    Father Phenotype:     43     15     34     17     14
    Father Genome:    101011 001111 100010 010001 001110
    Mother Genome:    100110 100111 011001 010100 101000
    Mother Phenotype:     38     39     25     20     40
    
    你能做的就是在同一个地方画任意的线穿过两个基因组,并将片段任意分配给孩子。这是一个版本的交叉

    Weight Name:          W1     W2     W3     W4     W5
    Father Genome:    101011 00.... ...... .....1 001110
    Mother Genome:    ...... ..0111 011001 01010. ......
    Child Genome:     101011 000111 011001 010101 001110
    Child Phenotype:      43      7     25     21     14
    
    在这里,前8位和后7位来自父亲,中间位来自母亲。注意重量W1和W5完全来自父亲,而W3完全来自母亲。而W2和W4是组合。W4几乎没有任何变化,而W2变化很大

    我希望这能让你对遗传算法有所了解。也就是说,我建议使用一个现代化的库,而不是自己实现它,除非你这样做是为了学习

    编辑:有关处理权重/二进制表示的详细信息:

    • 如果需要分数,可以将分子和分母分离为不同的权重,或者将其中一个作为常数,例如,
      42
      10
      给出
      4.2
    • 大于0的约束将免费提供。为了得到负数,你需要抵消你的重量
    • 通过将权重除以该位字符串长度的最大可能值,可以得到小于1的约束。在上面的示例中,您有6位,最大为63位。如果你在变异后得到一个二进制字符串
      101010
      42
      ,在基数10中,你得到的42/63是0.667,并且只有在63/63时才能达到1.0
    • 两个权重之和等于1?如果你得到
      W1
      W2
      101010
      001000
      ,它给出了42和8,那么你可以去
      W1_scaled=W1/(W1+W2)=0.84
      W2_scaled=W2/(W1+W2)=0.16
      。这将始终为您提供
      W1_缩放+W2_缩放=1

    看起来你实际上并没有将遗传算法应用到你的代理上,而只是直接在表型/权重上进行简单的进化。我建议你试着引入一种新的体重,并进化出这个基因组。例如,将权重表示为二进制字符串,并对字符串的每个位应用演化,这意味着每个位都有可能发生变异。这称为点突变。你可以应用许多其他的突变,但这只是一个开始

    你会注意到,你的代理人不会陷入局部极小值,因为有时一个小的基因改变可以极大地改变表型/体重

    好吧,听起来可能很复杂,其实不是。乐