最近学习了人工智能这门课,就尝试着编写了一个小程序;
话不多说直接上(具体原理就自行百度吧)
例:求一元函数的最大值 其中
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 03 16:22:15 2021
@author: Overcoming
"""
'''求一元函数的最大值
f (x) = xsin(10 x) + 2.0 x[−1,2]
'''
import random
from math import *
import matplotlib.pyplot as plt
#没写精英解保持容易陷入局部最优? 和种群数量有关系
N = 200
Pcross = 0.75
Pchange = 0.05
def ori (N):
#产生初始种群
X = []
JY1 = []
#JY2 = []
i = 0
while i>d&1 for d in range(22)][::-1] #22位数以列表存储
#JY2.append(jy2)
x = (-1.0 + x*(2-(-1))/(2**22 - 1)) #原始坐标上对应的x取值
X.append(x)
i+=1
return X,JY1
def Y_v(X):
#计算个体适应度
Y = []
for i in range (0,len(X)):
y = X[i]*sin(10*pi * X[i]) + 2.0 #适应度
Y.append(y)
return Y
def cross(JY1,X,N):
#单点交叉产生下一代
while len(JY1)< 2*N:
p = random.uniform(0,1) # 随机产生概率
if p d&1 for d in range(22)][::-1] #22位数以列表存储
JY2[k] = -JY2[k]+1 #该点突变
jy2 = [str(i) for i in JY2]
JY1[k] = ''.join(jy2)
x = int(JY1[k],2)
X[k] = (-1.0 + x*(2-(-1))/(2**22 - 1)) #算出对应值。
return X,JY1
def P (Y):
# 计算个体被挑选概率
N = len(Y)
PS = []
PC = []
for i in range(0,N):
ps = (Y[i]/sum(Y)) # 被选取概率
PS.append(ps)
pc = sum(PS[:i]) + ps #累计概率
PC.append(pc)
return PS,PC
def sel (PC,N):
#轮盘赌挑选新个体
l =[]
k = len(l)
while k < N:
i = random.uniform(0,1)
for j in range(0,len(PC)):
if PC[j]>= i :
l.append(j)
break #没加break要命。。。
k = len(l)
return l
def diedai(X,JY1,N):
T =[]
Y_m = []
Y_av = []
X_m = []
m = 0
while m |