initPopulation(POP, N)
for it in range(iter_N): # 遍历每一代
a, b = selection(N) # 随机选择两个个体
if np.random.random() < 0.65: # 以0.65的概率进行交叉结合
child1, child2 = crossover(POP[a], POP[b])
new = sorted([POP[a], POP[b], child1, child2], key=lambda ind: ind.fitness,
reverse=True) # 将父母亲和子代进行比较,保留最好的两个
POP[a], POP[b] = new[0], new[1]
if np.random.random() < 0.1: # 以0.1的概率进行变异
mutation(POP)
POP.sort(key=lambda ind: ind.fitness, reverse=True)
return POP
if name == ‘main’:
POP = implement()
def func(x):
return xnp.cos(5np.pi*x)+3.5
#return -(x * np.cos(5 * np.pi * x) + 3.5)
x = np.linspace(-1, 2.5, 100)
y = func(x)
scatter_x = np.array([ind.x for ind in POP])
scatter_y = np.array([ind.fitness for ind in POP])
best = sorted(POP, key=lambda POP: POP.fitness, reverse=True)[0] # 最佳点
print(‘best_x:’, best.x)
print(‘best_y:’, best.fitness)
plt.plot(x, y)
plt.scatter(best.x, best.fitness, c=‘g’, label=‘best point’)
plt.legend()
plt.show()
#结果==
#=(1)最大值==
best_x: 2.40537584441956
best_y: 5.896804913355371
#=(1)最小值==
best_x: 2.196313082366646
best_y: -1.3073691355607653
%opt_minmax=-1; %目标优化类型:1最大化、-1最小化
opt_minmax=1;
num_ppu=50; %种群规模:个体个数
num_gen=60; %最大遗传代数
len_ch=20; %基因长度
gap=0.9; %代沟
sub=-1; %变量取值下限
up=2.5; %变量取值上限
cd_gray=1; %是否选择格雷编码方式:1是0否
sc_log=0; %是否选择对数标度:1是0否
trace=zeros(num_gen,2); %遗传迭代性能跟踪器,生成60行2列0矩阵
fieldd=[len_ch;sub;up;1-cd_gray;sc_log;1;1]; %区域描述器
chrom=crtbp(num_ppu,len_ch); %初始化生成种群,生成一个50*20的矩阵,矩阵元素是0-1随机数
k_gen=0;%初始化遗传次数
x=bs2rv(chrom,fieldd); %翻译初始化种群为10进制
fun_v=fun_sigv(x); %计算目标函数值
tx=sub:.01:up;
plot(tx,fun_sigv(tx))
xlabel(‘x’)
ylabel(‘y’)
title(‘一元函数优化结果’)
hold on
while k_gen fit_v=ranking(-opt_minmax*fun_v); %计算目标函数的适应度 %ranking 函数为查询结果数据集分区中的每一行,并返回一个序列值