集体智慧编程chapter5:优化问题
优化问题1:组团旅游
五个人要乘坐航班去同一个地方,如何安排航班可以使总成本最低
思路:目标函数是一个10维list,[1,4,3,2,7,3,6,3,2,4,5,3],表示每个人乘坐第几趟航班往返
优化问题2:学生宿舍优化
10个学生选择5间宿舍10个床位,每人2个志愿,如何安排可以符合多数人的志愿
思路:将每个床位看作一个槽,十个学生选择十个槽
关键点
- 设置初始值
- 设置成本函数cost,即损失函数
可用算法
随机选择:完全随机,保留最优解
def randomptimize(domain, costf):best = 999999999bestr = Nonefor i in range(10000): # 我们打算随机产生1000次结果,从这1000次结果中选择一个最好的# 很显然randint是产生在一定范围内的随机数,显然由于下一句右边等号里的for,将会产生一个循环r = [random.randint(domain[j][0], domain[j][1]) for j in range(len(domain))]cost = costf(r)# 每次得到成本我们都判断一次,如果更低,我们就置换if cost < best:best = costbestr = rreturn bestr
爬山法:每次更新一个值,保留最优解,容易陷入局部最优
def hillclimb(domain, costf):# Create a random solutionsol = [random.randint(domain[i][0], domain[i][1])for i in range(len(domain))]# Main loopwhile 1:# Create list of neighboring solutionsneighbors = []for j in range(len(domain)):# 对于每个元素+1或者-1if sol[j] > domain[j][0]:neighbors.append(sol[0:j] + [sol[j] + 1] + sol[j + 1:])if sol[j] < domain[j][1]:neighbors.append(sol[0:j] + [sol[j] - 1] + sol[j + 1:])# See what the best solution amongst the neighbors iscurrent = costf(sol)best = currentfor j in range(len(neighbors)):cost = costf(neighbors[j])if cost < best:best = costsol = neighbors[j]# If there's no improvement, then we've reached the topif best == current:breakreturn sol
模拟退火算法:即使新的成本更高,也有可能更新最优解,可避免局部最优
def annealingoptimize(domain, costf, T=10000.0, cool=0.98, step=1):# 和爬山法一样,先产生一个随机解,然后一切的改变都从这个随机解开始vec = [random.randint(domain[i][0], domain[i][1]) for i in range(len(domain))]while T > 0.5:# 产生一个随机数,决定这次改变是改变数列中的哪一个随机数i = random.randint(0, len(domain) - 1)# 选择一个改变的方向,也就是说是增加还是减少dir = random.randint(-step, step)# 复制随机解,然后对随机解进行改变,然后判断到底新的解好,还是后来产生的解好vecb = vec[:]vecb[i] += dir# 这一段主要还是不让它超不过了最大最小值的限制if vecb[i] < domain[i][0]:vecb[i] = domain[i][0]elif vecb[i] > domain[i][1]:vecb[i] = domain[i][1]# 计算新产生的两次解的成本,然后对成本进行比较ea = costf(vec)eb = costf(vecb)# or后面:表示接受更差的结果。仔细想想,原来概率的表示是如此完成的,注意前一个random()产生的数是在0到1之间。if (eb < ea or random.random() < pow(math.e, -(eb - ea) / T)):vec = vecb# 没经过一次循环,改变温度,温度一改变,就会改变循环的次数和接受更差解的概率# 按一定比例降温T = T * coolreturn vec
遗传算法:交叉变异,每次保留一定的最优序列
def geneticoptimize(domain, costf, popsize=50, step=1, mutprob=0.2, elite=0.2, maxiter=100):# 方法中还在定义方法# 变异操作def mutate(vec):i = random.randint(0, len(domain) - 1)# 完成第增加或减少的概率各一半if random.random() < 0.5 and vec[i] > domain[i][0]:return vec[0:i] + [vec[i] - step] + vec[i + 1:]elif vec[i] < domain[i][1]:return vec[0:i] + [vec[i] + step] + vec[i + 1:]else:return vec# 交叉操作:貌似用python编程是好快的说,我感觉比较复杂的句子只要两句么,还是我c/c++没学好def crossover(r1, r2):# 为什么减2,其实想把这个一个数字列表划分为两段,再各取一半i = random.randint(1, len(domain) - 2)return r1[0:i] + r2[i:]# 构造初始种群pop = []for i in range(popsize):vec = [random.randint(domain[i][0], domain[i][1]) for i in range(len(domain))]pop.append(vec)# 每一代有多少优势物种,我们需要保留topelite = int(elite * popsize)# 主循环for i in range(maxiter):# print pop #但是如果不加这句会使下一句出现一个bug,就是传过去的v是None,但是我讲pop全部打印出来的话,又没有问题scores = [(costf(v), v) for v in pop] # 列表里面,每一个元素都是一个元组,每一个元组是由一个数字和一个列表构成scores.sort()ranked = [v for (s, v) in scores]# 从中选择我们觉得优势的物种,然后保留pop = ranked[0:topelite]# 如果种群数量不够,那么我们使用变异或者配对,产生新的后代个体while len(pop) < popsize:# 变异的概率,这是由我们设定的,虽然这里是变异和配对只能选择其一,但是我认为是可以共同进行的if random.random() < mutprob: # 如果这样做,就是变异的少,交叉的多吧# 变异c = random.randint(0, topelite) # 注意是从优秀的子代中选出一个进行变异pop.append(mutate(ranked[c]))else:c1 = random.randint(0, topelite) # 从优秀的子代中选择c2 = random.randint(0, topelite) # 从优秀的子代中选择pop.append(crossover(ranked[c1], ranked[c2]))print(scores[0][0]) # 注意打印的是成本return scores[0][1] # 这里返回的是航班序列
集体智慧编程chapter5:优化问题相关推荐
- 《集体智慧编程》读书笔记2
最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...
- 《集体智慧编程》读书笔记10
最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...
- 《集体智慧编程》读书笔记4
最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...
- 《集体智慧编程》数学公式
这篇博客的目的主要是为了记录这些公式,取自原书附录B. 1.欧几里得距离(Euclidean Distance) 用途:计算距离,衡量相似度 公式: 代码实现: def euclidean(p, q) ...
- 《集体智慧编程》——第一章导读
为什么80%的码农都做不了架构师?>>> 什么是集体智慧 其含义是指:为了长早新的想法,而将一群人的行为.偏好或思想组合在一起. 完成这项工作的一种最为基础的方法,便是使用调查 ...
- 《集体智慧编程》笔记(1 / 12):集体智慧导言
文章目录 什么是集体智慧 什么是机器学习 机器学习的局限性 真实生活中的例子 学习型算法的其他用途 小结 Netflix, Google都适用了先进算法,将来自不同人群的数据加以组合,进而得出新的结论 ...
- 集体智慧编程 - 优化
优化的核心是成本函数的建立,后面的优化函数,无论是何种方法,都是对题解的适当修改,以求使成本函数的值最小,只是修改的方式不同罢了. 转载于:https://www.cnblogs.com/zhouwe ...
- 集体智慧编程——优化搜索算法:爬山法,模拟退火算法,遗传算法-Python实现
在优化问题中,有两个关键点 代价函数:确定问题的形式和规模之后,根据不同的问题,选择要优化的目标.如本文涉及的两个问题中,一个优化目标是使得航班选择最优,共计12个航班,要使得总的票价最少且每个人的等 ...
- 《集体智慧编程》第五章 优化
组团旅游案例中: 关于租车时间: 如果租车,那么他们应该在24小时内归还车子,但是原文中又说"家庭成员们来自全国各地,并且他们希望在纽约会面.他们将在同一天到达,并在同一天离开." ...
- 《集体智慧编程》第8章
1.P175 在计算高斯函数时,代码中的默认标准差为10.0,如果默认标准差为10是得不到正文中的数据的,这里的默认值应该改为1.0 附上高斯函数的公式和图像 公式中的a代表高斯函数的最大值,b代表平 ...
最新文章
- python -如何查看已经安装xlrd 的版本号
- 诵经嘴巴机器人入驻蓬皮杜艺术中心,MIT艺术家出品,网友:看到的第一眼我就想歪了...
- php margin参数,margin参数简单介绍_html/css_WEB-ITnose
- python实现矢量分级渲染_用 Python 撸一个 Web 服务器-第4章:动态渲染数据
- [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long
- ViceDinoSpecCtrlDlg.cpp
- mysql 索引能不能太多,mysql索引太多了?
- 解析对偶理论与对偶单纯性法
- C#中判断字符是否为中文
- php保存快捷键,pr保存快捷键是什么?
- 离散数学自反闭包对称闭包传递闭包C语言代码实现
- 在Ubuntu 14.04上安装了tfp和tftp服务
- 开发微信支付功能之微信限制金额说明
- 学习R语言这几本电子书就够了!
- 2021 ICPC 银川打铜记
- 软件开发人员的内功修炼之道
- KDD 2011 最佳工业论文中机器学习的实践方法-翻译
- 简单漫画读懂联邦学习
- CSDN大神多,在这里驻扎一下,沾沾神气
- 分享一些网页设计的素材