遗传算法解决背包问题
遗传算法可以认为是一种启发式算法,根据达尔文的进化学说中“优胜劣汰”、“适者生存”的观点来解决一些实际生活中难以解决的问题。其实简单来说,遗传算法所做的事情就是“随机”生成一些可行解(不是最优解),然后随机一段时间之后找到局部最优解。但是这个“随机”的过程模拟了自然界中的进化规律,也是“更优解”更容易生存,“更优解”与“更优解”的结合能够生成“更更优解”。不断重复这个结合的过程,最终可以得到局部最优解,甚至可能是全局最优解。
算法具体描述可见:
一文读懂遗传算法工作原理
如何理解遗传算法
在此我给出有遗传算法求解背包问题的思路。
问题描述
为了简单起见,我此处只介绍01背包问题。当然其实01背包问题用动态规划很容易就能实现。但遗传算法的意义却绝不是动态规划可以代替的。动态规划只能解决一些一定有明确解的问题,但事实上现在主流问题很少是有明确解的,大多数都是优化问题,也就是只能寻找局部最优解,并认为局部最优解已经足够好了。
import random
import copy
import codecs
class Genetic_alg:
def __init__(self, weights, support_points, threshold):
self.weights = weights
self.support_points = support_points
self.threshold = threshold
self.size = len(weights)
self.populations = []
def construct_populations(self, times):
local_populations = []
local_populations.append([0 for i in range(self.size)])
for k in range(times):
chromos