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
).
这种接缝按预期工作,但我不确定这是否是一种好方法?