最新要闻
- 促进市场细分,带动行业升级 “机器人来我家帮忙擦窗”
- 郑州一中国际航空港实验学校怎么样
- 2023邛崃南宝山七夕节有什么活动?
- 爸爸第一次吃自助火锅满脸拘谨 小心翼翼夹东西
- 江苏省张家港市抽检100批次食品 4批次不合格
- 新理论阐释“奇异金属”为何奇异
- 鄂股半年报丨华灿光电上半年亏损3.64亿元,逐鹿MLED赛道寻求增长点
- 街头篮球SFSA总决赛四强集结 星C凉茶领衔终极对决
- 锁定七夕首选《燃冬》首映周冬雨刘昊然屈楚萧齐聚
- ETF午评丨证券板块全线下跌,证券ETF先锋跌3.36%
- 陆家嘴周边医院现“医托” 有人高价买了一堆“廉价货”
- 北大孔庆东
- 滕州:荆河街道彰显“人大作为” 助力乡村振兴
- 三星Galaxy S24 Ultra渲染图曝光:钛金圆角边框
- 日系车慌吗?比亚迪首次进入日本东京:海豚、海豹即将上市
- 45%提升从何而来?揭开Intel Arc锐炫显卡驱动的秘密
手机
“新疆十四运”带火巴州文创
录取通知书里的“秘密”与心语,你读懂了吗
- “新疆十四运”带火巴州文创
- 录取通知书里的“秘密”与心语,你读懂了吗
- 小青柑制作青柑茶 延伸富民产业链
- 美国包包品牌有哪些(美国包包品牌大全)
- 虎落平阳被犬欺全文阅读(虎落平阳被犬欺全文)
- 市民“随手拍” 城管来解决 常德“全民城管”平台正式上线
家电
如何用随机方法求解组合优化问题(七)
模拟退火算法应用举例
这是一篇笔记,是对于B站up主马少平的视频(第四篇 如何用随机方法求解组合优化问题(七))的学习与记录。
(资料图片仅供参考)
旅行商问题
一个商人要访问 \(n\) 个城市,每个城市访问一次,并且只能访问一次,最后再回到出发城市。问如何规划才能使得行走的路径长度最短。
旅行商问题的解空间非常大,难以使用穷举法进行求解。
- 10城市:\(10!=3628800\)
- 20城市:\(20!\approx 2.43\times 10^{18}\)
在已知模拟退火算法的基本框架,以及需要确定的参数的情况下,为了解决实际问题,我们需要将实际问题,转换并抽离出我们需要的参数。
指标函数
\[f(\pi_1,\cdots,\pi_n)=\sum\limits_{i=1}^nd_{\pi_i\pi_{i+1}}\quad\quad \pi_{n+1}=\pi_1\]其中 \((\pi_1,\cdots,\pi_n)\) 是表示路径的序列,\(\pi_i\) 表示第 \(i\) 个访问的城市,\(d_{\pi_i\pi_i+1}\) 是路径中相邻两个城市的距离。
新解的产生
逆序交换法
- 当前解
- 交换后
即 \(\pi_u\) 和 \(\pi_v\) 这两个城市之间的路径进行逆序, \(\pi_u\) 和 \(\pi_v\) 不变。
指标函数差
当新解是较好的解时,百分之百接受;当新解是较差的解时,则按概率接受:
\[P_{i\Rightarrow j}(t)=e^{-\frac{f(j)-f(i)}{t}}=e^{-\frac{\Delta f}{t}}\]为了计算接受概率,需要先计算指标函数差 \(f(j)-f(i)\)。
需要注意的是,这里并不需要完全计算出两个解的总路径长度再做差。
由于我们使用的是逆序交换法,两个解之间的差别只存在于逆序区间的交界处。
当前解:\((\pi_1,\cdots,\pi_u,\pi_{u+1},\cdots,\pi_{v-1},\pi_v,\cdots,\pi_n)\)
交换后:\((\pi_1,\cdots,\pi_u,\pi_{v-1},\cdots,\pi_{u+1},\pi_v,\cdots,\pi_n)\)
因此,有:
\[\begin{align*}\Delta f&= f(j) - f(i)\\&=(d_{\pi_u\pi_{v-1}}+d_{\pi_{u+1}\pi_v})-(d_{\pi_u\pi_{u+1}}+d_{\pi_{v-1}\pi_v})\end{align*}\]故从解 \(i\) 到解 \(j\) 的接受概率:
\[P_{i\Rightarrow j}(t)=\begin{cases}1 & if \ \Delta f\le 0 \\e^{-\frac{\Delta f}{t}} & else\end{cases}\]参数确定
- 初始温度:\(t_0=200\)
- 温度衰减系数:\(\alpha=0.95\),\(t_{k+1}=\alpha t_k\)
- 每个温度下的迭代次数:\(100n\),\(n\) 为城市数
- 算法结束条件:无变化控制法(相邻两个温度下结果相等)
代码实现
测试数据
这里提供了 10 个城市的 xy 坐标。
A 0.4000 0.4439B 0.2439 0.1463C 0.1707 0.2293D 0.2293 0.7610E 0.5171 0.9414F 0.8732 0.6536G 0.6878 0.5219H 0.8488 0.3609I 0.6683 0.2536J 0.6195 0.2634
City class
定义 City
类,方便后续操作。
class City: def __init__(self, name: str, x: float, y: float): self.name = name self.x = x self.y = y def __repr__(self): return f"{self.name} {self.x} {self.y}" def __str__(self): return f"{self.name} {self.x} {self.y}" def distance(self, other: "City"): d = ((self.x - other.x)*(self.x - other.x) + (self.y - other.y)*(self.y - other.y))**0.5 return d
读取数据
假设上面的测试数据保存在10.txt
文件中。这里用一个函数来读取文件数据,并转换为 City
列表。
def read_data(path: str): data: list[City] = [] with open(path, "r", encoding="utf-8") as f: for line in f.readlines(): information = line.replace("\n", "").split(" ") data.append(City(name=information[0], x=float(information[1]), y=float(information[2]))) return data
生成随机序列
为了随机地生成一个初始解,使用一个数值列表表示旅行商的城市访问顺序:
def gen_random_seq(length: int)->list[int]: sequence = list(range(length)) random.shuffle(sequence) return sequence
实现对序列片段的逆序交换
为了生成邻居解,需要实现逆序交换,函数需要传入:原序列、逆序区间的起始下标、结束下标。
def reverse_seq(sequence: list[int], start_idx: int, end_idx: int)->list[int]: assert start_idx <= end_idx i = start_idx j = end_idx while i
生成邻居解
根据传入的原序列,使用逆序交换法生成邻居解,逆序区间是随机的。
这里生成两个端点a
,b
之后,进行逆序,但是逆序操作并不包含这两个端点。
因为类似于[0,...,9]
和[9,...,0]
这两个序列在旅行商问题中是一样的,路线是首尾相接的环。
def gen_near_seq(sequence:list[int])->(list[int], int, int): n = len(sequence) a = math.floor(random.random()*n) b = math.floor(random.random()*n) start_idx, end_idx = (a, b) if a 1: start_idx += 1 end_idx -= 1 return reverse_seq(sequence, start_idx, end_idx), start_idx, end_idx
指标函数
根据序列和城市列表,计算路径的总长度。
def valuate(sequence: list[int], cities: list[City])->float: total: float = 0 length = len(cities) for idx in range(length): curr_city = cities[sequence[idx]] next_city = cities[sequence[(idx+1)%length]] d = curr_city.distance(next_city) total += d return total
最终实现
根据上面已经编写好的函数,开始结合算法解决问题。
数据读取
# 文件的路径根据实际情况进行填写cities = read_data("./dataset/10.txt")
超参数设置
# 初始温度t = 200# 温度递减速率alpha = 0.95# 问题规模(10个城市)n = 10# 同一温度的迭代次数iteration_times = 100 * n
生成随机序列
随机地生成当前的序列和它的指标:curr_seq
和curr_val
;
初始化最优解的序列和指标:best_seq
和best_val
.
curr_seq: list[int] = gen_random_seq(n)curr_val: float = valuate(curr_seq, cities)best_seq: list[int] = list()best_val: float = float("inf")
内外循环
while curr_val != best_val: i = 0 while i < iteration_times: i += 1 # 生成相邻解 new_seq, start_idx, end_idx = gen_near_seq(curr_seq) new_val = valuate(new_seq, cities) # 是否接受解 if new_val <= curr_val: curr_seq, curr_val = new_seq, new_val else: if random.random() < math.e ** ((curr_val - new_val) / t): curr_seq, curr_val = new_seq, new_val # 记录当前温度的最优解 if curr_val < best_val: best_seq, best_val = curr_seq, curr_val t *= alpha
运行结果与相关图像
上述 10 个城市的案例,最终结果为
best_val: 2.6906706370094136
通过在上面代码的循环中嵌入“导出数据到csv文件”的操作(这里没有给出代码),然后结合pandas和matplotlib等库,可以绘制出下面图像:
这个图像的横坐标是迭代次数,纵坐标是指标(即路径长度)。
上图的横坐标数据中,每一个温度记录10000个数据,直到最终满足外循环的结束条件。
可以看到,随着温度的下降,波动在变小,并最终收敛到最优解。
前段区间的波动一致,是因为指标本身存在上下界,即十个城市的坐标确认后,最优解和最差解是固定的。
通过减少数据导出频率(提高运行速度),并且将温度的数值进行等比例缩小。将温度和指标绘制到下面这幅图:
可以更直观地看出温度和指标波动的关系。
关键词:
如何用随机方法求解组合优化问题(七)
ansible Ad-Hoc YAML剧本
简单聊一聊SpringBoot的约定优于配置
读SQL学习指南(第3版)笔记02_数据类型
A股三大指数午后跌幅均超过1% 沪指跌破3100点
怀疑丈夫有外遇 女子网上请“大师”做法“斩桃花”被骗万元
九万多买B级赛车!奕炫MAX 2024款焕新上市
广东省财政厅搭建政府采购“制造业展馆”
广州本周天气晴热为主,有分散雷阵雨
皇庭国际: 关于持股5%以上股东减持计划的预披露公告
融创中国盘中跌破1港元沦为仙股 现跌超10%
促进市场细分,带动行业升级 “机器人来我家帮忙擦窗”
四川启动四级防汛应急响应
郑州一中国际航空港实验学校怎么样
“巴山蜀水·运动川渝”2023川渝小篮球联赛总决赛落幕
pique是什么面料
新凤鸣:全资子公司江苏新拓年产60万吨差别化功能性纤维项目一期投产
海鹰美团终止收购无锡优拓60%股权 财务顾问国融证券
电诈的“前菜”!这种短信别点开
树金字招牌 新疆兵团三团举办首届核桃之恋文化旅游节
简单易学Dremel工具砂光带更换技巧全揭秘
免税经营扣点下降?两大机场紧急澄清
朝鲜高丽航空从平壤至北京的商业航班被取消?外交部回应
商务部:中国旅客旅游消费信心正加快恢复
9月29月18日~10月9日,生活愉快,财运节节攀升的3大属相
盖尔·加朵,求求你别再演这种烂片了
SCFI指数再度转跌!集运市场旺季需求不强供过于求
纽威股份2023年上半年净利3.36亿 同比增加78.04%
2023邛崃南宝山七夕节有什么活动?
东湖评论:“三心服务”激活高质量发展“人才引擎”
国台办:海关总署决定自即日起暂停台湾地区芒果输入大陆
我国首个跨国高等教育质量评估框架出炉
国产首台GPU千亿参数大模型训推一体机发布,优刻得提供灵活算力部署方案
【中国式现代化的京津冀实践】北京研发 天津转化 天津滨海一中关村科技园探索京津两市合作新模式
高质量发展调研行 | 邯郸:为建设现代化区域中心城市积蓄新动能
盟固利涨8.62% 机构净买入5824万元
新主机性能堪忧:任天堂社长称不追求新技术
招商局港口(00144.HK)赎回6亿美元票据
水利部和中国气象局8月21日18时联合发布橙色山洪灾害气象预警
成都国际车展:中国汽车工业70年风雨兼程,未来展望
财政部印发《企业数据资源相关会计处理暂行规定》
爸爸第一次吃自助火锅满脸拘谨 小心翼翼夹东西
缤纷汽车官图亮相:五门四座纯电小车,续航 205km
格力电器首次落榜世界500强 董明珠:企业健康发展更重要
机构出手!多家公募、券商资管掀起自购潮 “市场底“还远吗?
孙红雷在青年导演创扶计划活动上交流表演艺术
江苏省张家港市抽检100批次食品 4批次不合格
医药股快速反弹 通化金马盘中涨停
村小心大!小苇子村生态农业启动绿色经济“新引擎”
“新疆十四运”带火巴州文创
AI 时代,程序员的出路在何方?
录取通知书里的“秘密”与心语,你读懂了吗
证券交易经手费是什么?证券交易经手费是多少?
凯众股份:聘任财务总监贾洁女士为公司董事会秘书
国家发展改革委部署在防汛救灾和灾后恢复重建中大力实施以工代赈
小青柑制作青柑茶 延伸富民产业链
TCL中环继续上调单晶硅片价格
2023年“兴业银行杯”上海城市业余联赛上海市民水上运动嘉年华举行
恒盛地产(00845.HK)8月31日举行董事会会议批准中期业绩
粘纤是什么材质
上海贵酒2023年营收净利双增长,营收增长69.73%,净利增长46.22%
七夕开始,湖南博物院开放夜游!
木洞镇:企业聚爱心 人大代表助力困难学子圆梦大学
献给一线劳动者的慰问演出
中孚信息:公司为多家金融企业提供过网络安全相关产品及解决方案,并与多家客户保持常年合作关系
全男班舞剧《画皮》回归,中式意蕴重构“志异”经典
8月LPR公布:5年期维持4.2%不变 1年期降10个基点
新理论阐释“奇异金属”为何奇异
安全生产严重失信主体名单管理办法出台
永泰运(001228.SZ):上半年净利降25.48%至1.03亿元
美国包包品牌有哪些(美国包包品牌大全)
虎落平阳被犬欺全文阅读(虎落平阳被犬欺全文)
泸州泸县:时尚!新潮!特色“夜间经济”受青睐
飞向太空2002 下载(飞向太空2002)
今日5年期以上LPR为何没降?光大固收:未来信贷增长的趋势是明朗的
鄂股半年报丨华灿光电上半年亏损3.64亿元,逐鹿MLED赛道寻求增长点
东阿阿胶桃花姬新品上市 创新开拓多元化市场
中信银行南京分行“信E采”业务助力中小企业高效融资
街头篮球SFSA总决赛四强集结 星C凉茶领衔终极对决
北上资金大幅减仓五粮液 游资集中博弈次新股丨龙虎榜
隆基机械: 截止到2023年8月18日,公司股东人数为41062
锁定七夕首选《燃冬》首映周冬雨刘昊然屈楚萧齐聚
dnf86复古怀旧公益必看版本介绍
ETF午评丨证券板块全线下跌,证券ETF先锋跌3.36%
奕炫MAX 2024款上市,9.79万元起买赛道级家轿值了
市民“随手拍” 城管来解决 常德“全民城管”平台正式上线
陆家嘴周边医院现“医托” 有人高价买了一堆“廉价货”
中欧基金自购5000万元
2023年南宁蔡琴演唱会举办时间
北大孔庆东
中央气象台:8月下旬西南地区陕西南部等地多降雨,中东部无明显高温天气
滕州:荆河街道彰显“人大作为” 助力乡村振兴
水位上涨、桥没护栏?网友发文称其环卫工父母下班途中落水身亡 浙江龙泉市官方回应
生态甘孜 花鸟家园|如果鸟圈有童话,TA就是“白马王子”
山东平安产险:开展“助销农产品 平安暖人心”爱心助农活动
杭州这项隐藏福利冲上热搜第一!是的,真不用花钱,终身免费!
助受灾地区企业恢复运营 央视频联合拼多多推出专场公益直播
音乐美食全都有!普陀梅川路步行街打造夜生活好去处
镇域经济看单县|谢集镇:创新招商思路 拓宽招商渠道 强化项目服务 促进项目落地
单身贵族很脆弱,易患老年痴呆