旅行商问题(TSP)与局部搜索算法
本篇为在University of Birmingham 学习Advanced Nature-Inspired Search and Optimisation课程中的笔记之一
This is one of the notes from the Advanced Nature-Inspired Search and Optimisation course at the University of Birmingham
文章目录
- 1 问题引出——旅行商问题
- 1.1 何为旅行商问题 (Travelling salesman problem (TSP))
- 1.2 TSP背景
- 1.3 TSP案例
- 2 方案背景——优化问题
- 2.1 什么是优化(Optimisation)
- 2.2 优化的定义
- 2.3 优化的分类
- 3 方案介绍——局部搜索算法
- 3.1 算法一览
- 3.2 TSP的求解
- 1). 使用线性规划及蛮力算法求解
- 2). 使用线性规划及蛮力算法求解的劣势
- 3). 使用随机算法求解
- 4). 使用局部搜索算法求解
- 4. 总结
1 问题引出——旅行商问题
1.1 何为旅行商问题 (Travelling salesman problem (TSP))
- 给定:城市列表以及每对城市之间的距离,
- 搜寻:最精确的路线,该路线只访问每个城市一次,然后返回出发城市
- 组合优化中的一个NP难题
1.2 TSP背景
- 一本1832年的旅行推销员手册提到了这个问题,并举例说明了在德国和瑞士的旅行情况,但没有进行数学处理。
- 计算机科学和运筹学中最突出,研究最广泛的组合优化问题之一
- 许多优化问题(例如印刷电路板(PSB)设计,即在一块电路板上打成百上千个孔,转头在这些孔之间移动,相当于对所有的孔进行一次巡游。把这个问题转化为TSP,孔相当于城市.孔到孔之问的移动时间就是距离。)可以表述为TSP或其变体
- 从概念上讲简单但计算困难:开发和评估组合优化算法的最佳基准
1.3 TSP案例
- USA13509是TSPLIB中较大的TSP实例之一。它包含美国的13,509个城市(实例被提供给TSPLIB时,所有人口至少为500的城市)。
- UK49687 前往英国几乎所有酒吧的最短游览路线。
- Kaggle Traveling Santa 2018
2 方案背景——优化问题
2.1 什么是优化(Optimisation)
- 优化:找到问题的最佳或最理想的解决方案
- 例如:
- 投资组合优化:您拥有投资组合 (Investment Portfolio),例如现金和股票,您知道每种资产的潜在回报和财务风险。如何建立完善的投资组合以在控制风险的同时最大化回报?
- 工程优化:您需要使用某些材料设计产品。如何在保持质量的同时设计出最少的材料?
2.2 优化的定义
- 优化问题可以通过以下方式表示:
- 给定: 一个函数f(x)f(x)f(x) : A\mathbb{A}A ⟶\longrightarrow⟶ R\mathbb{R}R,from some set A\mathbb{A}A to the real numbers
- 搜寻: 从可行域A\mathbb{A}A中寻找一个变量 x∗x^{*}x∗ ,使得 A\mathbb{A}A 中所有 xxx,有 f(x∗)≤f(x)f(x^{*}) \leq f(x)f(x∗)≤f(x) (最小化) or f(x∗)≥f(x)f(x^{*}) \geq f(x)f(x∗)≥f(x) (最大化)
- 函数f(x)f(x)f(x)被称为目标函数_Objective function,或成本函数_Cost function(最小化),适应度函数_Fitness function(最大化和在进化计算中)
- A\mathbb{A}A被称为可行集(可行域),which is some subset of the Euclidean space specified by a set of constraints
- f(x)f(x)f(x)的可行域A\mathbb{A}A被称为 搜索空间(Search space) ,而A\mathbb{A}A的元素, 例如x∈Ax \in \mathbb{A}x∈A被称为候选解(Candidate solutions)或可行解(Feasible solutions)。
2.3 优化的分类
根据目标函数的性质:
- 线性与非线性
- 线性函数
- 叠加性(Additivity):f(x+y)=f(x)+f(y)f(x +y) = f(x)+f(y)f(x+y)=f(x)+f(y)
- 均匀性(Homogeneity):对于所有的aaa都有 $ f(ax) = af(x)$
- 非线性函数
- 凸优化(Convex): 任何局部最优解即为全局最优解
- 非凸优化(Non-convex): 顺着梯度不一定有全局最优解
- 线性函数
- 多目标与单目标
- 单目标(Single objective),即所评测目标只有一个,只需要根据具体的满足函数条件,求得最值
- 多目标(Multi-objective),需要在权衡两个或多个相互矛盾的目标的情况下做出最佳决策,即多个目标函数同时优化的数学优化问题
- 约束与无约束
- 约束优化(Constrained):在某些变量存在约束的情况下针对某些变量优化目标函数的过程。目标函数是要最小化的成本函数或能量函数,或者是要最大化的奖励函数或效用函数
- 无约束优化(Non-Constrained):即不对定义域或值域做任何限制的情况下,求解函数f(x)f(x)f(x)
的最小值。
- 线性与非线性
根据解决方案的性质:
- 连续(Continuous)
- 数值优化问题: 决策变量的取值往往是连续的,通常是一段连续定义域上的连续函数的函数求得最值的问题。
- 离散(Discrete)
- 组合优化(Combinatorial Optimization): 决策变量是离散的。组合优化问题是对离散变量按照一定评价标准的排序,筛选或分类。
- 连续(Continuous)
3 方案介绍——局部搜索算法
3.1 算法一览
- 分治算法(Divide and conquer algorithms, e.g., quicksort algorithm, Merge-Sort)
- 数学编程算法(Mathematical programming algorithms, e.g., linear programming, Multi-objective programming, Dynamic programming algorithms)
- 搜索和枚举算法(Search and enumeration algorithms)
- 蛮力算法_Brute force algorithms, enumerating all possible candidate solutions and check
- 改进的蛮力算法_Improved brute force algorithms, e.g., branch and bound algorithms
- 启发式算法_Heuristic algorithms
- 局部搜索_Local search, e.g., Hill climbing, Greedy search
- 随机算法_Randomised algorithms, which include Evolutionary Computation, etc.
3.2 TSP的求解
1). 使用线性规划及蛮力算法求解
- 数学规划的求解,参考 线性规划
- 蛮力算法或改进的蛮力算法 参考 分支与边界
2). 使用线性规划及蛮力算法求解的劣势
- 线性规划: 本质上是整数线性规划问题,其本身就是NP难题。 (Why LP cannot solve large instances of NP-complete problems in polynomial time)
- 蛮力算法: 复杂度非常大,O(n!)O(n!)O(n!)
- 改进的蛮力算法: 分枝剪(Branch and Cut algorithm),O(1.9999n)O(1.9999^n)O(1.9999n)
- 依然非常耗时,对于usa13509, 所需的运行时间为2135092^{13509}213509
- 事实上,usa13509在1998年由休斯敦-赖斯大学使用两个包含44个CPU的群集解决,从头到尾花费了大约三个月的时间
- TSP问题的最大实例是在85,900个城市的TSPLIB中,花费了136 CPU年以上的时间
3). 使用随机算法求解
- 随机算法及蒙特卡洛算法和拉斯维加斯算法的介绍
- 不太可行,因为TSP好的解决方案的数量只是所有可行解决方案中很小的,部分–像大海捞针一样
4). 使用局部搜索算法求解
- 局部搜索算法_loacl search algorithm
- 局部搜索_local search:一种用于解决难题的启发式算法
- 想法_Idea:从对解决方案的初步猜测开始,逐步进行改进,直到成为一个解决方案为止
- 增量改进_Incremental improvement:局部更改,例如算法迭代移至邻域解决方案
- 领域解决方案_Neighbour solution:取决于搜索空间上领域关系的定义,但通常基于相似性(距离)度量
#局部搜索算法基本原理
x0 := generate initial solution
terminationflag := false
x := x0
while (terminationflag != true)Modify the current solution to a neighbour one v belongs to A If f (v) < f (x) then x := vIf a termination criterion is met: terminationflag := true
Output x
注意⚠️: 终止条件可能是达到最大迭代次数,或者对于某些迭代没有改善。
爬山算法_Hill climbing algorithm
- 最简单的局部搜索算法之一
- 爬山算法类似于“健忘症患者在浓雾中攀登珠穆朗玛峰”
- 迭代算法:
- 从任意解决问题开始,
- 从当前解决方案的直接领域解决方案迭代搜索更好的解决方案
- 直接领域解决方案(Immediate neighbour solutions):与当前解决方案最相似的解决方案。
- 两种类型的爬山:
- 简单地爬:选择第一个更好的解决方案
- 最陡峭地上升/下降爬:比较所有领域的解决方案并选择最佳的解决方案–贪婪的搜索(广度优先),推荐阅读:Steepest Ascent Hill Climbing For A Mathematical Problem
#简单地爬
x0 := generate initial solution terminationflag := false
x := x0
while (terminationflag != true)Modify the current solution to a immediate neighbour one v belongs to A If f (v) < f (x) then x := vIf a termination criterion is met: terminationflag := true
Output x
4. 总结
- 优化问题可能非常困难
- 启发式算法,尤其是本地搜索对于困难的优化问题很有用
- 优化全在于探索发现
- 随机性可以促进搜索,但不能促进搜索(局部搜索)
旅行商问题(TSP)与局部搜索算法相关推荐
- python实现大规模邻域搜索(LNS)求解旅行商问题(TSP)
文章目录 1. 大规模邻域搜索算法 1.1. LNS定义 1.2. LNS邻域 1.3. LNS框架 2. 旅行商问题TSP 3. python代码示例及结果 1. 大规模邻域搜索算法 参考<H ...
- 5.4 Penalty-Based Local Search Algorithms基于惩罚的局部搜索算法
另一种扩展迭代改进策略的方法是,当搜索过程即将停滞在一个局部极小值时,修改该评估函数[71].这种方法也称为动态本地搜索(Dynamic Local Search, DLS)[52]. 基于惩罚的算法 ...
- C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题
C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...
- 遗传算法解决旅行商问题(TSP)
遗传算法解决旅行商问题(TSP) 参考文章: (1)遗传算法解决旅行商问题(TSP) (2)https://www.cnblogs.com/studylyn/p/5097238.html 备忘一下.
- 人工智能中的局部搜索算法
在局部搜索算法中,我们不再关心从初始节点到目标节点之间的路径,而是考虑从当前节点出发,移动到它的邻近状态,直到到达合理的目标状态.相比于前面所说的无信息搜索算法和有信息搜索算法,局部搜索算法往往能 ...
- 通用局部搜索算法之WALKSAT
通用局部搜索算法之WALKSAT 设施区位及算法 2009-08-28 20:44:47 阅读29 评论0 字号:大中小 通用局部搜索算法之WALKSAT GSAT 和 WalkSat 是用于求解布尔 ...
- k图着色 局部搜索算法与模拟退火算法的python实现
文章目录 前言 如何评价一个解? 通过计算出的冲突来找它的邻居解 数据的格式 局部搜索 概述 补充 代码 模拟退火 概述 补充 代码 总结以及不足之处 前言 这两种算法就不详细介绍了,流程思路比较简单 ...
- 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法
Local search algorithms (局部搜索算法) 局部搜索算法 内存限制 局部搜索算法 示例:n-皇后 爬山算法 随机重启爬山 模拟退火算法 局部剪枝搜索 遗传算法 小结 局部搜索算法 ...
- (Python)模拟退火算法解决旅行商问题(TSP)
两种写法思路,最全备注,第二种个人感觉上理解起来稍容易一点: 第一种: import numpy as np import matplotlib.pyplot as plt import pdb# 解 ...
最新文章
- 解决在ueditor中上传图片通过后台java+SpringMVC添加水印方法
- java常见证书类型和密钥库类型
- 在 iOS 应用中直接跳转到 AppStore 的方法
- gitlab mysql 配置_gitlab的安装与修改端口配置
- Unity3D学习笔记(一) 模型和贴图导入学习
- WCF Testing Tool(转)
- 二、mongodb数据库系列——聚合操作 索引操作 权限管理
- 【今日CV 视觉论文速览】05 Dec 2018
- 苹果Mac Studio 3月18日发售 但法国一用户已提前收货
- JVM系列(之class文件)
- JSON网络传输协议
- Imdisk 虚拟磁盘 » A programmer's site
- m 序列性质的简单证明
- 加法器、半加器、全加器、超前进位加法器
- 记一次走心One 2 One沟通
- 微信屏蔽网址解决办法 微信QQ已经被屏蔽的域名怎么做跳转
- windows桌面程序开发
- 机器学习小组知识点14:均匀分布(Uniform Distribution)
- equal 和 ==
- trainging contest#1(2011大连现场赛)I BY bly