优化问题1:组团旅游

五个人要乘坐航班去同一个地方,如何安排航班可以使总成本最低
思路:目标函数是一个10维list,[1,4,3,2,7,3,6,3,2,4,5,3],表示每个人乘坐第几趟航班往返

优化问题2:学生宿舍优化

10个学生选择5间宿舍10个床位,每人2个志愿,如何安排可以符合多数人的志愿
思路:将每个床位看作一个槽,十个学生选择十个槽

关键点

  1. 设置初始值
  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:优化问题相关推荐

  1. 《集体智慧编程》读书笔记2

    最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...

  2. 《集体智慧编程》读书笔记10

    最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...

  3. 《集体智慧编程》读书笔记4

    最近重读<集体智慧编程>,这本当年出版的介绍推荐系统的书,在当时看来很引领潮流,放眼现在已经成了各互联网公司必备的技术. 这次边阅读边尝试将书中的一些Python语言例子用C#来实现,利于 ...

  4. 《集体智慧编程》数学公式

    这篇博客的目的主要是为了记录这些公式,取自原书附录B. 1.欧几里得距离(Euclidean Distance) 用途:计算距离,衡量相似度 公式: 代码实现: def euclidean(p, q) ...

  5. 《集体智慧编程》——第一章导读

    为什么80%的码农都做不了架构师?>>>    什么是集体智慧 其含义是指:为了长早新的想法,而将一群人的行为.偏好或思想组合在一起. 完成这项工作的一种最为基础的方法,便是使用调查 ...

  6. 《集体智慧编程》笔记(1 / 12):集体智慧导言

    文章目录 什么是集体智慧 什么是机器学习 机器学习的局限性 真实生活中的例子 学习型算法的其他用途 小结 Netflix, Google都适用了先进算法,将来自不同人群的数据加以组合,进而得出新的结论 ...

  7. 集体智慧编程 - 优化

    优化的核心是成本函数的建立,后面的优化函数,无论是何种方法,都是对题解的适当修改,以求使成本函数的值最小,只是修改的方式不同罢了. 转载于:https://www.cnblogs.com/zhouwe ...

  8. 集体智慧编程——优化搜索算法:爬山法,模拟退火算法,遗传算法-Python实现

    在优化问题中,有两个关键点 代价函数:确定问题的形式和规模之后,根据不同的问题,选择要优化的目标.如本文涉及的两个问题中,一个优化目标是使得航班选择最优,共计12个航班,要使得总的票价最少且每个人的等 ...

  9. 《集体智慧编程》第五章 优化

    组团旅游案例中: 关于租车时间: 如果租车,那么他们应该在24小时内归还车子,但是原文中又说"家庭成员们来自全国各地,并且他们希望在纽约会面.他们将在同一天到达,并在同一天离开." ...

  10. 《集体智慧编程》第8章

    1.P175 在计算高斯函数时,代码中的默认标准差为10.0,如果默认标准差为10是得不到正文中的数据的,这里的默认值应该改为1.0 附上高斯函数的公式和图像 公式中的a代表高斯函数的最大值,b代表平 ...

最新文章

  1. python -如何查看已经安装xlrd 的版本号
  2. 诵经嘴巴机器人入驻蓬皮杜艺术中心,MIT艺术家出品,网友:看到的第一眼我就想歪了...
  3. php margin参数,margin参数简单介绍_html/css_WEB-ITnose
  4. python实现矢量分级渲染_用 Python 撸一个 Web 服务器-第4章:动态渲染数据
  5. [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long
  6. ViceDinoSpecCtrlDlg.cpp
  7. mysql 索引能不能太多,mysql索引太多了?
  8. 解析对偶理论与对偶单纯性法
  9. C#中判断字符是否为中文
  10. php保存快捷键,pr保存快捷键是什么?
  11. 离散数学自反闭包对称闭包传递闭包C语言代码实现
  12. 在Ubuntu 14.04上安装了tfp和tftp服务
  13. 开发微信支付功能之微信限制金额说明
  14. 学习R语言这几本电子书就够了!
  15. 2021 ICPC 银川打铜记
  16. 软件开发人员的内功修炼之道
  17. KDD 2011 最佳工业论文中机器学习的实践方法-翻译
  18. 简单漫画读懂联邦学习
  19. CSDN大神多,在这里驻扎一下,沾沾神气
  20. 分享一些网页设计的素材

热门文章

  1. JSP电子病历管理系统
  2. 西门子PLCSIM仿真与第三方组态软件(包括HMI)的通信
  3. 【程序员学习运筹学】什么是运筹学
  4. SVN下载以及汉化安装包的使用
  5. B站后台源码疑似泄露,作为程序员我们得注意哪些?
  6. proteus 8.6 和proteus 8.8 安装包
  7. C语言编写游戏的程序教程,如何运用C语言编写搬山游戏
  8. ajax 传json数组对象,ajax传递json数组
  9. 非常好用的jdk帮助文档jdk1.8中文谷歌翻译
  10. LwIP 协议栈源码详解 ——TCP/IP 协议的实现(二:移植综述)