遗传算法之背包问题
题目引用:https://zhuanlan.zhihu.com/p/28328304
def gen(): #print(gen_grade([0, 1, 1, 0, 1, 1])) seeds = [[1,0,0,1,1,0], [0,0,1,1,1,0],[0,1,0,1,0,0],[0,1,1,0,0,1]] count_down = 1000 while count_down > 0: grade_table = [(seed,gen_grade(seed)) for seed in seeds] best = max(grade_table,key = lambda x:x[1]) print(best) # print(seeds) dad = survival(grade_table) mom = survival([(s,g) for s,g in grade_table if s != dad]) seeds = [dad, mom] + off_spring(dad, mom) +[best[0]] # print(seeds) count_down -= 1 def off_spring(dad, mom): bro, sis = dad[:3] + mom[3:],mom[:3] + dad[3:] #变异 r = random.randint(0,5) monster = bro.copy() # print(r, monster) monster[r] = 1 if monster[r] == 0 else 0 # print(monster) return [bro, sis, monster] def survival(grade_table): total = sum([g for s,g, in grade_table]) r = random.randint(0,total) total = 0 for seed, g in grade_table: total += g if r <= total: return seed print (r, grade_table) def gen_grade(chromosome): grade_table = [(15,15),(3,7),(2,10),(5,5),(9,8),(20,17)] grades = [grade_table[i] for i,x in enumerate(chromosome) if x > 0] if sum([w for w,s in grades]) > 30: return 0 return sum([s for w,s in grades])