遗传算法的应用实例python实现,人工智能遗传算法例题
本文主要为大家介绍python人工智能遗传算法实例分析。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010一、实验目的二。实验原则三。实验条件四。实验内容五、实验结果
目录
熟悉遗传算法的原理、过程和编码策略,运用遗传算法解决函数优化问题,了解求解过程,检验主要参数对结果的影响。
一、实验目的
遗传算法的基本思想是基于模仿生物遗传学的遗传过程。它用基因表示问题的参数,用染色体(计算机中用二进制代码表示)表示问题的解,从而得到一组染色体不同的个体。这个群体在特定问题的环境中生存和竞争,适者生存的机会最大,是由个体组成的群体。后代随机继承了亲代的最佳特征,也在生活环境的控制下延续了这一过程。种群的染色体会逐渐适应环境,不断进化,最终收敛到一个最适应环境的相似个体家族,即得到问题的最优解。
二、实验原理
蟒蛇3,蟒蛇3,皮查姆
三、实验条件
将matplotlib.pyplot作为plt导入
随机导入
导入数学
#计算功能
def f(参数):
返回f2(参数)
定义f1(参数):
return(3-(math . sin(2 * args[0]))* 2-(math . sin(2 * args[1]))* 2)
定义f2(参数):
x=1
对于范围内的I(len(args)):
z=0
对于范围(5):内的j
z=(j 1)* math . cos((j 1)1)* args[I](j 1))
x *=z
返回x
#自适应功能
定义s(x):
返回s2(x)
定义s1(x):
return math.exp(-abs(x-1))
定义s2(x):
return math.exp(-abs(x 187))
#计算二进制序列表示的值
解码并计算值。
群体染色体
染色体长度
最大值、最小值上限和下限
Div分界点
def b2d(b,chrom_length,max_value,min_value,div):
rwno=[]
#因为染色体中有多个变量,所以需要div来划分。
对于范围内的I(len(div)):
如果i==0:
星号=0
end=div[i]
else:
star=div[i-1] 1
end=div[i]
t=0
对于在范围内(星形,结束): #分离参数[1,2,34,5,6]
t=b[j] * (math.pow(2,j - star))
t=t * max_value/(math.pow(2,end - star 1) - 1) - min_value
rwno .追加(t)
返回rwno #这是一个列表
计算当前函数值。
群体染色体
染色体长度
最大值、最小值最大值和最小值
Divid分割
def calobjValue(group,chrom_length,max_value,min_value,divid):
obj_value=[]
对于范围内的I(透镜(组)):
X=b2d (group [I],chrom _ length,max _ value,min _ value,divid) #这个里面可能有多个变量。
obj_value.append(f(x))
返回对象值
#获取健身值
定义校准值(对象值):
fit_value=[]
因为我我
n range(len(obj_value)):
temp = s(obj_value[i]) # 调用适应函数计算
fit_value.append(temp)
return fit_value
#累计适应值方便计算平均
def sum_fit(fit_value):
total = 0
for i in range(len(fit_value)):
total += fit_value[i]
return total
# 转轮盘选择法
def selection(group, fit_value):
newfit_value = [] #[ [[染色体], [锚点]],... ]
newgroup = [] #[ [父], [母], [父], [母],....]
# 适应度总和
total_fit = sum_fit(fit_value)
# 设置各个的锚点
t = 0
for i in range(len(group)):
t += fit_value[i]/total_fit
newfit_value.append([group[i], t])
# 转轮盘选择法
for i in range(len(newfit_value)):
parents = len(newfit_value) # 初始化指针
r = random.random() #指针
for j in range(len(newfit_value)):#看看指针指到睡了
if newfit_value[j][1] > r:
parents = j
break
newgroup.append(newfit_value[parents][0])
return newgroup
# 交配
def crossover(group, fit_value, pc):
parents_group = selection(group, fit_value) #[ [[父], [母]],....]
group_len = len(parents_group)
for i in range(0, group_len, 2):
if(random.random() < pc): # 看看是否要交配
cpoint = random.randint(0, len(parents_group[0])) # 随机交叉点
temp1 = []
temp2 = []
temp1.extend(parents_group[i][0:cpoint])
temp1.extend(parents_group[i+1][cpoint:len(parents_group[i])])
temp2.extend(parents_group[i+1][0:cpoint])
temp2.extend(parents_group[i][cpoint:len(parents_group[i])])
group[i] = temp1
group[i+1] = temp2
# 基因突变
def mutation(group, pm):
px = len(group)
py = len(group[0])
for i in range(px): # 遍历
if(random.random() < pm):
mpoint = random.randint(0, py-1) # 取要变异哪个
if(group[i][mpoint] == 1):
group[i][mpoint] = 0
else:
group[i][mpoint] = 1
找出最优解和最优解的基因编码
group 种群染色去
fit_value 种群适应
def best(group, fit_value):
px = len(group)
best_in = group[0]
best_fit = fit_value[0]
for i in range(1, px):
if(fit_value[i] > best_fit):
best_fit = fit_value[i]
best_in = group[i]
#print(best_in)
return [best_in, best_fit]
创建初代种群
group_size 种群大小
chrom_length 染色体长度
def getFisrtGroup(group_size, chrom_length):
#print(初代种群:)
group = []
for i in range(group_size):
temp = []
for j in range(chrom_length):
temp.append(random.randint(0, 1))
group.append(temp)
#print(group)
return group
generation = 50 # 繁衍代数(数量越小,出结果脍,迭代次数越少)
group_size = 400 # 染色体数量,偶数
max_value = 20 # 范围
min_value = 10 # 偏移修正
chrom_length = 800 # 染色体长度
divid = [399, chrom_length-1] # 输入值分界点, 最后一位必须是染色体长度
pc = 0.7 # 交配概率
pm = 0.1 # 变异概率
results = [] # 存储每一代的最优解
fit_value = [] # 个体适应度
points = [] #多个最优解
#生成初代
group = getFisrtGroup(group_size, chrom_length)
for i in range(generation):
if i > 100:
pm = 0.01
if i > 1000:
pm = 0.001
obj_value = calobjValue(group, chrom_length, max_value, min_value, divid) # 个体评价
fit_value = calfitValue(obj_value) # 获取群体适应值
best_individual, best_fit = best(group, fit_value) # 返回最优基因, 最优适应值
xx = b2d(best_individual, chrom_length, max_value, min_value, divid)
if( abs(f(xx)+186.730909) < 0.000001):#找到最优解
flag = False
for p in points:
if( (abs(xx[0]-p[0]) < 0.1) and (abs(xx[1]-p[1]) < 0.1) ):#剔除重复解
flag = True
break
if flag == False:
print(xx)
points.append(xx)
results.append([i, best_fit, b2d(best_individual, chrom_length, max_value, min_value, divid), best_individual]) #加进坐标里
crossover(group, fit_value, pc) # 交配
mutation(group, pm) # 变异
#results.sort(key=lambda x:x[1])
rank = sorted(results, key=lambda x:x[1])
#print(\n, rank[-1])
#print(results)
x = b2d(rank[-1][3], chrom_length, max_value, min_value, divid)
#最终结果
print("f(x) = " , f(x) , "x = " , x , " 染色体 = ", rank[-1][3], " 适应值 = ", rank[-1][1], "代数:", rank[-1][0])
#输出适应图
X = []
Y = []
for i in range(generation):
X.append(i)
Y.append(results[i][1])
plt.plot(X, Y)
plt.show()
五、实验结果
以上就是python人工智能遗传算法示例解析的详细内容,更多关于python人工智能遗传算法的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。