版权声明:本文为博主原创文章,未经博主允许不得转载。
遗传算法(Genetic Algorithms)也是受自然科学的启发。该类算法的运行过程是先随机生成一组解,称之为种群(population)。在优化过程中的每一步,算法会计算整个种群的成本函数,从而得到一个有关题解的有序列表。
其三个主要特性在于:
selection,crossover,mutation在对题解进行排序之后,一个新的种群——我们称之为下一代——被创建出来了。首先,我们将当前种群中位于最顶端的题解加入其所在的新种群中。我们称这一过程为精英选拔(elitism)。新种群的余下部分是由修改最优解后形成的全新解所组成的。
有两种修改题解的方法。
(1)较为简单的一种称为变异(mutation),其通常的做法是对一个既有解进行微小的、简单的、随机的改变。
(2)另一种方法称为交叉(crossover)或配对(breeding)。这种方法是选取最优解中的两个解,然后将它们按照方式结合。
算法设计中可能涉及的参数主要有,
(1)popsize:种群大小(2)mutPRob:种群的新成员由变异而非交叉得来的概率(3)elite:种群中被认为是最优解且被允许传递到下一代的比例(4)maxiter:需要运行多少代遗传算法的程序还是比较好写的,因为流程非常固定;
def geneticalgo(domains, costf, popsize=100, mutprob=.2, elite=.2, maxiter=100): def mutable(c): i = random.randint(0, len(domains)-1) if random.random() < 0.5 and c[i] > domains[i][0]: c[i] -= 1 elif c[i] < domains[i][1]: c[i] += 1 return c def crossover(r1, r2): i = random.randint(1, len(domains)-2) return r1[:i] + r2[i:] pop = [] for i in range(popsize): r = [random.randint(domains[i][0], domains[i][1]) for i range(len(domains))] pop.append(r) topelite = int(popsize*elite) for i in range(maxiter): scores = [(costf(r), r) for r in pop] scores.sort() randked = [v for c, v in scores] pop = ranked[:topelite] while (len(pop) < popsize): if random.random() < mutprob: r = random.randint(0, topelite-1) pop.append(mutable(pop[r])) else: c1 = random.randint(0, topelite-1) c2 = random.randint(0, topelite-1) pop.append(crossover(pop[c1], pop[c2])) print(scores[0][1]) return scores[0][0]新闻热点
疑难解答