'''
遗传算法拟合数字图像
'''
from PIL import Image
import numpy as np
##计算适应度=-方差
def CalcFitness(genes, target):
s = np.square(genes.astype(np.int32) - target.astype(np.int32)).sum(axis=-1).sum(axis=-1)
#print('适应度', -s)
index = np.argsort(s) # 适应度排序的序号数组
#print(index)
return -s, index
# 选择
# 保留适应度最高的fiti[0]
def selection(fiti):
'''
联赛选择
:param fiti: 适应度排序的序号数组
:return: 选中的序号
'''
def s1(n, m=2):
'''
从n个选择一个,m选择压,返回选择的序号
'''
return np.random.randint(0, n, m).min()
s = np.size(fiti)
r = np.empty_like(fiti)
for i in range(s):
ri = fiti[s1(s)]
r[i] = ri
#print('选择', r)
return r
def AcrChrom(PG, sel):
'''
交叉
:param PG:
:param sel:
:return:
'''
def acr(c1, c2, v1, v2):
# 交叉
# 0.9概率
# 返回深复制
(x, y) = c1.shape
ra=np.random.rand()
if ra < 0.3:
x1 = np.random.randint(0, x)
x2 = np.random.randint(0, x)
if x1 > x2:
x1, x2 = x2, x1
v1[:x1, :] = c2[:x1, :]
v1[x1:x2, :] = c1[x1:x2, :]
v1[x2:, :] = c2[x2:, :]
v2[:x1, :] = c1[:x1, :]
v2[x1:x2, :] = c2[x1:x2, :]
v2[x2:, :] = c1[x2:, :]
elif 0.3<ra<0.6:
x1 = np.random.randint(0, y)
x2 = np.random.randint(0, y)
if x1 > x2:
x1, x2 = x2, x1
v1[:, :x1] = c2[:, :x1]
v1[:, x1:x2] = c1[:, x1:x2]
v1[:, x2:] = c2[:, x2:]
v2[:, :x1] = c1[:, :x1]
v2[:, x1:x2] = c2[:, x1:x2]
v2[:, x2:] = c1[:, x2:]
elif 0.6<ra<0.9:
x1 = np.random.randint(0, x)
x2 = np.random.randint(0, x)
if x1 > x2:
x1, x2 = x2, x1
y1 = np.random.randint(0, y)
y2 = np.random.randint(0, y)
v1 = c1
v2 = c2
v1[x1:x2,y1:y2]=c2[x1:x2,y1:y2]
v2[x1:x2, y1:y2] = c1[x1:x2, y1:y2]
else:
v1 = c1
v2 = c2
s = np.size(sel)
PG2 = np.empty_like(PG)
i = 2
while i < s:
acr(PG[sel[i]], PG[sel[i+1]], PG2[i], PG2[i + 1])
i += 2
return PG2
def mutation(PG,p):#p为变异率
n, a, b = PG.shape
n=n-2
m=n*a*b
mu = m*p
sigma = mu*(1-p)
ra= sigma * np.random.randn() + mu
ra=int(ra)
# print(ra)
if ra<=0 :
ra=1
elif ra>=m:
ra=m
for i in range(ra):
PG[np.random.randint(2, n+2)][np.random.randint(0, a)][np.random.randint(0, b)] = np.random.randint(0, 256)
return ra
####
G = 0
FES = 0
N = 100 # 每代个体数 偶数
Gmax = 10000 # 最大迭代次数
rate=0.05 #初始变异率
##读取图像
im = np.array(Image.open('0_0.bmp'))
# 随机初始化
(a, b) = im.shape
shape3d = (N, a, b)
PG = np.random.randint(0, 256, shape3d, dtype=im.dtype)
rate0=rate
fitn = []
for i in range(Gmax+1):
fitG, fiti = CalcFitness(PG, im)
bestfit = PG[fiti[0]].copy()
u = (np.mean(fitG), fitG[fiti[0]])
# fitn.append(u)
sel = selection(fiti)
PG = AcrChrom(PG, sel)
ra= mutation(PG,rate)
# rate= (1 - (1.0 * i / Gmax)) * rate0
# rate = (1 - (1.0 * i / Gmax))**2 * rate0
rate = (1 - (10.0 / Gmax)) * rate
PG[0]=bestfit
PG[1] = bestfit
if i % 50 == 0 :
print('代数 ', i, '变异数', ra, '适应度(平均,最高)', u)
img=Image.fromarray(bestfit)
img.save('./png/0_{}.png'.format(i))
print('结束')
#print('适应度变化', fitn)
Matlab仿真实验室
- 粉丝: 4w+
- 资源: 2444
最新资源
- 基于C++和Qt的火车票预订管理系统源码+项目文档资料+设计报告(课程设计).zip
- 课程设计基于机器学习的Ames房价分析与预测算法(含源码、说明与数据集).zip
- 导航系统-C++设计实现地图导航系统-(全新源码+设计报告及资料).zip
- 北京邮电大学数字逻辑与数字系统课程设计项目成果源码+设计报告.zip
- 英特尔杯全国大学生软件创新大赛项目-(含全部参赛源码及资料).zip
- 基于机器学习的动态车牌识别算法(高分课程设计,含源码与说明).zip
- A095-基于Java的商业辅助决策系统
- 课设基于SpringBoot+SSM+MySQL的智慧校园综合管理系统源码+设计报告.zip
- 机器学习大作业基于深度学习的视频行为分析项目源码及功能说明.zip
- 基于知识图谱的医疗问答系统前端展示 Demo 及后端源码(含说明).zip
- 基于Springboot+vue+mybatisplus+mysql的Tom在线影院票务系统(报告).zip
- 基于深度学习的图片分类项目源代码及技术解析(深度学习作业).zip
- 校园二手书城(微信小程序&APP)毕业设计项目(uniapp&vue2前端).zip
- 基于Java+Springboot+Vue的医院预约挂号小程序系统(前后端分离).zip
- 探地雷达图像处理项目(病害提取与甄别等功能,含源码与说明).zip
- 多功能文本标注工具(支持实体、分类、关系标注,含多种规则).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈