我试图找到路径的最低成本,同时保留变量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选项也已尝试过,但它会导致同样的问题。
唯一的选择是搜索并保持最小值。
答案 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:你为什么不用它?