Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果其中一个赋值的代价必须为无穷大,为什么scipy.optimize中的线性和赋值永远不会返回?_Python_Python 3.x_Numpy_Scipy_Anaconda - Fatal编程技术网

Python 如果其中一个赋值的代价必须为无穷大,为什么scipy.optimize中的线性和赋值永远不会返回?

Python 如果其中一个赋值的代价必须为无穷大,为什么scipy.optimize中的线性和赋值永远不会返回?,python,python-3.x,numpy,scipy,anaconda,Python,Python 3.x,Numpy,Scipy,Anaconda,当使用scipy.optimize.linear_sum_赋值时,如果二部图的代价矩阵设置为其中一个赋值的代价必须为无穷大,则该算法将永远不会返回,并永远挂在那里 在下面的示例中,第一个集合中的第二个顶点将始终具有无穷大的代价,无论它与第二个集合中的哪个顶点匹配。这将导致程序挂起并且从不打印任何内容 cost = np.array([[np.inf, np.inf, 4], [np.inf, np.inf, np.inf],

当使用
scipy.optimize.linear_sum_赋值时
,如果二部图的代价矩阵设置为其中一个赋值的代价必须为无穷大,则该算法将永远不会返回,并永远挂在那里

在下面的示例中,第一个集合中的第二个顶点将始终具有无穷大的代价,无论它与第二个集合中的哪个顶点匹配。这将导致程序挂起并且从不打印任何内容

cost = np.array([[np.inf, np.inf, 4], 
                 [np.inf, np.inf, np.inf], 
                 [np.inf, 4, np.inf]])
row_ind, col_ind = linear_sum_assignment(cost)
print(cost)
print(col_ind)
print(cost[row_ind, col_ind].sum())
然而,我希望我们仍然能够找到一项任务。例如,第一个集合中的第二个顶点仍然可以与第二个集合中的第一个顶点匹配。然后我们将有一个
[2 0 1]
和无穷大的分配总成本

我的问题是,为什么会发生这种情况,我如何防止这种情况发生,并确保
线性求和赋值
始终返回?或者,是否有一种方法可以检测到这种情况发生,而不运行
线性求和赋值
?或者还有其他解决办法吗?

我还想指出,以下成本矩阵也会导致程序不打印任何内容,因此仅确保每行至少有1个非无限成本是不够的

cost = np.array([[np.inf, np.inf, 4], 
                 [np.inf, 4, np.inf], 
                 [np.inf, 4, np.inf]])
最后,下面的成本矩阵很好

cost = np.array([[np.inf, np.inf, 4], 
                 [4, np.inf, np.inf], 
                 [np.inf, 4, np.inf]])
并产生以下输出

[[ inf  inf   4.]
 [  4.  inf  inf]
 [ inf   4.  inf]]
[2 0 1]
12.0
我不认为这是特定于版本的,但如果是,我正在运行Python 3.5.2::Anaconda 4.2.0。

这是当前在
scipy.optimize.linear\u sum\u分配中的一个


如果严格来说没有必要使用无穷大,临时解决方法可以是避免使用无穷大的值,而是使用非常大的数字。小于无穷大的非常大的数字按预期工作。

如果它永远不会返回,那就是一个bug。您可以通过单击“新问题”并描述问题来报告错误。请确保包括scipy版本以及其他信息。它仍然给出了答案,例如,如果所有行都必须选择非常大的值,该怎么办?