<p>我想用遗传算法进行实验,这似乎是一个很好的优化类型的问题。有15行可以是任意顺序,一共有15行!排列,或1.0e+12。尝试所有排列的蛮力方法是不实际的</p>
<p>我有下面的函数来计算人口中个体的“适合度”。分数是平均值和标准差的组合。我的数学可能不完全正确,我肯定是用numpy来做的,但它似乎产生了很好的结果</p>
<pre><code>def calculate_fitness(population):
fitness_scores = []
for individual in population:
# Group the rows in 3's according to the columns.
proj_a = individual[ : 3,1] # First 3 rows, column 1.
proj_b = individual[ 3: 6,2] # Next 3 rows, column 2, etc.
proj_c = individual[ 6: 9,3]
proj_d = individual[ 9:12,4]
proj_e = individual[12:15,5] # Bottom 3 rows, last column.
arr = np.array([proj_a, proj_b, proj_c, proj_d, proj_e])
mean = arr.mean() # Mean.
std = np.abs(arr.std()) # Standard deviation.
# We want both the lowest mean and lowest standard deviation.
# For simplicity, let's just add them and use that as the score.
fitness_scores.append(mean + std)
# Invert and scale the values so they can be used as weights
# for random selection.
fitness_scores = np.array(fitness_scores)
fitness_scores = (fitness_scores.max() + .3 ) - fitness_scores
fitness_scores /= (fitness_scores.max() + .07)
fitness_scores *= 100
return fitness_scores
</code></pre>
<p>输出-前3行属于A,后3行属于B,依此类推:</p>
<pre><code>employee proj_A proj_B proj_C proj_D proj_E
A3 1 2 4 3 5
C4 1 2 3 4 5
A1 1 5 3 4 2
C2 3 1 2 5 4
B5 2 1 3 5 4
C5 2 1 4 5 4
A2 4 2 1 3 5
A5 1 3 2 5 4
B3 2 3 1 5 4
B1 5 4 1 2 3
C3 5 3 4 1 2
C1 2 3 4 1 5
B2 4 5 3 2 1
B4 5 3 4 2 1
A4 4 5 3 2 1
</code></pre>
<p>在这一组中,似乎每个人都很高兴,这可能是最佳组合</p>
<p>在这里,每个人都非常满意所有的1分,除了A3得到3分</p>
<pre><code>employee proj_A proj_B proj_C proj_D proj_E
C4 1 _ _ _ _
A1 1 _ _ _ _
A5 1 _ _ _ _
B5 _ 1 _ _ _
C2 _ 1 _ _ _
C5 _ 1 _ _ _
A2 _ _ 1 _ _
B3 _ _ 1 _ _
B1 _ _ 1 _ _
C1 _ _ _ 1 _
A3 _ _ _ 3 _
C3 _ _ _ 1 _
A4 _ _ _ _ 1
B4 _ _ _ _ 1
B2 _ _ _ _ 1
</code></pre>
<p>我发现,调整高突变率,保护前5名个体不受突变和死亡的影响,大大提高了结果</p>
<p>父母是通过随机抽取4个人,将他们的健康分数作为权重来选择,以选择更健康的父母。然后,将4个中的前4个中的任何一个与不具有相同适应度分数的其他任何一个进行匹配,以尝试防止近亲繁殖,并将种群多样性保持在一个良好的范围内</p>
<p>每次迭代,一个个体死亡,两个父代被选择并产生一个子代,并且以50%的速率通过随机交换其两行来选择和变异一个个体</p>
<p>我发现最好的群体是150个成员,1k到2k的迭代似乎得到了一致的结果</p>