# coding=utf-8 ''' 贪心算法:局部最优解。 动态规划算法:多目标、多阶段优化。 穷举算法:万能,受问题规模限制。 遗传算法:只是比漫无目的的穷举搜索算法聪明一点点,通过较小的计算量获得较大的收益。 只要能用解析的方法直接得到的最优解问题,都不要试图用遗传算法。 适合-非线性问题。人工智能、自适应控制、机器学习等领域。 不依赖目标函数。 基于概率论,而不是一个确定的搜索过程,即每一次启发式搜索,可能会得出不同的最优解。 可能得到局部最优解或近似最优解。 迭代流程: 初始化种群 种群N代 个体评价 选择 交叉 变异 种群N+1代 1-编码方式:二进制编码(汉明距离)、格雷编码、符号编码、属性序列编码。 2-适应度评估函数(关键点): 固定的问题:运算初期早熟问题(未成熟收敛局部最优解),运算后期竞争区分度不高问题(等概率平均搜索) 自适应的改进:尺度变换:线性、乘方、指数。 种群大小M:32 交叉概率PC:0.8 变异概率PM:0.15 进化代数T:500 用遗传算法解决0-1背包问题。 1-问题的解收敛了,但没有收敛到最优解 - 通过将最优解与实际结果比较,也可以循环100次,取价值最大的解。 2-self.total_fitness = 1 # 每次计算时,先将总数置0,在循环中,会产生全0的现象 - envaluateFitness中加入防护,如果某个种群全零,则对其进行调整。 3-本例中,循环执行遗传算法24次,得到全局最优解,且结果收敛。 ''' import os import random from copy import deepcopy class GAType(): # 种群32个 def __init__(self, obj_count): self.gene = [0 for x in range(0, obj_count, 1)] # 序列编码 0 / 1 self.fitness = 0 # 适应度 self.cho_feq = 0 # choose 选择概率 self.cum_feq = 0 # cumulative 累积概率 class genetic(): def __init__(self, value, weight, max_weight): self.value = value self.weight = weight self.max_weight = max_weight self.obj_count = len(weight) self._gatype = [GAType(self.obj_count) for x in range(0, population_size, 1)] # 初始化32个种群 self.total_fitness = 0 def avoid_zero(self): '''防止遗传的下一代为全零,若为全零,则将随机的位数(1-7)置1'''