智科人之人工智能大实验四选一验优报告参考:基于遗传算法的函数极值求取
智科人工智能最后的大实验是四选一的:当然选择最简单的遗传算法。。。
不过BP手写数字识别也在机器学习的大课设那篇文章中有写,感兴趣也可以去学习。。。。
遗传算法的程序我放在资料区提供下载,具有动态绘图功能,验收时候老师应该会让你改函数,问你怎么求最小值(如果你一开始设置的是求最大值),只需要回答说把那个适应度函数改成原来求最大值时候的倒数,或者根据她问的其他问题:改成原来函数的负数等等。
至于why,自己想就知道了,如果求最大的那个点,我改倒数或者负数是不是反过来了。。。。。。
如果遗传算法选的人多,那么先验收的才有优,抓紧时间!
文件名:人工智能之遗传算法参考程序
文件内容参考:
动态绘制过程:(程序在资料区)
报告如下:
5.程序设计与实现、解析
代码的注释都是自己打上去的
max_loop = 200 # 最大迭代次数 100~500
tribe_number = 50 # 种群初始化数量 20~100
limit_left = -1 # 定义域左界限
limit_right = 1 # 定义域右界限
limit_bit = 15 # 编码位数
cross_probability = 0.9 # 交叉概率 0.4~0.99
variation_probability = 0.1 # 变异概率 0.0001~0.1
actions_probability = np.array([cross_probability, variation_probability])
解码方法(用了上文说的等差数列来决定每个元素)
def To_decode(num):x = num[:15] #0到14位y = num[15:]# 转为10进制整数x = int(str(x), 2) #后是二进制y = int(str(y), 2)# 转换为-1,1区间的小数d = fabs(limit_left - limit_right) / (2 ** limit_bit - 1)x = limit_left + d * xy = limit_left + d * yreturn x, y #返回x,y对应的(-1,1)区间小数
# 初始化一个二进制基因个体
def init_one(bit=30):s = ''for i in range(bit):s += str(random.randint(0, 1)) #随机0,1插入return s #返回一个30位的二进制串
# 初始化一个种群,第一代
def init_tribe(tribe_number): #参数tribe_number是种群个数tribe = []while len(set(tribe)) != tribe_number: #set集合筛选list当中不同的元素,set不能重复的,len返回集合元素个数,要参数这么多个tribe.append(init_one()) #把所有的添加这个tribe,成为['11','22']这种形式return tribe
tribe这个列表中存着第一个种群,一个个体(元素)三十位
def roulette_select_tribe(value, tribe):#用tribe列表的值value做参数'''''轮盘选择: 根据概率选择出个体, 返回选择后的种群这里优化了一个操作,就是始终会将 启发值最大的节点加入选择后的种群:param value: 传入参数: 代表每个个体被选择的概率:param tribe: 传入参数: 代表种群的信息 ['11','22']这种形式:return:'''new_tribe = []# 设置随机数种子np.random.seed(random.randint(1, 100) + random.randint(100, 10000000))index_list = [i for i in range(tribe_number)] #返回索引值,0到49for i in range(tribe_number): #添加五十次(个体总数)# 根据概率获取索引index = np.random.choice(index_list, p=value.ravel()) #p为概率,拉直value代表的列表,index对应的原value值大的更大可能被选中,选中的是index_list中的index(索引)new_tribe.append(tribe[index]) #不断添加选中的下标对应的值# 判断启发值最大的节点是否被加入li = list(value) #value变成列表max_index = li.index(max(li))if tribe[max_index] not in new_tribe:tmp_value = list(estimate(new_tribe))min_index = tmp_value.index(min(tmp_value))new_tribe[min_index] = tribe[max_index]return new_tribe
# 返回被选择的个体索引(下标)
def roulette_select_human(value, tribe): #选一个个体,主要看参数value代入的是哪个'''''轮盘选择: 根据概率选择出个体, 返回一个被选择的对象与其索引:param value: 传入参数: 代表每个个体被选择的概率:param tribe: 传入参数: 代表种群的信息'''np.random.seed(random.randint(1, 100) + random.randint(100, 10000000))index_list = [i for i in range(tribe_number)] #索引列表index = np.random.choice(index_list, p=value.ravel()) #ravel扁平化拉数组为一维return tribe[index], index #只选择了一次
# 评估每个个体被选择的概率
def estimate(tribe):'''''返回一个 numpy.array类型的 概率数组,代表了tribe中每一个个体被选中的概率'''start_value = []for human in tribe: #定义一个human代表tribe中的每个原二进制码x, y = To_decode(human) #return x,y代表的定义域内的小数过来human_value = 1+x*sin(pi*y) +y*sin(pi*x)start_value.append(human_value if human_value > 0 else 0) #大于0的赋进来,否则赋个0# 将列表中的每个value转换为相应的概率result_value = [i / sum(start_value) for i in start_value]return np.array(result_value) #概率数组
交叉操作
if type == '交叉':# 初始化需要的参数value = estimate(tribe)cross_tmp = [] #记忆位点的列表,不能重复从该位点交叉# 随机选择父母节点father, father_index = roulette_select_human(value, tribe)mother, mother_index = roulette_select_human(value, tribe)# 随机确定 交叉点cross_location = random.randint(0, 29) #30位中随便找个交叉位点cross_tmp.append(cross_location)# 执行交叉操作infant = father[0:cross_location] + mother[cross_location:]# 计算其评估值是否变优秀,没有变优秀就重来score = cal_func(infant) - cal_func(father)while score < 0:if len(cross_tmp) == 30:return tribecross_location = random.randint(0, 29)if cross_location in cross_tmp: #判断是否已经选择过这个位点交叉,选择过了就continue重新循环找continuecross_tmp.append(cross_location) #选择过的加入记忆列表infant = father[0:cross_location] + mother[cross_location:]score = cal_func(infant) - cal_func(father)# 修改tribe (将交叉后的结果与原先的节点替换/不变)tribe[father_index] = infantreturn tribe
变异操作
if type == '突变':# 初始化需要的参数value = estimate(tribe) #概率数组# 随机选择变异节点variation_human, variation_human_index = roulette_select_human(value, tribe) #随机选,但是是概率大的中标tmp_human = variation_human# 随机选择变异位置variation_location = random.randint(0, 29)# 取反num = 1 - int(variation_human[variation_location])tmp = list(variation_human)tmp[variation_location] = str(num)variation_human = ''.join(tmp) #’‘与后面连接成新字符串# 判断是否有效if cal_func(variation_human) < cal_func(tmp_human): #有效突变tribe[variation_human_index] = variation_humanreturn tribe
函数动态画图出来表示的方法
#画图准备
fig = plt.figure() # 创建空图像
ax = Axes3D(fig) # 创建3D图像
plt.ion() # 切换到交互模式绘制动态图像
init_graph(ax) # 初始化图
plt.ioff() # 关闭交互模式
plt.show() # 绘制结果
# 循环结束,得到最终优秀的tribe
# 找到里面 value最大的情况即可
print('循环结束')
把这个二元函数画出来的方法,再在什么取点找极大值
def init_graph(ax):#fig=plt.figure(figsize=(5,5)) #绘制画布尺寸#ax=Axes3D(fig) #绘制三维图形ax.set_zlim(-2, 2) # 自定义z轴范围ax.set_xlabel('x') # 设置x坐标轴标题ax.set_ylabel('y') # 设置y坐标轴标题ax.set_zlabel('z') # 设置z坐标轴标题#x,y的取值区间范围x=np.arange(-1,1,0.01)y=np.arange(-1,1,0.01)z=np.arange(-1, 1, 0.00000001)x,y=np.meshgrid(x,y)#定义二元函数z=function(x, y)#图形绘制风格ax.plot_surface(x, y, z,rstride=5,cstride=2,cmap=plt.get_cmap('rainbow'), edgecolor='none')#绘制图形plt.show()
7.关键参数分析
'''全局变量'''
max_loop = 200 # 最大迭代次数 100~500
tribe_number = 50 # 种群初始化数量 20~100
limit_left = -1 # 定义域左界限
limit_right = 1 # 定义域右界限
limit_bit = 15 # 编码位数
cross_probability = 0.9 # 交叉概率 0.4~0.99
variation_probability = 0.1 # 变异概率 0.0001~0.1
关键参数就是迭代的次数、种群的数量、定义域、编码位数等等,这些都会对结果造成改变,像我取的15位,会让结果更加接近,更加精确。
这里取的交叉和变异概率相加为1,方便调用python中的函数进行操作。
三、课程设计(综合实验)总结或结论
略
四、参考文献
知乎-使用遗传算法求解函数最值
https://zhuanlan.zhihu.com/p/94477212
笔者介绍:某智科卑微牛马,一项省级大创已结项,一项国家级大创和一项校级大创已成功立项,都交给小自己一届的学弟去做,参加的挑战杯项目在其余队友参加大创后也获得了省级优秀和国家级优秀结项。同时组织并担任了2022年挑战杯、两项互联网+、电子商务大赛、舞蹈机器人大赛、“创青春”青年创新创业大赛的队长,并参加过节能减排大赛、调研河北大赛、数学建模美赛、蓝桥杯省赛、机器人国赛等比赛若干,获得过舞蹈机器人一等、电子商务大赛二等、挑战杯三等、节能减排省一等、创新创业优秀个人、社会实践优秀个人等奖项。
程序下载说明:作者所有的实验、课设验收基本都是优,也不缺这几米,不过不想自己的文章或者作品烂大街,想留点门槛,应该是几米这样子,作品都是保证高质量的,给有需要的学弟学妹们学习,大部分还是免费的,因为一些大型的文件不好上传,故放在付费资料区下载,真的非常良心!!
智科人之人工智能大实验四选一验优报告参考:基于遗传算法的函数极值求取相关推荐
- 智科人之人工智能课程上机实验(智科还单独有一个综合实验):PROLOG语言练习与编程上机实验
各个专业的prolog需要掌握的程度都是不一样的,实验要求也不一样: 智科牛马的在此:(好像占平时成绩20分还是多少来的) 其他专业只有一个课程设计实验,我们这个有一个综合实验和一个课上编程实验,而且 ...
- 智科之脑科学课程设计实验和实验报告:用假设检验验证斯特鲁普(stroop)效应
脑科学课上小组组队设计实验:这里是实验报告,具体测试程序在资料区下载,仅需两米. 当时和课上那些保研大佬.DT人.蓝桥杯省赛国赛大佬等等一起组队十个人做的实验. 资料区下载的文件内容: 参考文献 [1 ...
- 更新一期:智科人第一次参加2022节能减排大赛的经验加前端开发的app源代码(资料区下载)
计算机人参加节能减排大赛可以说是及其不友好的,为什么这么说呢: 节能减排大赛比较针对做一些硬件.小装置这种的专业,比如环工.电气.能动.动力等等那边的专业,在我认识的这么多计算机和外系人来看,综合参考 ...
- 人工智能导论实验四:深度学习算法及应用
实验四:深度学习算法及应用 一.实验目的 1.了解深度学习的基本原理: 2.能够使用深度学习开源工具: 3.应用深度学习算法求解实际问题. 二.实验要求 1.解释深度学习原理: 2.对实验性能进行分析 ...
- 201571030321 马玉婷 实验四 小学四则运算需求分析结对报告
小伙伴博客园链接:http://www.cnblogs.com/mameiling/p/8876532.html 任务一: 实践软件需求获取方式 (1)在线咨询 老师层面:特意找到了母校的老师,由于双 ...
- 广州大学人工智能原理实验三:产生式系统推理
相关资料 广州大学人工智能原理实验一:知识的表示与推理实验 广州大学人工智能原理实验二:八数码问题 广州大学人工智能原理实验三:产生式系统推理 广州大学人工智能原理实验四:TSP问题的遗传算法实现 广 ...
- 算法设计与分析实验报告验优参考
相关算法分析的代码(自写)和大佬的拓展代码都放在资料区提供下载 具体内容如下: 自写的: 上一届算法大佬留给我们拓展的:(想多写一点,后续想参加蓝桥杯等等比赛的可以参考大佬的一些程序) 不多bb了,直 ...
- 数据结构课程设计实验验优参考(附数据结构上机实验、上机考试代码)
计算机的几个专业的数据结构考试内容有所不一样,好像上机还是什么不太一样.软件工程那边的老师还要求学会C++读取文件,后面我也会附上读取文件的相关代码,其余的实验上机.上机考试代码等等在资料区下载即可. ...
- 人工智能 遗传算法 计算函数极值问题
人工智能 遗传算法 计算函数极值问题 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 pyth ...
- 【毕业季】致大学江湖的青葱岁月,我与湖中大的四个夏天(情忆新月,梦系信科)
在这温暖的房间 我于是慢慢发现 就算我们的爱有期限 不愿说再见 在这温暖的房间 我们都笑的很甜 一切 停格在一瞬间 -- <房间>刘瑞琦 在毕业晚会上,伴随着这首歌曲合唱与最后一次点名,意 ...
最新文章
- Eclipse的Git插件下载项目出现 No project found
- 【资源】mp3的外链资源
- 统计学习方法 第九章笔记: EM 算法
- c#创建web应用程序_创建Web应用程序图标集的6个步骤
- Jmeter----5.1 设置中文
- fragment和Activity同时操作UI引起的延迟、卡顿
- python小球弹弹弹_python实现小球弹跳效果
- hive 如何将数组转成字符串_Hive函数大全(含例子)之字符串函数(String Functions)...
- 多功能PCIE交换机之七:单NT到双NT
- 让程序最小化到任务栏的时候隐藏
- java http下载_java http下载文件
- 解决同一条sql在pl/sql工具中执行很快,在程序中却很慢
- Python 自动化教程(3) : 自动生成PPT文件 Part 1 (干货)
- 解决浏览器打开就是被篡改的桔梗网界面
- 歌曲:酒干倘卖无 背后的故事
- C# Environment
- 亚马逊aws申请ses邮件推送攻略
- 在Java 17中偏向锁可算废了
- 商标复审成功率是多少?
- 字节跳动核心竞争力到底是什么?