遗传算法(Genetic Algorithm,GA)实现数据排序,python
Posted zhangphil
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遗传算法(Genetic Algorithm,GA)实现数据排序,python相关的知识,希望对你有一定的参考价值。
遗传算法(Genetic Algorithm,GA)实现数据排序,python
遗传算法是一种比较广泛、通用的算法体系,为了说明遗传算法的原理和实现,现在用GA解决一个计算机科学最基本、最古老的问题:排序问题。
需要特别说明的是,遗传算法虽然可以用来解决排序问题,但与熟知的排序算法(快排、选择排序、冒泡等等经典排序算法)相比较,遗传算法解决排序问题效率低、且不稳定(耗时)。用遗传算法排序,只是开拓了一个解决问题的思路,并演示、说明其运作原理。遗传算法的特点是利用强大的算力,不断试错,直至找出接近最佳解的最优解。
import random
import time
def get_fitness(genes):
fitness = 1
for i in range(1, len(genes)):
# 如果这里是 > ,则是逆序结果。
if genes[i] < genes[i - 1]:
fitness += 1
return fitness
def mutate(parent):
child = parent[:]
while True:
# 从0到N中随机选择两个数作为数组下标
idx1, idx2 = random.sample(list(range(len(child))), 2)
if child[idx1] < child[idx2]:
continue
else:
# 相当于交叉
child[idx1], child[idx2] = child[idx2], child[idx1]
break
return child
def sorted(data):
print("原始数据", data)
parent = data
seq = 0
start_time = (int(round(time.time() * 1000))) # 毫秒级时间戳
while True:
# print('第', seq, '轮', child)
child = mutate(parent)
fitness = get_fitness(child)
# 适应度1为进化目标
if fitness <= 1:
break
else:
# 进化到下一代
parent = child
seq = seq + 1
end_time = (int(round(time.time() * 1000))) # 毫秒级时间戳
print('总计', seq, '轮')
print('算法耗时', end_time - start_time, '毫秒')
print('排序结果', child)
if __name__ == '__main__':
data = [1, 2, 3, 4, 5, 6, 7, 8]
for i in range(10):
print('-----')
random.shuffle(data)
sorted(data)
代码运行输出:
-----
原始数据 [1, 5, 3, 7, 8, 6, 2, 4]
总计 9187 轮
算法耗时 47 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [8, 7, 3, 1, 6, 4, 5, 2]
总计 11847 轮
算法耗时 63 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [8, 6, 7, 1, 2, 4, 3, 5]
总计 127271 轮
算法耗时 627 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [1, 6, 8, 7, 5, 4, 3, 2]
总计 19282 轮
算法耗时 95 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [1, 3, 8, 5, 7, 4, 2, 6]
总计 200925 轮
算法耗时 1077 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [2, 6, 4, 7, 1, 3, 5, 8]
总计 18535 轮
算法耗时 95 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [8, 4, 3, 7, 5, 1, 2, 6]
总计 22467 轮
算法耗时 94 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [3, 8, 7, 5, 1, 6, 4, 2]
总计 71436 轮
算法耗时 377 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [5, 8, 2, 1, 3, 7, 4, 6]
总计 82190 轮
算法耗时 392 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
-----
原始数据 [2, 5, 4, 8, 3, 1, 6, 7]
总计 18916 轮
算法耗时 110 毫秒
排序结果 [1, 2, 3, 4, 5, 6, 7, 8]
把12345678这8个数字打乱顺序,排序,跑10轮。
遗传算法完成排序:
(1)在mutate函数里面对传递过来的亲代染色体进行“变异”。具体方法是随机选择数组长度范围内的两个下标,然后比较下标对应的两个值大小关系,如果第1个小于第2个,跳过;否则,交换这两个数值。
(2)在sorted函数里面,循环迭代的对亲代数组变异,因为进化的目标适应度是1,所以,当变异后的子代染色体适应度为1时候,退出循环,也即排序结束。若适应度不为1,那么将子代染色体放回亲代,继续变异,直到适应度为1。
以上是关于遗传算法(Genetic Algorithm,GA)实现数据排序,python的主要内容,如果未能解决你的问题,请参考以下文章
遗传算法(Genetic Algorithm,GA)实现数据排序,python
遗传算法(Genetic Algorithm,GA)的轮盘赌选择,python
遗传算法(Genetic Algorithm,GA)的轮盘赌选择,python
uniform crossover(均匀交叉),遗传算法(Genetic Algorithm,GA),python