使用Numpy为Python中的二次分配问题实现局部搜索算法,我发现使用for循环最好是有问题的,因为CPython在繁重的数学计算方面非常慢。
我的代码有一个3级嵌套for循环,它迭代一个解决方案(numpy ndarray),遍历一个掩码(numpy ndarray),再次迭代解决方案,然后进行一些计算,这就是麻烦的一点,可能会影响以后的迭代。
我的问题是,是否有可能以某种方式预先计算这个?由于问题的性质,我不太确定。由于问题是二次方,对于小尺寸它是可以接受的,但是超过100个元素导致很多的迭代。
代码如下:
while has_improved and iterations < 100:
for r in range(n):
for b in dlb:
if b: continue
has_improved = False
for s in range(n):
move_cost = cost_fn_delta((flow, distance), solution, r, s)
if move_cost < 0:
# Swap the indices
solution[r], solution[s] = solution[s], solution[r]
cost += move_cost
dlb[r], dlb[s] = False, False
has_improved = True
iterations += 1
if not has_improved:
dlb[r] = True