代码挑战 - 在有限的时间内访问最大节点

时间:2017-03-25 15:29:08

标签: java optimization graph-algorithm

考虑这个样本时序矩阵:(nxn)

{
{0, 2, 2, 2, -1}, 
{9, 0, 2, 2, -1}, 
{9, 3, 0, 2, -1}, 
{9, 3, 2, 0, -1}, 
{9, 3, 2, 2,  0}
}

行0和n分别是起始位置和结束位置。

  • 我需要始终以开始节点和结束节点开始和结束 分别
  • 我可以重新访问节点,因为有时重新访问节点会增加时间 时钟(可能是负时间)
  • 可能存在节点之间的循环只是不断增加时钟的情况。在这种情况下,我可以访问所有其他节点,因为我基本上可以产生时间。

请考虑下表,以获得针对上述特定情况的解决方案:

Start End Delta Time
    -   0     -    1 
    0   4    -1    2
    4   2     2    0
    2   4    -1    1
    4   3     2   -1 
    3   4    -1    0 

之后没有我可以访问的特定节点,因此解决方案是2, 3(因为0和4是开始和结束,必须访问)

我无法为此找到最佳的非暴力算法。

Input: int[][] Timing Matrix, int Time
Output: int[] Visitable Nodes

1 个答案:

答案 0 :(得分:0)

  

最佳非暴力

在最佳和蛮力之间,有很多可能性。我不知道最佳解决方案是什么样的,但我可以提出一个改进而不是蛮力。

Bruteforcing意味着尝试所有可能的路径。这些路径的数量取决于距离,并且由于允许节点重新访问,事情变得更加复杂。忽略这些复杂性,我们可以天真地说有n!个路径需要尝试。

一个微不足道的观察是两个部分路径

start -> a -> b -> c

start -> b -> a -> c

仅在最终可用时间有所不同。因此,对于每组访问节点(此处:{a, b, c})和最终节点(此处:c),您只需跟踪所需的最短时间。这会将天真的复杂性估计值降低到2**n * n,这仍然很糟糕但更好。

关于实施,我要定义

class State {
    final ImmutableSet<Node> visitedNodes;
    final Node finalNode;
    ...
}

Map<State, Integer> bestTimeMap;

并使用它来停止递归,如果在上一次访问具有相同或更好的时间时重新访问状态。