Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >贪婪搜索是P=NP之TSP问题的近似解

贪婪搜索是P=NP之TSP问题的近似解

作者头像
Zeusro
修改于 2025-06-20 23:33:59
修改于 2025-06-20 23:33:59
1540
举报
代码语言:TXT
AI代码解释
复制
    Where there is a will there's a way

底层模型

代码语言:go
AI代码解释
复制
package v1

import (
	"math/rand"
	"time"
)

type City struct {
	Coordinates
	Name     string
	Distance float64
}

// Coordinates 经纬度
type Coordinates struct {
	Latitude  float64 `yaml:"latitude"`  //纬度
	Longitude float64 `yaml:"longitude"` //经度
}

// USCities 包含美国各州不同区域的至少 50 个城市
var USCities = []City{
	City{
		Name: "New York",

		Coordinates: Coordinates{
			Latitude:  40.7128,
			Longitude: -74.0060,
		},
		Distance: 0,
	},
	City{
		Name: "Los Angeles",

		Coordinates: Coordinates{
			Latitude:  34.0522,
			Longitude: -118.2437,
		},
		Distance: 0,
	},
	City{
		Name: "Chicago",

		Coordinates: Coordinates{
			Latitude:  41.8781,
			Longitude: -87.6298,
		},
		Distance: 0,
	},
	City{
		Name: "Houston",

		Coordinates: Coordinates{
			Latitude:  29.7604,
			Longitude: -95.3698,
		},
		Distance: 0,
	},
	City{
		Name: "Phoenix",

		Coordinates: Coordinates{
			Latitude:  33.4484,
			Longitude: -112.0740,
		},
		Distance: 0,
	},
	City{
		Name: "Philadelphia",

		Coordinates: Coordinates{
			Latitude:  39.9526,
			Longitude: -75.1652,
		},
		Distance: 0,
	},
	City{
		Name: "San Antonio",

		Coordinates: Coordinates{
			Latitude:  29.4241,
			Longitude: -98.4936,
		},
		Distance: 0,
	},
	City{
		Name: "San Diego",

		Coordinates: Coordinates{
			Latitude:  32.7157,
			Longitude: -117.1611,
		},
		Distance: 0,
	},
	City{
		Name: "Dallas",

		Coordinates: Coordinates{
			Latitude:  32.7767,
			Longitude: -96.7970,
		},
		Distance: 0,
	},
	City{
		Name: "San Jose",

		Coordinates: Coordinates{
			Latitude:  37.3382,
			Longitude: -121.8863,
		},
		Distance: 0,
	},
	City{
		Name: "Austin",

		Coordinates: Coordinates{
			Latitude:  30.2672,
			Longitude: -97.7431,
		},
		Distance: 0,
	},
	City{
		Name: "Jacksonville",

		Coordinates: Coordinates{
			Latitude:  30.3322,
			Longitude: -81.6557,
		},
		Distance: 0,
	},
	City{
		Name: "Fort Worth",

		Coordinates: Coordinates{
			Latitude:  32.7555,
			Longitude: -97.3308,
		},
		Distance: 0,
	},
	City{
		Name: "Columbus",

		Coordinates: Coordinates{
			Latitude:  39.9612,
			Longitude: -82.9988,
		},
		Distance: 0,
	},
	City{
		Name: "Charlotte",

		Coordinates: Coordinates{
			Latitude:  35.2271,
			Longitude: -80.8431,
		},
		Distance: 0,
	},
	City{
		Name: "San Francisco",

		Coordinates: Coordinates{
			Latitude:  37.7749,
			Longitude: -122.4194,
		},
		Distance: 0,
	},
	City{
		Name: "Indianapolis",

		Coordinates: Coordinates{
			Latitude:  39.7684,
			Longitude: -86.1581,
		},
		Distance: 0,
	},
	City{
		Name: "Seattle",

		Coordinates: Coordinates{
			Latitude:  47.6062,
			Longitude: -122.3321,
		},
		Distance: 0,
	},
	City{
		Name: "Denver",

		Coordinates: Coordinates{
			Latitude:  39.7392,
			Longitude: -104.9903,
		},
		Distance: 0,
	},
	City{
		Name: "Washington",

		Coordinates: Coordinates{
			Latitude:  38.9072,
			Longitude: -77.0369,
		},
		Distance: 0,
	},
	City{
		Name: "Boston",

		Coordinates: Coordinates{
			Latitude:  42.3601,
			Longitude: -71.0589,
		},
		Distance: 0,
	},
	City{
		Name: "El Paso",

		Coordinates: Coordinates{
			Latitude:  31.7619,
			Longitude: -106.4850,
		},
		Distance: 0,
	},
	City{
		Name: "Nashville",

		Coordinates: Coordinates{
			Latitude:  36.1627,
			Longitude: -86.7816,
		},
		Distance: 0,
	},
	City{
		Name: "Detroit",

		Coordinates: Coordinates{
			Latitude:  42.3314,
			Longitude: -83.0458,
		},
		Distance: 0,
	},
	City{
		Name: "Oklahoma City",

		Coordinates: Coordinates{
			Latitude:  35.4676,
			Longitude: -97.5164,
		},
		Distance: 0,
	},
	City{
		Name: "Portland",

		Coordinates: Coordinates{
			Latitude:  45.5051,
			Longitude: -122.6750,
		},
		Distance: 0,
	},
	City{
		Name: "Las Vegas",

		Coordinates: Coordinates{
			Latitude:  36.1699,
			Longitude: -115.1398,
		},
		Distance: 0,
	},
	City{
		Name: "Memphis",

		Coordinates: Coordinates{
			Latitude:  35.1495,
			Longitude: -90.0490,
		},
		Distance: 0,
	},
	City{
		Name: "Louisville",

		Coordinates: Coordinates{
			Latitude:  38.2527,
			Longitude: -85.7585,
		},
		Distance: 0,
	},
	City{
		Name: "Baltimore",

		Coordinates: Coordinates{
			Latitude:  39.2904,
			Longitude: -76.6122,
		},
		Distance: 0,
	},
	City{
		Name: "Milwaukee",

		Coordinates: Coordinates{
			Latitude:  43.0389,
			Longitude: -87.9065,
		},
		Distance: 0,
	},
	City{
		Name: "Albuquerque",

		Coordinates: Coordinates{
			Latitude:  35.0844,
			Longitude: -106.6504,
		},
		Distance: 0,
	},
	City{
		Name: "Tucson",

		Coordinates: Coordinates{
			Latitude:  32.2226,
			Longitude: -110.9747,
		},
		Distance: 0,
	},
	City{
		Name: "Fresno",

		Coordinates: Coordinates{
			Latitude:  36.7378,
			Longitude: -119.7871,
		},
		Distance: 0,
	},
	City{
		Name: "Mesa",

		Coordinates: Coordinates{
			Latitude:  33.4152,
			Longitude: -111.8315,
		},
		Distance: 0,
	},
	City{
		Name: "Sacramento",

		Coordinates: Coordinates{
			Latitude:  38.5816,
			Longitude: -121.4944,
		},
		Distance: 0,
	},
	City{
		Name: "Atlanta",

		Coordinates: Coordinates{
			Latitude:  33.7490,
			Longitude: -84.3880,
		},
		Distance: 0,
	},
	City{
		Name: "Kansas City",

		Coordinates: Coordinates{
			Latitude:  39.0997,
			Longitude: -94.5786,
		},
		Distance: 0,
	},
	City{
		Name: "Colorado Springs",

		Coordinates: Coordinates{
			Latitude:  38.8339,
			Longitude: -104.8214,
		},
		Distance: 0,
	},
	City{
		Name: "Miami",

		Coordinates: Coordinates{
			Latitude:  25.7617,
			Longitude: -80.1918,
		},
		Distance: 0,
	},
	City{
		Name: "Raleigh",

		Coordinates: Coordinates{
			Latitude:  35.7796,
			Longitude: -78.6382,
		},
		Distance: 0,
	},
	City{
		Name: "Omaha",

		Coordinates: Coordinates{
			Latitude:  41.2565,
			Longitude: -95.9345,
		},
		Distance: 0,
	},
	City{
		Name: "Long Beach",

		Coordinates: Coordinates{
			Latitude:  33.7701,
			Longitude: -118.1937,
		},
		Distance: 0,
	},
	City{
		Name: "Virginia Beach",

		Coordinates: Coordinates{
			Latitude:  36.8529,
			Longitude: -75.9780,
		},
		Distance: 0,
	},
	City{
		Name: "Oakland",

		Coordinates: Coordinates{
			Latitude:  37.8044,
			Longitude: -122.2711,
		},
		Distance: 0,
	},
	City{
		Name: "Minneapolis",

		Coordinates: Coordinates{
			Latitude:  44.9778,
			Longitude: -93.2650,
		},
		Distance: 0,
	},
	City{
		Name: "Tulsa",

		Coordinates: Coordinates{
			Latitude:  36.1539,
			Longitude: -95.9928,
		},
		Distance: 0,
	},
	City{
		Name: "Arlington",

		Coordinates: Coordinates{
			Latitude:  32.7357,
			Longitude: -97.1081,
		},
		Distance: 0,
	},
	City{
		Name: "New Orleans",

		Coordinates: Coordinates{
			Latitude:  29.9511,
			Longitude: -90.0715,
		},
		Distance: 0,
	},
	City{
		Name: "Wichita",

		Coordinates: Coordinates{
			Latitude:  37.6872,
			Longitude: -97.3301,
		},
		Distance: 0,
	},
}

// RandomUSCity 生成一个随机的美国城市示例
func RandomUSCity() City {
	// 示例城市列表(可扩展)
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	return USCities[r.Intn(len(USCities))]
}

func IsInContinentalUS(lat, lon float64) bool {
	return lat >= 24.5 && lat <= 49.4 && lon >= -124.8 && lon <= -66.9
}

主体函数

代码语言:go
AI代码解释
复制
package v2

import (
	"math"

	"github.com/zeusro/system/function/local"
	v1 "github.com/zeusro/system/problems/np/model/v1"
)

type Salesman struct {
	TodoCity map[string]v1.City // 计划旅行的所有城市列表
	Plan     []v1.City          // 实际执行的旅行计划,是一个环形队列,这里简单用数组表示
	KURO     float64            // KURO是日本动画《K》里面的一个角色,这里用来表示旅行的总距离,是一种浪漫主义表达手法
	Truth    bool               //问题是否可解
}

func NewSalesman(cities []v1.City) *Salesman {
	if len(cities) < 2 {
		panic("至少需要两个城市才能进行旅行")
	}
	s := &Salesman{
		TodoCity: make(map[string]v1.City),
	}
	// 拿到"地图",获取USA所有城市背景之后,直接map化
	// 初始化旅行城市列表
	for _, c := range cities {
		s.TodoCity[c.Name] = c
	}
	s.Plan = make([]v1.City, len(cities)+1) // 预分配空间,+1是为了回到起点城市
	return s
}

// Travel 踏上寻找n的旅程
func (s *Salesman) TravelN(cityName string, n int) {
	// 上一次的目的地是这一次的起点城市。0比较特殊,代表出发城市。
	// 起点城市不在旅行计划中
	current := s.TodoCity[cityName]
	if n >= 1 {
		s.Plan[n] = current
	}
	delete(s.TodoCity, cityName) //由于计划是单线程,不用考虑线程安全
	//边界的判断条件是剩余旅行城市=0
	if n == 0 {
		s.Plan[0] = s.Plan[len(s.Plan)-1] // 确保最后一个城市是起点城市
		return
	}
	var nextCity v1.City
	minDistance := math.MaxFloat64
	for _, city := range s.TodoCity {
		distance := local.Haversine(city.Latitude, city.Longitude, current.Latitude, current.Longitude)
		if distance < minDistance {
			minDistance = distance
			nextCity = city
		}
	}
	s.Plan[n].Distance = minDistance
	s.KURO += minDistance                     // 累加距离
	s.TravelN(nextCity.Name, len(s.TodoCity)) // 递归调用
}

func (s *Salesman) GetK() float64 {
	if s.IsSolvable(s.Plan) {
		return s.KURO
	}
	return 0
}

func (s *Salesman) IsSolvable(city []v1.City) bool {
	if len(s.TodoCity) == 0 && len(s.Plan) == (len(city)+1) {
		s.Truth = true
	}
	return s.Truth
}

辅助方法

代码语言:go
AI代码解释
复制
// haversine 📌 Haversine 公式:计算地球上两点的距离
// 传入两点的经纬度,返回两点之间的距离(单位:公里)
func Haversine(lat1, lon1, lat2, lon2 float64) float64 {
	const R = 6371 // 地球半径(单位:公里)

	dLat := degreesToRadians(lat2 - lat1)
	dLon := degreesToRadians(lon2 - lon1)

	a := math.Sin(dLat/2)*math.Sin(dLat/2) +
		math.Cos(degreesToRadians(lat1))*math.Cos(degreesToRadians(lat2))*
			math.Sin(dLon/2)*math.Sin(dLon/2)

	c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))
	return R * c
}

func degreesToRadians(deg float64) float64 {
	return deg * math.Pi / 180
}

测试用例

代码语言:go
AI代码解释
复制
package v2

import (
	"fmt"
	"testing"

	v1 "github.com/zeusro/system/problems/np/model/v1"
)

// 不打印
// ok  	github.com/zeusro/system/problems/np/model/v2	0.265s
// 打印
// ok  	github.com/zeusro/system/problems/np/model/v2	0.455s
func TestTravelN(t *testing.T) {
	s := NewSalesman(v1.USCities)
	// current := ConvertCityFromV1(v1.RandomUSCity())
	current := v1.USCities[0]
	// 直接指定起点城市,避免随机性
	s.TravelN(current.Name, len(s.TodoCity))
	if !s.IsSolvable(v1.USCities) {
		t.Fatal("旅行计划不可行")
	}
	start := 0
	for i := len(s.Plan) - 1; i > 0; i-- {
		fmt.Printf("%v:%+v\n", start, s.Plan[i])
		start++
	}
	fmt.Printf("跨越漫长的旅程(%v km),终于见到KURO\n", s.KURO)
}

// BenchmarkTravelN-8   	   15686	     74104 ns/op	   14696 B/op	       9 allocs/op
func BenchmarkTravelN(b *testing.B) {
	for i := 0; i < b.N; i++ {
		s := NewSalesman(v1.USCities)
		current := v1.RandomUSCity()
		s.TravelN(current.Name, len(s.TodoCity))
	}
}

数学证明

代码语言:txt
AI代码解释
复制
1:t=0
2:x=x && y=y && z=z && 1=1
3:P!=NP

在当前的数学符号系统里面,该问题不可解。

所有解法,只能无限逼近全局最优解。

https://github.com/zeusro/math/blob/main/it/P%3DNP.md

结论

代码语言:TXT
AI代码解释
复制
    踏上旅程,寻找真我

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在多维数学中证明P=NP问题
在多维宇宙中 P=NP 问题可以简化为 P=P的问题,将所有的非线性规划,转换为基于n维线段的线性规划,因此问题可解。
Zeusro
2025/06/16
1730
在多维数学中证明P=NP问题
用遗传算法解决TSP问题
在这个问题中,我们的个体就是一条一条的路线了,其目的就是找到一条总距离最短的路线。基本步骤与前两篇文章基本类似,不过在本问题中,我们用城市路线中每个城市的经纬度来表示个体(城市路线)的DNA。 在产生后代的过程中,需要注意的是,因为我们的个体是路线,所以不能将两个父本的样本进行随机交换,因为如果随机交换,就会出现路线重复的问题,比如说,有两个父本[2,1,0,3]和[3,0,1,2],若将第一个元素进行交换得到一个后代[3,1,0,3]或者[2,0,1,2],这就表示去过3号城市去了两次或2号城市去了两次,
用户3577892
2020/06/12
7220
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/03/25
9420
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
微信附近人提取v3脚本,v3微信附近人id提取技术,最新插件技术分享
下载地址: https://www.pan38.com/share.php?code=pvvmX      提取码:8888
用户11701393
2025/06/22
1230
掌握这7种Python数据图表的区别,你就是大牛数据分析师!
Python 的科学栈相当成熟,各种应用场景都有相关的模块,包括机器学习和数据分析。数据可视化是发现数据和展示结果的重要一环,只不过过去以来,相对于 R 这样的工具,发展还是落后一些。 幸运的是,过去几年出现了很多新的Python数据可视化库,弥补了一些这方面的差距。matplotlib 已经成为事实上的数据可视化方面最主要的库,此外还有很多其他库,例如vispy,bokeh, seaborn, pyga, folium 和 networkx,这些库有些是构建在 matplotlib 之上,还有些有其他
小小科
2018/05/03
1.6K0
掌握这7种Python数据图表的区别,你就是大牛数据分析师!
使用Python实现深度学习模型:智能旅游路线规划
旅游路线规划是旅行中一个重要的环节。通过合理的路线规划,可以最大化地利用时间,参观更多的景点,同时减少不必要的时间浪费。本文将详细介绍如何使用Python实现一个智能旅游路线规划系统,并结合深度学习模型来提升其功能。
Echo_Wish
2024/09/20
2K0
使用Python实现深度学习模型:智能旅游路线规划
【SQL周周练】:利用行车轨迹分析犯罪分子作案地点
大家好,我是“蒋点数分”,多年以来一直从事数据分析工作。从今天开始,与大家持续分享关于数据分析的学习内容。
蒋点数分
2025/05/17
690
【SQL周周练】:利用行车轨迹分析犯罪分子作案地点
go grpc 深入笔记
取消RPC客户端或服务器可以随时取消调用。 取消立即终止RPC。 它不是一个“撤消”:取消之前所做的更改将不会被回滚。
solate
2019/07/19
1.8K0
百度地图自定义marker(图标),layer(覆盖层)
本文只要涉及的内容有,web中动态引入百度地图,基于百度地图的本地搜索(公交,地铁,停车场),自定义marker,layer,接入微信内置地图(微信中使用第三方导航)。
j_bleach
2019/07/02
5K0
百度地图自定义marker(图标),layer(覆盖层)
数学建模——农村公交与异构无人机协同配送优化
农村地区因其复杂多变的地形、稀疏的道路网络以及分散的配送点,传统配送方式效率低下,成本高昂,难以满足日益增长的配送需求。随着无人机技术迅猛发展和在物流领域的广泛应用,一种全新的配送模式应运而生——农村公交与异构无人机协同配送模式。
小李很执着
2024/06/15
1.8K1
数学建模——农村公交与异构无人机协同配送优化
数学-建模———A 农村公交与异构无人机协同配送优化
农村地区因其复杂多变的地形、稀疏的道路网络以及分散的配送点,传统配送方式效率低下,成本高昂,难以满足日益增长的配送需求。随着无人机技术迅猛发展和在物流领域的广泛应用,一种全新的配送模式应运而生——农村公交与异构无人机协同配送模式。
小李很执着
2024/06/15
3.3K1
数学-建模———A 农村公交与异构无人机协同配送优化
站间距计算工具V2
目的一:解决不同网络站点之间的距离计算,比如要计算全网GSM共站址的LTE站点;
用户6184845
2019/12/29
1.9K0
Python实现经纬度换算+计算两地距离+地理可视化(代码全分享)
大家好,我是小五🧐 前几天我发了一篇文章《啊?北京确诊病例曾距离我650米!》,文中提到了如何使用Python获取坐标点的经纬度,计算坐标点间的距离,以及地理可视化等。其实里面的内容主要摘自本文,所以今天干脆把原文发出来👇 ---- 故事的起因:小五的驾驶证在今年有效期满了,需要提交体检信息才可以进行换证。那么哪些医院是支持驾驶员体检的呢? 打开北京市公安局公安交通管理局,可以查到对应的体检医院。网址:http://jtgl.beijing.gov.cn/jgj/qtym/1734494/index.h
快学Python
2022/03/23
3.4K0
Python实现经纬度换算+计算两地距离+地理可视化(代码全分享)
从 CPU 切换到 GPU 进行纽约出租车票价预测
你有没有问过数据科学家是否希望他们的代码运行得更快?询问地球是否是平的,您可能会得到更多样化的回答。它确实与技术领域的其他任何事物没有任何不同,几乎总是越快越好。显着改善处理时间的最佳方法之一是(如果您还没有的话)从 CPU 切换到 GPU。感谢 Andrew NG 和 Fei-Fei Li 等先驱,GPU 因在深度学习技术方面表现特别出色而成为头条新闻。
大数据杂货铺
2021/12/08
2.5K0
从 CPU 切换到 GPU 进行纽约出租车票价预测
Java 根据经纬度计算两点之间的距离
package xxx.driver.business.utils; /** * <p>Represents a point on the surface of a sphere. (The Earth is almost * spherical.)</p> * * <p>To create an instance, call one of the static methods fromDegrees() or * fromRadians().</p> * * <p>This code wa
WindWant
2020/09/11
2.3K0
Geo-fencing算法
Geo-fencing,中文常译为地理围栏,是一种基于地理位置的虚拟边界技术。它通过GPS、Wi-Fi信号、蓝牙信标或者移动网络等定位技术,确定设备或对象的位置,并在该位置与预设的地理区域发生交集时触发特定事件或操作。这种技术广泛应用于推送通知、追踪、安全监控、营销活动等领域。
七条猫
2024/09/14
5410
Geo-fencing算法
ARKit和CoreLocation
演示代码 ARKit和CoreLocation:第一部分 ARKit和CoreLocation:第二部分 ARKit和CoreLocation:第三部分
iOSDevLog
2018/09/20
1.6K0
ARKit和CoreLocation
【flink training】 打车热点区域实时统计PopularPlaces
http://training.data-artisans.com/是Apache Flink商业公司DataArtisans提供的一个flink学习平台,主要提供了一些业务场景和flink api结合的case。本文摘取其中一个计算出租车上/下客人热点区域demo进行分析。
sanmutongzi
2020/03/04
9470
【flink training】 打车热点区域实时统计PopularPlaces
风云卫星AWX格式读取与可视化
近期需要读取awx格式数据,气象家园有人提到axw有对应的库,故测试一下awx的示例脚本 并作些简单美化
用户11172986
2024/06/20
7690
风云卫星AWX格式读取与可视化
两个气象雷达库的简单使用
项目地址:https://pycwr.readthedocs.io/en/latest/draw.html
用户11172986
2024/06/20
7220
两个气象雷达库的简单使用
推荐阅读
相关推荐
在多维数学中证明P=NP问题
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档