Sicstus 4.3.0 には、最適化問題のすべての解を列挙する新しい洗練された機能があります minimize(:Goal,?X,+Options)
。
新しい検索ヒューリスティックをテストする場合、検索に長い時間がかかることを意味する検索スペースが大きいため、大域的最適解を証明できないことがよくあります。
しかし、多くの場合 (特に産業上の問題の場合)、「十分な」解決策を見つけるだけで十分です。
だから問題に:
「十分な」ソリューションをかなり速く見つけるという問題がありますが、グローバル最適を証明することはできません。したがって、最大化を使用して、検索中に検索ヒューリスティックがどのように動作するかを確認したいと思いますが、グローバル最適化を待ちません。
新しい 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
).
これは期待どおりに機能しますが、これが良いアプローチであるかどうかはわかりません。