使用time_out最大化

时间:2014-07-17 08:51:00

标签: prolog clpfd sicstus-prolog

Sicstus 4.3.0有一个新的优雅功能,可以枚举优化问题minimize(:Goal,?X,+Options)中的所有解决方案。

在测试新的搜索启发式算法时,由于搜索空间较大而无法证明全局最优,这意味着搜索需要很长时间。

但经常(特别是对于工业问题),找到一个“足够好”的解决方案就足够了。

所以问题是:

我有一个问题,我发现一个'足够好'的解决方案很快,但我无法证明全局最佳。所以现在我想使用maxim来查看我的搜索启发式搜索在搜索过程中的行为,但不是等待全局最优。

使用新的4.3.0版本,我可以这样做:

findall(L,     
(
   minimize(labeling([],VarsList), Es, [all]),
   L = Es
),
Ls)

然后我会得到一个列表Ls,其中包含在跟踪上找到的全局最优解的所有解。

但我不想等待全局最优,所以我添加time_out这样:

findall(L,
(
  minimize(labeling([time_out(MaxLabelingTime,LabelingResult)],VarsList), Es, [all]),
  L = [Es,LabelingResult]
),
Ls),

这应该找到所有解决方案,但不要在每次回溯之间花费更多时间MaxLabelingTime。但是,自time_out以来Es启动后,这种方式将失败:

Instantiation error in argument 2 of user:minimize/2
! goal:  minimize(user:labeling([time_out(500,_201)],[_203,_207....]),_179)

我的解决方案/解决方法如下:

findall(L,
(
   minimize(my_labeling(MaxLabelingTime,LabelingResult,VarsList,Es), Es, [all]),
   L = [Es,LabelingResult]
),
Ls)

my_labeling(MaxLabelingTime, LabelingResult, VarsList,Es):-
   labeling([time_out(MaxLabelingTime,LabelingResult)], VarsList),
   (  LabelingResult=time_out
   -> Es=0
   ;  true
   ).       

这种接缝按预期工作,但我不确定这是否是一种好方法?

0 个答案:

没有答案