【问题标题】:Is there a more efficient an robust way to create a minimum proximity algorithm for a distance matrix?是否有更有效的鲁棒方法来为距离矩阵创建最小邻近度算法?
【发布时间】:2020-11-16 06:42:10
【问题描述】:

我正在尝试制作一种算法,该算法使用附近的最小距离在距离矩阵中的点到点传播。代码有两个条件:最小距离不小于0,每个点必须访问一次并返回起始位置。

这是我的完整代码:

def totalDistance(aList):
    path = []
    for j in range(0,len(aList)):                  
        k=j
        order = []
        for l in range(0,len(aList)):
                order.append(k)
                initval= min(x for x in aList[k] if x > 0 )
                k = aList[k].index(initval)
                for s in range(0,len(aList)):
                    for t in range(0,len(aList[s])):
                        aList[s][k] = 0
        path.append(order)
    return path  

该代码旨在返回被评估点附近的点的索引。

aList = [[0,3,4,6],[3,0,7,3],[4,7,0,9],[6,3,9,0]],表示距离矩阵。

运行代码时出现以下错误:

initval= min(x for x in aList[k] if x > 0 )

ValueError: min() arg 是一个空序列

我假设当我使用以下函数将距离矩阵中的列设为零时:

            for s in range(0,len(aList)):
                for t in range(0,len(aList[s])):
                    aList[s][k] = 0

min() 函数在给定条件下无法找到值。有没有更好的方法来格式化我的代码,这样就不会发生这种情况,或者有更好的方法一起解决这个问题?

【问题讨论】:

  • 嘿贾斯汀。欢迎来到本站。好消息/坏消息。 :)。好消息:你有一个好的开始,是的,它可以改进一点。 (任何时候你有一个 4 嵌套循环,很可能你没有以正确的方式思考它。)坏消息:你看到的几个错误。首先是几个问题:你打算从哪里开始?总是第一点还是???你有没有想过如何防止它回到原来的状态?
  • 这就是我最终要在这里解决的问题。除了弄清楚如何防止回溯之外,我可以从代码中得到我想要的东西。我尝试嵌套这两个额外的 for 循环以将列更改为零,这样“min()”函数将在进行迭代时将其排除。代码是用一个每个点作为起点。

标签: python python-3.x list propagation


【解决方案1】:

你说的其余部分有效的一种技术和一个指针......

用于防止重新访问/回溯。一种常见的设计模式是保留一个单独的数据结构来“标记”你去过的地方。因为你的点是数字索引的,你可以使用一个布尔列表,但我认为只保留一组你去过的地方要容易得多。像这样的...

visited = set()  # places already seen

# If I decide to visit point/index "3"...
visited.add(3)

在你正在做的时候修改你的输入数据并不是一个很好的做法,尤其是如果你在循环它,你……会让人头疼。

那么...您当前的错误正在发生,因为当您筛选 x>0 的行时,您最终会得到一个空列表,因为您正在更改值,然后 min() 阻塞。所以上面的部分可以解决这个问题,你不需要归零,只需标记它们。

那么,显而易见的问题......如何使用标记?您可以将其用作搜索的一部分。并且可以很好地配合enumerate命令,可以返回索引值和枚举值。

试试这样的方法,它会生成一个包含距离和索引位置的“合格”元组列表。

    pts_to_consider = [(dist, idx) for idx, dist in enumerate(aList[k])
                        if dist > 0
                        and idx not in visited]

还有其他方法可以使用 numpy 和其他东西来做到这一点,但这是一种合理的方法,并且接近您现在在代码中所拥有的方法。如果卡住,请回复评论。我不想放弃整个农场,因为这可能是硬件。也许您可以在这里使用一些提示。

【讨论】:

  • 这很有帮助。非常感谢。
  • 太棒了。我假设您对枚举、元组、排序等感到满意。听起来不错。如果有帮助,您可以使用带阴影的复选标记“接受”答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2011-03-10
  • 2017-11-23
  • 2014-03-07
  • 1970-01-01
  • 2015-12-22
相关资源
最近更新 更多