我试图使用 numpy 在x和y轴上的0到100之间的笛卡尔网格上的100个随机点的旅行商问题的解决方案的简单近似方法
我创建了各种独特的整数并填充了三个列表:
xList = [np.round(np.random.rand()*100)] #Generates random x,y coordinates
yList = [np.round(np.random.rand()*100)]
orderList = [np.round(np.random.rand()*100)]
我已经定义了一个函数,可以找到笛卡尔平面上两点之间的最短距离:
def distance(x1, x2, y1, y2):
return np.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))
然后我遍历此列表以查找特定路径在点之间随机传播的总长度:
totalLength = 0
for i in range(0, 98):
stuff = distance(int(xList[orderList[i]]), int(xList[orderList[i+1]]), int(yList[orderList[i]]), int(yList[orderList[i+1]]))
totalLength = totalLength + stuff
shortestLength = totalLength
似乎打字是我的预定义函数获取消息的问题:
stuff = distance(int(xList[orderList[i]]), int(xList[orderList[i+1]]), int(yList[orderList[i]]), int(yList[orderList[i+1]]))***
TypeError: list indices must be integers, not numpy.float64
我不知道如何在python中正确定义类型,所以我想要一些关于将float.numpy64
类型转换为整数或允许我的预定义函数适用于正确类型的建议。
答案 0 :(得分:0)
numpy.round
不会产生整数:
> print(type(np.round(13.4)))
<type 'numpy.float64'>
可能的解决方案:
> int(np.round(13.4))
13 # type int
> np.int(13.4)
13 # type int
> math.trunc(13.4)
13 # type int
请考虑以下重构代码:
import numpy as np
import random
import scipy.spatial.distance as distance
points = np.rollaxis(np.random.randn(2, 100), 1)
indices = range(points.size)
# distance.euclidean(points[5], points[10])
答案 1 :(得分:0)
你的orderList
应该是一个整数的numpy数组(或普通的Python列表),而不是随机的浮点数。
我认为它应该是0到100范围内的混合数字列表。您可以在纯Python中构建这样的列表,如下所示:
import random
listsize = 10
orderList = list(range(listsize))
random.shuffle(orderList)
print(orderList)
典型输出
[6, 5, 1, 2, 0, 4, 9, 3, 7, 8]
(我已将listsize
设置为10以保持输出小。)
您还可以将Numpy数组传递给random.shuffle
:
import random
import numpy as np
listsize = 10
orderList = np.arange(listsize)
random.shuffle(orderList)
print(orderList)
典型输出
[6 9 0 1 3 7 2 5 8 4]
此orderList
元素的 dtype 是int32。
实际上,Numpy有自己的random.shuffle功能,因此您可以使用
替换上一个代码段中的random.shuffle(orderList)
np.random.shuffle(orderList)