DFS 获得所有可能的解决方案?
Posted
技术标签:
【中文标题】DFS 获得所有可能的解决方案?【英文标题】:DFS to get all possible solutions? 【发布时间】:2020-07-17 09:58:02 【问题描述】:我有这些圈子:
我想获取最大不相交圆的所有可能解的列表。这是我想要从节点 A 获得的解决方案的插图。
因此来自节点 A 的可能解决方案: 1 = [A,B,C], 2 = [A,B,E], 3 = [A,C,B], 4 = [A,E,B] ..等等
我想将所有可能性存储到一个列表中,该列表将用于加权和选择最佳结果。但是,我仍在尝试创建所有可能性的列表。
我尝试在这里编写结构代码,但我仍然对回溯和递归感到困惑。有人可以帮忙吗?
# List of circle
# List of circle
list_of_circle = ['A','B','C','D','E']
# List of all possible solutions
result = []
# List of possible nodes
ways = []
for k in list_of_circle:
if len(list_of_circle)==0:
result.append(ways)
else:
ways.append[k]
list_of_circle.remove(k)
for j in list_of_circle:
if k.intersects(j):
list_of_circle.remove(j)
return result
【问题讨论】:
[A, B, E]
, [A, E, B]
?它应该重复一个结果吗?
是的,最后我不想要任何重复的结果。但是我认为排除重复的结果会变得更加复杂。因此,我将在存储在列表中后删除重复的。还是可以同时进行?
【参考方案1】:
这是一个可能的解决方案(伪代码)。
def get_max_non_intersect(selected_circles, current_circle_idx, all_circles):
if current_circle_idx == len(all_circles): # final case
return selected_circles
# we recursively get the biggest selection of circles if the current circle is not selected
list_without_current_circle = get_max_non_intersect(selected_circles, current_circle_idx + 1, all_circles)
# now we check if we can add the current circle to the ones selected
current_intersects_selected = false
current_circle = all_circles[current_circle_idx]
for selected_circle in selected_circles:
if intersects(current_circle, selected_circle):
current_intersects_selected = true
break
if current_intersects_selected is true: # we cannot add the current circle
return list_without_current_circle
else: # we can add the current circle
list_with_current_circle = get_max_non_intersect(selected_circles + [current_circle], current_circle_idx + 1, all_circles)
return list_with_current_circle + list_without_current_circle
【讨论】:
以上是关于DFS 获得所有可能的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章