增加大小/参数的递归循环(Hamiltonian Paths?)Python

时间:2016-07-02 19:24:53

标签: python algorithm recursion geopy

我有一个代码,它接受scene.getStylesheets().add(Client.class.getResource("main.css").toExternalForm()); 个输入并计算它们之间的最短距离,而无需重新访问同一个点两次。我认为这与汉密尔顿路径问题相同。

我的代码将n地址作为输入,并迭代所有可能的组合而不重复。现在我有蛮力的'方法,其中每个循环抓取开始/结束位置,计算距离,排除复制的位置,然后添加仅访问我的Df的每个点的路径。由于有5个位置,因此第5个嵌套for循环块会将序列和距离写入DF。

DF值:

n

我的代码如下:

Index   Type    start_point
0       Start   (38.9028613352942, -121.339977998194)
1       A       (38.8882610961556, -121.297759)
2       B       (38.9017768701178, -121.328815149117)
3       C       (38.902337877551, -121.273244306122)
4       D       (38.8627754142291, -121.313577618114)
5       E       (38.882338375, -121.277366625)

有没有办法使用递归代码来构建这个结构?作为化学工程师,我不在我的联盟中;)

例如:if语句的数量(用于检查顺序重复的from geopy.distance import vincenty import pandas as pd master=pd.DataFrame() master['locations']='' master['distance']='' n=0 df1a=source[source.Type != source.loc[0,'Type']] df1a=df1a.reset_index(drop=True) for i1a in df1a.index: i1_master=vincenty(source.loc[0,'start_point'],df1a.loc[i1a,'start_point']).mile s for i2 in df1a.index: df2a=df1a[df1a.Type != df1a.loc[i2,'Type']] df2a=df2a.reset_index(drop=True) for i2a in df2a.index: if df1a.loc[i1a,'Type']==df2a.loc[i2a,'Type']: break else: i2_master=i1_master+vincenty(df1a.loc[i1a,'start_point'],df2a.loc[i2a,'start_point']).miles for i3 in df2a.index: df3a=df2a[df2a.Type != df2a.loc[i3,'Type']] df3a=df3a.reset_index(drop=True) for i3a in df3a.index: if df1a.loc[i1a,'Type']==df3a.loc[i3a,'Type']: break if df2a.loc[i2a,'Type']==df3a.loc[i3a,'Type']: break else: i3_master=i2_master+vincenty(df2a.loc[i2a,'start_point'],df3a.loc[i3a,'start_point']).miles for i4 in df3a.index: df4a=df3a[df3a.Type != df3a.loc[i4,'Type']] df4a=df4a.reset_index(drop=True) for i4a in df4a.index: if df1a.loc[i1a,'Type']==df4a.loc[i4a,'Type']: break if df2a.loc[i2a,'Type']==df4a.loc[i4a,'Type']: break if df3a.loc[i3a,'Type']==df4a.loc[i4a,'Type']: break else: i4_master=i3_master+vincenty(df3a.loc[i3a,'start_point'],df4a.loc[i4a,'start_point']).miles for i5 in df4a.index: df5a=df4a[df4a.Type != df4a.loc[i5,'Type']] df5a=df5a.reset_index(drop=True) for i5a in df5a.index: if df1a.loc[i1a,'Type']==df5a.loc[i5a,'Type']: break if df2a.loc[i2a,'Type']==df5a.loc[i5a,'Type']: break if df3a.loc[i3a,'Type']==df5a.loc[i5a,'Type']: break if df4a.loc[i4a,'Type']==df5a.loc[i5a,'Type']: break if df4a.loc[i4a,'Type']==df5a.loc[i5a,'Type']: break else: i5_master=i4_master+vincenty(df4a.loc[i4a,'start_point'],df5a.loc[i5a,'start_point']).miles #This loop is special, it calculates distance back to the start. for i5 in df4a.index: df5a=df4a[df4a.Type != df4a.loc[i5,'Type']] df5a=df5a.reset_index(drop=True) for i5a in df5a.index: master.loc[n,'locations']=source.loc[0,'Type']+'_'+df1a.loc[i1a,'Type']+'_'+df2a.loc[i2a,'Type']+'_'+df3a.loc[i3a,'Type']+'_'+df4a.loc[i4a,'Type']+'_'+df5a.loc[i5a,'Type']+'_'+source.loc[0,'Type'] master.loc[n,'distance']=i5_master+vincenty(df5a.loc[i5a,'start_point'],df1a.loc[0,'start_point']).miles n=n+1 )在每个部分中增加,并且在参数方面有所变化。

赞赏任何其他指示。

1 个答案:

答案 0 :(得分:1)

这是旅行商问题的一个特例,这可能是难以处理的问题中最着名的例子 - 一个无法在任何合理时间内解决的问题。相当大的输入。对此使用递归将需要O(N!)内存和时间,这对于少量输入(可能是<10)可能是可行的(即使在现代系统上)。

如果您愿意为了资源而牺牲完美解决方案,请在此处查看一些次优启发式解决方案:http://www.math.tamu.edu/~mpilant/math167/Notes/Chapter2.pdf