从零开始实现遗传算法(用遗传算法破解密码)
来源:互联网 发布:软装搭配软件 编辑:程序博客网 时间:2024/06/09 19:15
声明:版权所有,转载请联系作者并注明出处: http://blog.csdn.net/u013719780?viewmode=contents
知乎专栏: https://www.zhihu.com/people/feng-xue-ye-gui-zi
本系列文章的所有源代码都将会开源,需要源代码的小伙伴可以去我的 Github fork!
上一篇文章我们动手实验了用遗传算法求解函数在给定区间的最大值。本篇文章再来看一个实验:用遗传算法破解密码。
在这个问题中,我们的个体就是一串字符串了,其目的就是找到一个与密码完全相同的字符串。基本步骤与前一篇文章基本类似,不过在本问题中,我们用字符的ASCII值来表示个体(字符串)的DNA。其它的就不多说了,还是看详细代码吧:
import numpy as npclass GeneticAlgorithm(object): """遗传算法. Parameters: ----------- cross_rate: float 交配的可能性大小. mutate_rate: float 基因突变的可能性大小. n_population: int 种群的大小. n_iterations: int 迭代次数. password: str 欲破解的密码. """ def __init__(self, cross_rate, mutation_rate, n_population, n_iterations, password): self.cross_rate = cross_rate self.mutate_rate = mutation_rate self.n_population = n_population self.n_iterations = n_iterations self.password = password # 要破解的密码 self.password_size = len(self.password) # 要破解密码的长度 self.password_ascii = np.fromstring(self.password, dtype=np.uint8) # 将password转换成ASCII self.ascii_bounder = [32, 126+1] # 初始化一个种群 def init_population(self): population = np.random.randint(low=self.ascii_bounder[0], high=self.ascii_bounder[1], size=(self.n_population, self.password_size)).astype(np.int8) return population # 将个体的DNA转换成ASCII def translateDNA(self, DNA): # convert to readable string return DNA.tostring().decode('ascii') # 计算种群中每个个体的适应度,适应度越高,说明该个体的基因越好 def fitness(self, population): match_num = (population == self.password_ascii).sum(axis=1) return match_num # 对种群按照其适应度进行采样,这样适应度高的个体就会以更高的概率被选择 def select(self, population): fitness = self.fitness(population) + 1e-4 # add a small amount to avoid all zero fitness idx = np.random.choice(np.arange(self.n_population), size=self.n_population, replace=True, p=fitness/fitness.sum()) return population[idx] # 进行交配 def create_child(self, parent, pop): if np.random.rand() < self.cross_rate: index = np.random.randint(0, self.n_population, size=1) # select another individual from pop cross_points = np.random.randint(0, 2, self.password_size).astype(np.bool) # choose crossover points parent[cross_points] = pop[index, cross_points] # mating and produce one child #child = parent return parent # 基因突变 def mutate_child(self, child): for point in range(self.password_size): if np.random.rand() < self.mutate_rate: child[point] = np.random.randint(*self.ascii_bounder) # choose a random ASCII index return child # 进化 def evolution(self): population = self.init_population() for i in range(self.n_iterations): fitness = self.fitness(population) best_person = population[np.argmax(fitness)] best_person_ascii = self.translateDNA(best_person) if i % 10 == 0: print(u'第%-4d次进化后, 基因最好的个体(与欲破解的密码最接近)是: \t %s'% (i, best_person_ascii)) if best_person_ascii == self.password: print(u'第%-4d次进化后, 找到了密码: \t %s'% (i, best_person_ascii)) break population = self.select(population) population_copy = population.copy() for parent in population: child = self.create_child(parent, population_copy) child = self.mutate_child(child) parent[:] = child population = populationdef main(): password = 'I love you!' # 要破解的密码 ga = GeneticAlgorithm(cross_rate=0.8, mutation_rate=0.01, n_population=300, n_iterations=500, password=password) ga.evolution()if __name__ == '__main__': main()
阅读全文
0 0
- 从零开始实现遗传算法(用遗传算法破解密码)
- 从零开始实现遗传算法(用遗传算法求解TSP)
- 从零开始实现遗传算法(用遗传算法求解函数的最大值)
- 遗传算法Python实现
- JAVA实现遗传算法
- C++遗传算法实现
- Matlab实现遗传算法
- 遗传算法java实现
- 遗传算法及其实现
- Java实现遗传算法
- 遗传算法Scala实现
- 遗传算法代码实现
- 遗传算法
- 遗传算法
- 遗传算法
- 遗传算法
- 遗传算法
- 遗传算法
- 快速排序 C语言描述
- angular4系列之国际化
- 登陆注册
- go-代码收集-net/http客户端长连接
- NEFU 1267 挑战字符串 (AC自动机+贪心)好题
- 从零开始实现遗传算法(用遗传算法破解密码)
- Apache Beam WordCount编程实战及源码解读
- windows安装scrapy时出现的问题
- PAT乙级1016. 部分A+B (15)
- ExpiringMap用法详解
- 算法设计思想入门
- 【操作系统】IO 缓冲技术
- JAVA程序员怎么样才能进一线互联网公司
- Docker架构