遗传算法作为一种基础的优化算法广泛应用于各种优化计算中。在这里列出一个简单的遗传算法程序,计算Σx^2的极小值点。
1、基本参数设置
x_range = 10
genuine = 100
genuine_cross = 0.1
genuine_change = 0.01
epoch = 500
x_max = 20
x_min = -20
计算x12+x22+……+x102的计算结果,x共计十组,样本100个,交叉概率10%,变异概率1%,x范围为[-20,20],计算500步。
2、适应度函数
sum(x ** 2)
返回所有输入的平方和
3、创建初始数据
son_population = numpy.zeros(shape=(x_range, genuine))
population = numpy.random.rand(x_range, genuine)\
* (x_max - x_min) + x_min
father_genuine_value = []
for i in range(genuine):
father_genuine_value.append(function(population[:, i]))
pass
father_genuine_value = numpy.reshape(father_genuine_value, newshape=(len(father_genuine_value)))
first_genuine_sort = numpy.sort(father_genuine_value, axis=0)
first_genuine_index = numpy.argsort(father_genuine_value, axis=0)
father_value = population[:, first_genuine_index]
4、交叉
emper = father_value[:, 1]
crosspoint_number = numpy.round(genuine * genuine_cross)
crosspoint = numpy.random.randint(1, x_range, size=(int(crosspoint_number)\
, int(genuine / 2)))
son_population[:, :] = numpy.reshape(father_value, newshape=(10, -1))
for i in range(int(genuine / 2)):
son_population[:, 2 * i - 1] = emper
son_population[:, 2 * i] = father_value[:, 2 * i]
for j in range(int(crosspoint_number)):
son_population[int(crosspoint[j, i]),