使用Python解决遗传算法GA经典问题-设施集合覆盖问题

解决思路

数据处理

使用Python解决遗传算法GA经典问题-设施集合覆盖问题_第1张图片从数据集中可以看到,所有的数据是关于主对角线的对称矩阵。大小为58*58。

问题分析

  • 例如:A ——> B的时间是15min,同理 B ——> A的时间也是15min。那么意思就是说,只要在A或者B城镇中建立一个15min的设施就能满足需求,而不是A和B都需要建造。
  • 每个城镇只需要建立一个设施,让该设施能满足去其他城镇。因此设施的总数是58。(如果不存在被孤立的城镇)
  • 通过迭代,找到尽可能花销少的方案。例如可以用15min的设施,绝不用20min的设施。

数据处理

  • 通过问题分析第一条。那么其实可以将图表中半的数据删除掉。上三角矩阵和下三角矩阵表达的意思其实是一样的。这里我是将重复的数据设为0。
  • 主对角线的元素由于等于2,这里也设为0。至于为什么,会放到后面讲。

我的思路

答题思路

  1. 初始化20个样本作为父类。种群矩阵大小:20*58*58
  2. 对父类矩阵进行打乱。使得其中所有样本的矩阵不是上三角矩阵或者下三角矩阵。种群矩阵大小:20*58*58
  3. 父类两两之间进行杂交,杂交比例也是随机的,杂交方式为矩阵裁剪拼接。将父母两个样本进行随机同比例裁剪,然后进行拼接。生成两个后代,并对两个后代进行合理性检查。合理性检查会放在下面单独讲。将生成的后代与父类放一起。种群矩阵大小:40*58*58
  4. 通过损失函数,对种群里所有的样本进行排序,保留前20个样本作为新一代种群。同时输出最优和最差样本的损失值。种群矩阵大小:20*58*58
  5. 如果最优损失值和最差损失值大小相等,则进行变异。变异也放在下面单独讲。种群矩阵大小:20*58*58
  6. 重复3,4,5进行迭代。

合理性检查

合理性检查指的是样本矩阵(size: 58*58)内不能同时在主对角线对策的位置同时出现数据。

例如:样本A[ i, j ]和 A[ j, i ]就是关于主对角线对应的。因为表达的意思都是城镇 i 到城镇 j 的时间,根据上文问题分析的第一条就能得到这个结论。因此如果A[ i, j ]和 A[ j, i ]都出现数据。那么需要随机删掉一个。

变异

我的变异比例是20%,将种群内所有的样本进行变异。

通过将样本矩阵(size:58*58)内的关于主对角线上对称的非0数据进行交换。

例如:样本A[ i, j ]和 A[ j, i ]就是关于主对角线对应的。此时交换A[ i, j ]和 A[ j, i ]的值,因为表达的意思不变,所以是可行的。

执行效果

500epoch

使用Python解决遗传算法GA经典问题-设施集合覆盖问题_第2张图片使用Python解决遗传算法GA经典问题-设施集合覆盖问题_第3张图片

 2000epoch

使用Python解决遗传算法GA经典问题-设施集合覆盖问题_第4张图片使用Python解决遗传算法GA经典问题-设施集合覆盖问题_第5张图片

 分析

其实每一次运行,结果数据都不同,不过大致都是趋于这个输出结果。这里随机运行了两次,可能存在一定偏差。

虽然从结果来看,2000次迭代的数据损失值比500次的高。但是从设施布置情况500次的可能会更加合适点。这里我就想到了是损失函数的问题。

我的损失函数的定义(对于单个样本):

       使用Python解决遗传算法GA经典问题-设施集合覆盖问题_第6张图片

从损失函数,可以看到使用的方法就是方差。其实我的初衷是想让矩阵每一行的数据都近似相等。

但是这会导致另外一个问题,如果某一行只有一个数据,那么方差就为0,但是可能并不满足最优解,因此在迭代次数多了之后,这种趋势越发明显,导致过拟合。

主对角线元素为什么设为0?

上面谈到了将数据集主对角线的数据设置为0,因为主对角线的元素会影响损失函数,并且是毫无意义的。那么在最后得到的结果输出的excel中其实可以观测到很多行的最大值为0,其实最大值是2也就是本身。那么设置5min的设施就能满足要求。

你可能感兴趣的:(矩阵,线性代数)