在回溯序言时保留变量

时间:2013-07-18 11:11:25

标签: prolog backtracking

我试图找到路径的最低成本,同时保留变量Min而不是回溯。下面的代码不起作用,但它对我想要的内容略有说明。

如果Total较小,则Total应为总计,则与新NewMin进行比较时,最小变量保持当前最小值。我可以将NewMin Min 向前发送。但是,因为我依赖于回溯,所以强制失败之前的子句,因此存储的所有值都将丢失。

calculate_cost(Start, [], CostList, Min, NewMin):-
  sum_list(CostList, Total),
  Total < Min,
  NewMin is Total.

calculate_cost(Start, Rest, CostList, Min, NewMin):-
  flatten(Rest, Places),
  [Next|Left] = Places,
  route(Start, Next, Cost),
  calculate_cost(Next, Left, [Cost|CostList], Min, NewMin),
  fail.

现在我想基本保留Min变量,直到程序结束,同时进行多次比较。

注意:谓词calculate_cost被多次调用(超过100万次),所以列表不可行,因为我已经尝试了,我导致Out of global stack异常。< / p>

Assert选项也已尝试过,但它会导致同样的问题。

唯一的选择是搜索并保持最小值。

1 个答案:

答案 0 :(得分:1)

不断更新Path&amp; calculate_cost完成时的MinCost:

:- dynamic current_min/2. % Path, Cost

calculate_cost(Start, [], CostList, Min, NewMin):-
  sum_list(CostList, Total),
  Total < Min,
  NewMin is Total,
  (  current_min(CPath, CMin), CMin =< NewMin
  -> true
  ;  retract(current_min(_,_)), assert(current_min(NewPath, NewMin))).

我知道NewPath现在不可用:看看你是否可以改变程序流程以使NewPath可用于calculate_cost

BTW有Dijkstra algorithm available:你为什么不用它?