Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 晶格路径算法未完成20 X 20网格的运行_Python_Algorithm_Optimization_Complexity Theory - Fatal编程技术网

Python 晶格路径算法未完成20 X 20网格的运行

Python 晶格路径算法未完成20 X 20网格的运行,python,algorithm,optimization,complexity-theory,Python,Algorithm,Optimization,Complexity Theory,我用python编写了以下代码来解决 : grid\u size=2 def get_路径(节点): 全局路径 如果节点[0]>=网格大小且节点[1]>=网格大小: 路径+=1 返回 其他: 如果节点[0],您可能需要研究这个问题背后的数学原理。实际上没有必要遍历所有路由。(事实上,你永远也做不到1分钟那样的成绩) 我可以发布一个提示,但除非你要求,否则我不会发布,因为我不想为你破坏它 编辑: 是的,你使用的算法永远不会是最优的,因为没有办法减少你问题的搜索空间。这意味着(如pg1989所述),

我用python编写了以下代码来解决 :

grid\u size=2
def get_路径(节点):
全局路径
如果节点[0]>=网格大小且节点[1]>=网格大小:
路径+=1
返回
其他:

如果节点[0],您可能需要研究这个问题背后的数学原理。实际上没有必要遍历所有路由。(事实上,你永远也做不到1分钟那样的成绩)

我可以发布一个提示,但除非你要求,否则我不会发布,因为我不想为你破坏它

编辑: 是的,你使用的算法永远不会是最优的,因为没有办法减少你问题的搜索空间。这意味着(如pg1989所述),您必须寻找解决此问题的替代方法

正如sverre所说,看这里可能会朝着正确的方向推进:

可在此处找到直接解决方案(警告,大扰流板):

http://www.joaoff.com/2008/01/20/a-square-grid-path-problem/


这个问题为优化提供了一些很好的见解。代码是用c#编写的,但算法是适用的。不过要小心破坏者


关键不是让算法运行得更快,因为无论每一步有多快,它都(可能)以指数时间运行


也许最好找到另一种计算答案的方法。在算法优化过程中,使用您的(昂贵但正确的)解决方案作为小值的比较可能是一种明智的选择。

您的算法是指数型的,但这只是因为您多次使用相同的输入重新评估get_路径。添加到它将使其及时运行。此外,还需要去掉全局变量,改用返回值。另请参见动态规划,了解类似的想法。

可以通过简单观察小网格的模式,并确定大网格的简单公式来解决此问题。20x20网格有超过1000亿条路径,任何迭代解决方案都会花费太长时间进行计算。

在解决Project Euler的问题时,在开始编码之前,先考虑问题背后的数学。这个问题不需要任何代码就可以解决

我们试图计算通过网格的路径数。如果您观察到无论路径如何,向下和向右移动的次数都不会改变,那么您只需要担心向下和向右移动的顺序。因此,在2x2的情况下,以下组合起作用:

DDRR 
DRDR
RDRD
RRDD
RDDR
DRRD

请注意,如果我们选择放置R移动的位置,则确定D移动的位置。所以实际上,我们只需要从4个可用的移动槽中进行选择,就可以获得R移动。你能想出一个数学运算来解决这个问题吗?

也许不是Euler项目想要解决这个问题的方式,但答案只是一个20x20的网格

使用wiki文章中提供的公式,您可以获得:

from math import factorial, pow
grid = 20
print int(factorial(2 * grid) / pow(factorial(grid), 2))
以下是我的解决方案:

memo = {(0, 1) : 1, (1, 0) : 1}
def get_pathways(x, y):

    if (x, y) in memo : return memo[(x, y)]

    pathways = 0
    if 0 in (x, y):
        pathways = 1
    else:
        pathways = get_pathways(x-1, y) + get_pathways(x, y-1)


    memo[(x, y)] = pathways
    return pathways

享受:)

看,您当前的解决方案是指数型的。这是否意味着,无论我在何种程度上试图优化obove代码,它都不会起作用?即使是,我也很想知道上述代码是否可以优化。您可以整天优化它,但您仍然使用指数时间算法。你需要研究这个问题背后的组合学(特别是图论)。就我个人而言,我一直在说DP。这是一个非常直截了当的安排。是的,我一直都得到这个建议,但事实上,我的数学不是很好,我主要是为了提高编程技能而解决projecteuler问题,这让我避免了太多的数学问题。我真的认为,如果不很好地理解你试图解决的问题背后的数学,就不可能编写优化算法。正如我所说,只要做一点数学运算,我就找到了一种立即解决这个问题的方法,根本不需要任何代码——这是所有算法中最有效的算法。
memo = {(0, 1) : 1, (1, 0) : 1}
def get_pathways(x, y):

    if (x, y) in memo : return memo[(x, y)]

    pathways = 0
    if 0 in (x, y):
        pathways = 1
    else:
        pathways = get_pathways(x-1, y) + get_pathways(x, y-1)


    memo[(x, y)] = pathways
    return pathways