遗传算法是不能保证找到最优解的,这个楼主你是知道的不?放到你的题目上就更难找了,因为你的每组解都有一个坐标上的互斥性.我都不确定结果能不能合理收敛,你暂且参考一下吧.
解题思路(假定n=10):我们要找10个数,假定所求的10个数分别是从M1到M10,那每个数的坐标就为(x1,y1) (x2,y2).(x10,y10),也就是我们最终是要找到10对x和y的组合.特别之处在于:一般的遗传算法是通过2组候选解之间的交叉生成下一代,但你的因为每一组解的坐标之间有互斥性,所以不能直接交叉,可以换一种方式:就是单个候选解之间的各个坐标的x y值进行交叉,这样可以保证各个坐标仍然是不同行不同列.但
遗传算法参数设置:候选解的数量h,至少100以上吧,理论上越大越容易得到更优的解,但计算量也变大,我们设h=10n也就是100个.你需要先随机生成100个候选解,即100组数,每组数有10个坐标(每个坐标是x和y两个值),且每组数的10个坐标相互之间互斥(即不存在任意两个坐标同行或同列)
分别计算100组候选解的适应度,并找出来适应度最高的一部分出来(就是每组对应10个数求和,值越小适应度越高),比例为1/p,比如p=2也就是找50个 (一般不超过一半,当然也是越多越精确,但你要考虑计算量不要过大)对于选出来的50个解,每一个解随机选择z个坐标,再随机交换它们的x坐标或y坐标(只能交换x或者交换y,两个都换就等于没交换了).我会选z=4,这里注意不要太大,选2或4就行,太大了结果不容易收敛.仍然是由于坐标之间的互斥性,这个问题求解过程中,不需要考虑基因突变了.对于交叉完成的50个解,再次挑选适应度最高的1/p出来,然后再回到步骤3,一直循环下去.
大概就是这意思吧,你需要设置的主要基本参数就是:候选解的数量h:范围是n*n到n!之间,不考虑效率和计算量的话h越大越好.根据适应度选择比例1/p:范围是0.1到1之间,仍然是越大越好.随机交叉的坐标数量z:可以选2或者4,太大不好.
最后强调:算法实现不难,但我不确定这个问题能不能用遗传算法找到局部最优解,因为即使是适应度高的候选解,交叉后的结果有较大可能反而不会收敛.最根本的问题就是坐标之间的互斥性.你了解算法之后可以考虑进一步改进来处理这个问题.