我正在研究一个我必须评估游戏树结果的问题。问题是我想比较树的结果。为此我有这样的事情:
bestOption(SomeVariables, Result) :-
generateOption(SomeVariables, Result),
evaluate(Result). % dark magic ensures that Result is the highest possible value
但是,我现在想找到最佳的结果。最好有一些聪明的缓存。任何想法?
这是目标编程语言的序言。
知道怎么做吗?
答案 0 :(得分:3)
在此回答中,我们正在搜索Boolean长度为N
且最大Hamming weight 1 的列表。
:- use_module(library(clpfd)). :- set_prolog_flag(toplevel_print_anon, false). length_Booleans_weight_(Length, Booleans, Weight, [Weight|Booleans]) :- length(Booleans, Length), Booleans ins 0..1, sum(Booleans, #=, Weight).
让我们使用call_time/2
进行不同问题实例大小的运行时测量 2 :
?- member(Length, [10,20,30,40,50,60,70,80,90,100]), call_time(once((length_Booleans_weight_(Length,Booleans,Weight,_Zs), labeling([max(Weight)],_Zs))), T_ms). Len = Weight, Weight = 10, T_ms = 4, Booleans = [1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 20, T_ms = 32, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 30, T_ms = 58, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 40, T_ms = 124, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 50, T_ms = 234, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 60, T_ms = 376, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 70, T_ms = 580, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 80, T_ms = 845, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 90, T_ms = 1178, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ; Len = Weight, Weight = 100, T_ms = 1619, Booleans = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1].
脚注1:当然,我们知道所有最大值都符合目标Weight = Length, maplist(=(1), Booleans)
。
脚注2:使用SWI-Prolog 7.3.14(64位)
功能
答案 1 :(得分:0)
图书馆(aggregate)可以提供帮助:
bestOption(Vars, Result) :-
aggregate(max(Res, Vars), (generateOption(Vars, Res), evaluate(Res)), max(Result, _)).