- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想计算从文件中读入的距离表中两个值之间的差值,该文件是一个 csv 文件,其中包含许多城市以及它们之间的距离。在 .csv 文件中,第一行是城市, 像这样:
Barcelona;Belgrade;Berlin
下一行是城市之间的距离,写成这样:
0;1528.13;1497.61
1528.13;0;999.25
1497.61;999.25;0
比如巴塞罗那到巴塞罗那的距离是0,(第一个数字),巴塞罗那到贝尔格莱德的距离是1528.13,(第二个),贝尔格莱德到柏林的距离是999.25..等
我正在尝试创建一种算法来搜索通过文件中所有城市的最短路径,就像这样。但我将需要使用 Python,可能还需要使用 itertools 的排列组合。
我不知道如何正确使用排列,以便将不同可能性的距离加在一起。我该怎么做?
所以我正在导入排列、csv、读取文件,然后从这里开始......
from itertools import permutations
import csv
# Read data file
distance_table = []
with open('european_cities.csv') as file:
reader = csv.reader(file,delimiter=';')
# First row is the city names
city_names = reader.next()
# The rest of the rows are the distance table
for row in reader:
distance_table.append([float(cell) for cell in row])
所以现在我可以例如从 distance_table 中看到城市 A 和城市 B 之间的距离,如下所示:
distance_table[city_A][city_B]
当我只希望每个城市出现一次时,如何遍历排列中的所有组合?
我想要例如:cityA-cityB + cityB-cityC + cityC-cityA而不是:cityA-cityB + cityA-cityC + cityB-cityC + cityC-cityA 等等。 . .
我想在这里使用不同的算法,首先是一个愚蠢的算法,通过暴力来查看它与更聪明的算法(如最短路径算法)之间的时间差异。
但我不知道如何在城市中循环。怎么办?
最佳答案
您说您希望没有任何城市的所有排列出现两次,但您的示例在末尾再次列出了起始城市 (cityA):
I want for example: cityA-cityB + cityB-cityC + cityC-cityA
因此,假设最后再次出现的第一个城市实际上就是您的意思,我认为以下内容展示了您如何生成所需的城市排列——如果该假设错误,只需删除第一个所在的那一行城市重复。
为了获得不同的总距离(三个始终相同),我添加了第四个城市并更改了输出格式,使其更紧凑以更好地容纳更多城市。
Barcelona;Belgrade;Berlin;Brussels
0;1528.13;1497.61;1346.0
1528.13;0;999.25;1723.0
1497.61;999.25;0;764.0
1346.0;1723.0;764.0;0
代码如下:
from __future__ import print_function
import csv
import functools
try:
from itertools import izip, imap
except ImportError: # Python 3
izip = zip
imap = map
from itertools import permutations, repeat
# Create a distance dictionary from csv data file with entries like this:
# (city_a, city_b): float(distance-between-city_a-and-city_b)
# for all pairs of city names in the file.
data_filename = 'european_cities.csv'
dist_dict = {}
with open(data_filename, 'r') as file:
reader = csv.reader(file, delimiter=';')
cities = next(reader) # header row
num_cities = len(cities)
for city in cities: # should be a row of distances for each city
from_city_iter = repeat(city, num_cities)
dist_dict.update((pair for pair in izip(izip(from_city_iter, cities),
imap(float, next(reader)))
if pair[1])) # skip 0 distances (city_a == city_b)
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2,s3), ..."
a, b = iter(iterable), iter(iterable)
next(b) # advance second iterator one iteration
return izip(a, b)
for tour in permutations(cities, len(cities)):
tour += (tour[0],) # make round trip by appending starting city
route = '->'.join(tour)
dist = sum(dist_dict[city_a, city_b] for city_a, city_b in pairwise(tour))
print('{:^49}: {:,}'.format(route, dist))
输出:
Barcelona->Belgrade->Berlin->Brussels->Barcelona : 4,637.38
Barcelona->Belgrade->Brussels->Berlin->Barcelona : 5,512.74
Barcelona->Berlin->Belgrade->Brussels->Barcelona : 5,565.86
Barcelona->Berlin->Brussels->Belgrade->Barcelona : 5,512.74
Barcelona->Brussels->Belgrade->Berlin->Barcelona : 5,565.86
Barcelona->Brussels->Berlin->Belgrade->Barcelona : 4,637.38
Belgrade->Barcelona->Berlin->Brussels->Belgrade : 5,512.74
Belgrade->Barcelona->Brussels->Berlin->Belgrade : 4,637.38
Belgrade->Berlin->Barcelona->Brussels->Belgrade : 5,565.86
Belgrade->Berlin->Brussels->Barcelona->Belgrade : 4,637.38
Belgrade->Brussels->Barcelona->Berlin->Belgrade : 5,565.86
Belgrade->Brussels->Berlin->Barcelona->Belgrade : 5,512.74
Berlin->Barcelona->Belgrade->Brussels->Berlin : 5,512.74
Berlin->Barcelona->Brussels->Belgrade->Berlin : 5,565.86
Berlin->Belgrade->Barcelona->Brussels->Berlin : 4,637.38
Berlin->Belgrade->Brussels->Barcelona->Berlin : 5,565.86
Berlin->Brussels->Barcelona->Belgrade->Berlin : 4,637.38
Berlin->Brussels->Belgrade->Barcelona->Berlin : 5,512.74
Brussels->Barcelona->Belgrade->Berlin->Brussels : 4,637.38
Brussels->Barcelona->Berlin->Belgrade->Brussels : 5,565.86
Brussels->Belgrade->Barcelona->Berlin->Brussels : 5,512.74
Brussels->Belgrade->Berlin->Barcelona->Brussels : 5,565.86
Brussels->Berlin->Barcelona->Belgrade->Brussels : 5,512.74
Brussels->Berlin->Belgrade->Barcelona->Brussels : 4,637.38
关于python - 我想用排列计算 "distance_table = []"中两个值之间的差值,在这种情况下如何正确使用排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795657/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!