详解Python使用模拟退火算法求解列表“最大值”

之前发过一个使用爬山算法的文章,请参考:Python使用爬山算法寻找序列“最大值”

模拟退火算法可以看作是爬山算法的一种改进,如果前方有更优解就前进,如果没有更优解就以一定概率前进。与简单的爬山算法相比,模拟退火算法有可能跳出局部而得到全局最优解,但也有可能得到更差的解,算法参数的设置非常重要。

def simAnnealingMax(lst, howFar):

'''

lst:待确定最大值的列表

howFar:爬山时能看到的“最远方”,越大越准确

'''

#由于切片是左闭右开区间,所以howFat必须大于1

assert howFar>1, 'parameter "howFar" must >1'

#从列表第一个元素开始爬

#如果已经到达最后一个元素,或者已找到局部最大值,结束

start = 0

ll = len(lst)

#随机走动的次数

times = 1

while start <= ll:

#当前局部最优解

m = lst[start]

#下一个邻域内的数字

loc = lst[start+1:start+howFar]

#如果已处理完所有数据,结束

if not loc:

return m

#下一个邻域的局部最优解及其位置

mm = max(loc)

mmPos = loc.index(mm)

#如果下一个邻域内有更优解,走过去

if m <= mm:

start += mmPos+1

else:

#如果下一个邻域内没有更优解,以一定的概率前进或结束

delta = (m-mm)/(m+mm)

#随机走动次数越多,对概率要求越低

if delta <= random()/times:

start += mmPos+1

times += 1

else:

return m

函数用法为:

from random import randint

lst = [randint(1, 100) for i in range(200)]

print(simAnnealingMax(lst, k))

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-01-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量化投资与机器学习

从Seq2seq到Attention模型到Self Attention(一)

近一两年,注意力模型(Attention Model)是深度学习领域最受瞩目的新星,用来处理与序列相关的数据,特别是2017年Google提出后,模型成效、复杂...

4684
来自专栏AI启蒙研究院

【读书笔记】之概率统计知识梳理

843
来自专栏机器学习算法与Python学习

n-gram文法中数据稀疏问题解决方案之一:Good-Turing平滑

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 统计语言模型中,N元语法模型不可避免...

3814
来自专栏机器之心

业界 | 除了自然语言处理,你还可以用Word2Vec做什么?

3716
来自专栏深度学习自然语言处理

pyTorch基础入门练习

import导入 import torch#基本的torch函数 import torch.autograd as autograd#自动求导 import t...

39910
来自专栏AI科技评论

ACL论文 | 深度学习大神新作,神经网络的自然语言翻译应用

在 8月7日在德国柏林召开的2016 计算语言学(ACL)大会上,学者Thang Luong、Kyunghyun Cho 和 Christopher D. Ma...

3655
来自专栏AI研习社

从聚合-转移框架浅谈卷积神经网络的架构设计

本次Paper Reading我们并没有关注某些特定的paper,而是用一个视角对现有的代表性的卷积神经网络设计进行总结。

1372
来自专栏移动开发面面观

Softmax

1493
来自专栏素质云笔记

NLP+2vec︱认识多种多样的2vec向量化模型

1、word2vec 耳熟能详的NLP向量化模型。 Paper: https://papers.nips.cc/paper/5021-distributed...

6327
来自专栏杨熹的专栏

如何自动生成文本摘要

学习资料: https://www.youtube.com/watch?v=ogrJaOIuBx4&list=PL2-dafEMk2A7YdKv4XfKpfb...

4285

扫码关注云+社区

领取腾讯云代金券