汉密尔顿回路问题最优化解详细思路

本文介绍了如何解决经典的旅行商问题,即寻找从家出发遍历所有城市一次并返回的最短路径。通过分析汉密尔顿回路,提出了一种优化方法,主要处理图中的交叉点以减少路径长度。通过多次迭代改进,最终实现一个相对最优解。文章附带了Python实现代码。
摘要由CSDN通过智能技术生成

问题背景

经典的旅行商(TSP)问题,一个旅行商人要从家出发分别到周围N座城市售卖货物,每座城市经过一次,且每座城市都要去一次。已知家和城市在地图上的坐标,求一条遍历的最短路径。

解决思路

这是经典的汉密尔顿回路最优解问题,作者采用如下图所示的方法来求解:

算例分析

现在有以下30个点,坐标对应于图上:
在这里插入图片描述
现要求画出一条遍历所有点的线路使得总路径最短。

解决方法

先将所有点按照录入顺序依次连接,观察:
在这里插入图片描述
我们可以发现有很多“X”型的交叉点,十分影响长度,因此利用上述图片的方法主要处理掉图中的交叉点,从而达到优化。
去除交叉点的方式为将交叉点切片中的序列顺序颠倒,比如在“1 2 3 4 5 6 7 8 9 10…”中“2 3”和“6 7”两条线出现交叉,那么将序列改为“1 2 6 5 4 3 7 8 9 10”,这样仅仅优化了“2 3”和“6 7”中的长度,并未改变其它长度。这样再对所有的两段线组合进行遍历优化,以此为一次哈密尔顿循环,重复上述循环有限次,既可以得到一个相对最优解。最后得到的结果为:
在这里插入图片描述

代码

使用Python代码如下:

import xlrd
import math
import matplotlib.pyplot as plt
import numpy as np
import random

workbook=xlrd.open_workbook(r'test.xlsx')       #定义相应的点链和其对应的参数
sheet1=workbook.sheet_by_index(0)
positionXList=[]
positionYList=[]
position=[]
for i in range(0,30):
    x=sheet1.cell(i,0).value
    y=sheet1.cell<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值