各位老铁们,大家好,今天由我来为大家分享探索目标优化智能算法:遗传算法应用与Python实现解析,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
基本步骤
编码
搜索前,GA首先将解空间的解数据表示为遗传空间的基因型串结构数据。这些字符串结构数据的不同组合构成了不同的点。
初始群体的生成
随机生成N个初始串结构数据,每个串结构数据称为一个个体,N个个体构成一个群体。 GA以这N个串结构数据为初始点开始演化。
适应度评估
适合度表示个人或解决方案的质量。不同的问题有不同的适应度函数定义。
选择
选择的目的是从当前种群中选择优秀个体,使他们有机会作为父母,为下一代繁衍后代。遗传算法通过选择过程体现了这一思想。选择的原则是适应度强的个体有很大的概率为下一代贡献一个或多个后代。选择体现了达尔文的优胜劣汰原则。
交叉
交叉操作是遗传算法中最重要的遗传操作。通过交叉操作可以得到新一代个体,它结合了其父代个体的特征。 Crossover体现了信息交换的思想。
变异
变异首先在种群中随机选择一个个体,并以一定的概率随机改变所选个体的字符串结构数据中某个字符串的值。与生物世界一样,遗传算法中发生突变的概率非常低,通常取很小的值。
实例详解
我在使用matlab之前实现过一次。由于又布置作业了,正好我现在对python还不是特别熟悉,所以就写个代码练习一下吧。
目标函数
最大f (x1, x2)=21.5 + x1·sin(4 pi x1) + x2·sin(20 pi x2)
s。 t。 -3.0=x1=12.1
4.1=x2=5.8def func(自身):
self.decoding(self.code_x1, self.code_x2)
self.y=21.5 + self.x1 * math.sin(4 * math.pi * self.x1) + self.x2 * math.sin(20 * math.pi * self.x2)
二进制编码
刚才提到的遗传算法,我们首先需要对数据进行编码,这里我们使用二进制编码。第一步,根据题目的介绍,我们可以知道该函数包含两个变量以及它们各自的域。在二进制编码中,我们首先需要计算它的编码长度。计算公式如下:
$${2^{{m_j} - 1}} ({b_j} - {a_j})*精度le {2^{{m_j}}} - 1$$
其中precision 为精度,比如小数点后5 位,则precision=10^5,mj 为编码长度,${x_j} in [{a_j},{b_j}]$
二进制解码
解码是编码:的逆过程
$${x_j}={a_j} + {rm{十进制}}(substrin{g_j}) times frac{{{b_j} - {a_j}}}{{{2^{{m_j}}} - 1}}$$
def解码(自身、code_x1、code_x2):
self.x1=self.bounds[0][0] + int(code_x1, 2) * (self.bounds[0][1] - self.bounds[0][0])/(
2 ** self.code_x1_length - 1)
self.x2=self.bounds[1][0] + int(code_x2, 2) * (self.bounds[1][1] - self.bounds[1][0])/(
2 ** self.code_x2_length - 1)
种群初始化
编码完成后,我们开始初始化种群。为了简单起见,我使用了随机方法来初始化。
def __init__(自身,边界,精度):
自身.x1=1
自身.x2=1
自身.y=0
self.code_x1=""
self.code_x2=""
self.bounds=边界
temp1=(边界[0][1] - 边界[0][0]) * 精度
self.code_x1_length=math.ceil(math.log(temp1, 2))
temp2=(边界[1][1] - 边界[1][0]) * 精度
self.code_x2_length=math.ceil(math.log(temp2, 2))
self.rand_init()
self.func()
def rand_init(self):
对于我在范围内(self.code_x1_length):
self.code_x1 +=str(random.randint(0, 1))
对于我在范围内(self.code_x2_length):
self.code_x2 +=str(random.randint(0, 1))
选择
选择我们使用轮盘赌的方式来选择。主要思想是,适应度高的人被选择的概率就高。
没有太多优化,使用了一堆for循环。 def选择(自我):
"""
轮盘选择
:返回:
"""
# 计算适应度函数
总和f=0
对于我在范围内(self.pop_size):
self.pop[i].func()
# 健身保证0
min=self.pop[0].y
对于我在范围内(self.pop_size):
if self.pop[i].y min:
min=self.pop[i].y
如果分钟0:
对于我在范围内(self.pop_size):
self.pop[i].y=self.pop[i].y + (-1) * 分钟
#轮盘赌
对于我在范围内(self.pop_size):
sum_f +=self.pop[i].y
p=[0] * self.pop_size
对于我在范围内(self.pop_size):
p[i]=self.pop[i].y/sum_f
q=[0] * self.pop_size
q[0]=0
对于我在范围内(self.pop_size):
s=0
对于范围(0, i+1): 内的j
s +=p[j]
q[i]=s
#startroulette
v=[]
对于我在范围内(self.pop_size):
r=random.random()
如果rq[0]:
v.append(self.pop[0])
对于范围内的j(1,self.pop_size):
如果q[j - 1] r=q[j]:
v.append(self.pop[j])
self.pop=v
变异
这里对于突变,我们首先根据突变概率从群体中选择一个,然后随机选择一个突变位点让选中的个体进行突变。
def突变(自身):
"""
突变
:返回:
"""
对于我在范围内(self.pop_size):
如果self.pm random.random():
弹出=self.pop[i]
#选择突变索引
index1=random.randint(0, pop.code_x1_length-1)
index2=random.randint(0, pop.code_x2_length-1)
i=pop.code_x1[索引1]
i=self.__inverse(i)
pop.code_x1=pop.code_x1[:index1] + i + pop.code_x1[index1+1:]
i=pop.code_x2[索引2]
i=self.__inverse(i)
pop.code_x2=pop.code_x2[:index2] + i + pop.code_x2[index2+1:]
交叉
这里采用单点交叉法。从群体中随机选择两个个体,然后随机选择一个交点并交换位置。看图=。=
def 交叉(自):
"""
叉
:返回:
"""
对于我在范围内(int(self.pop_size/2)):
如果self.pc random.random():
# 随机选择pops中的2条染色体
我=0
j=0
而我==j:
i=random.randint(0, self.pop_size-1)
j=random.randint(0, self.pop_size-1)
pop_i=self.pop[i]
pop_j=self.pop[j]
# 选择交叉索引
pop_1=random.randint(0, pop_i.code_x1_length - 1)
pop_2=random.randint(0, pop_i.code_x2_length - 1)
# 获取新代码
new_pop_i_code1=pop_i.code_x1[0: pop_1] + pop_j.code_x1[pop_1: pop_i.code_x1_length]
new_pop_i_code2=pop_i.code_x2[0: pop_2] + pop_j.code_x2[pop_2: pop_i.code_x2_length]
new_pop_j_code1=pop_j.code_x1[0: pop_1] + pop_i.code_x1[pop_1: pop_i.code_x1_length]
new_pop_j_code2=pop_j.code_x2[0: pop_2] + pop_i.code_x2[pop_2: pop_i.code_x2_length]
pop_i.code_x1=new_pop_i_code1
pop_i.code_x2=new_pop_i_code2
pop_j.code_x1=new_pop_j_code1
pop_j.code_x2=new_pop_j_code2
算法主流程
至此,继承的主框架已经完成。主要流程和绘图部分代码如下所示。
def ga(自我):
"""
算法主要函数
:返回:
"""
self.init_pop()
最佳=self.find_best()
self.g_best=copy.deepcopy(最好)
y=[0] * self.pop_size
对于我在范围内(self.max_gen):
self.cross()
自我突变()
self.select()
最佳=self.find_best()
self.bests[i]=最佳
if self.g_best.y best.y:
self.g_best=copy.deepcopy(最好)
y[i]=self.g_best.y
打印(self.g_best.y)
#plt
plt.图(1)
x=范围(self.pop_size)
plt.plot(x, y)
plt.ylabel("世代")
plt.xlabel("函数值")
plt.show()
实验结果图
总结
编码时偷懒,将x1和x2两个变量分开,导致后续操作极其复杂,不利于代码复用。结构。
该程序使用了太多的for循环并且没有对其进行优化。
针对以上两个问题,我记录在这里。
程序完整代码
遗传算法
好了,文章到此结束,希望可以帮助到大家。
【探索目标优化智能算法:遗传算法应用与Python实现解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我想看看这篇文章具体介绍哪些类型的目标优化问题适合使用遗传算法解决。
有6位网友表示赞同!
学习一下Genetic Algorithm编程,一直想深入研究一下人工智能领域的学习。
有13位网友表示赞同!
期待看到这个Python代码的实现案例!
有8位网友表示赞同!
遗传算法是不是特别适合处理离散型优化问题呢?
有7位网友表示赞同!
这篇文章会讲解如何设置遗传算法的参数吗?
有10位网友表示赞同!
有没有什么开源工具可以帮助我们更好地理解和使用遗传算法?
有20位网友表示赞同!
现在有很多机器学习算法都可以用Python实现,遗传算法也是必不可少的。
有7位网友表示赞同!
感觉遗传算法这个名字很有意思,是不是真的像自然界里的基因一样呢?
有18位网友表示赞同!
一直想了解一下智能算法和目标优化的关系,这篇文章正好合适!
有15位网友表示赞同!
Python实现遗传算法,能解决哪些实际应用问题呢?
有5位网友表示赞同!
我之前接触过一些用遗传算法解决搜索问题的例子,很酷炫!
有9位网友表示赞同!
遗传算法算是一个比较古老的算法,它的优点是什么呢?
有15位网友表示赞同!
看了标题就想找相关的书籍好好学习一下 genetic algorithm!
有5位网友表示赞同!
人工智能领域的发展越来越快,遗传算法作为基础算法必不可少。
有8位网友表示赞同!
除了Python,还有什么其他的语言可以用來实现遗传算法?
有12位网友表示赞同!
这篇文章会不会讲到遗传算法的局限性?
有12位网友表示赞同!
我想知道遗传算法如何与其他的智能算法结合使用呢?
有18位网友表示赞同!
学习人工智能离不开算法,特别是目标优化算法。
有10位网友表示赞同!
希望这篇文章能深入浅出地讲解遗传算法。
有13位网友表示赞同!
想要了解一下遗传算法的历史发展和未来的趋势!
有15位网友表示赞同!