我正试图通过Sicstus Prolog使用限制编程。
问题是:我有一组插槽和一组可以使用一个或两个插槽的电视剧。我必须最大化插槽的规格数量。
% slots(SlotID)
slots([17, 18, 24, 58, 59, 109, 184, 185, 202]).
% serie(Name, Cost, Duration, Other restriction)
serie(1, 1000, 60, 1).
serie(2, 1500, 30, 0).
...
如果持续时间为60,则系列需要2个连续的时隙,如果持续时间为30,则系列只需要一个。系列的数量大于插槽,因此无法显示某些系列。
问题是,我需要说持续60分钟的系列必须是连续的,例如在前面的例子中,id为1的系列可以在[17,18]或[58,59]或[184,185]中显示,但我不知道该怎么做。
我使用了global_cardinality(Programation, Values)
,因此Programation中的域变量的序列号为0或1(如果持续时间为30)和0或2(如果持续时间为60)。这样,id为1的série,如果出现在程序中,则必须有2个插槽。但我想让它成为连续的,但我不知道该怎么做。
这段代码就是我们所拥有的,但它不起作用:
conseqNumber(_, _, 0, _, _).
conseqNumber(Programation, SlotIndex, SlotsNumber, Size, SerieId):-
SlotIndex #=< Size,
element(SlotIndex, Programation, SerieId2),
SerieId2 #= SerieId,
SlotIndexAux #= SlotIndex +1,
SlotsNumberAux #= SlotsNumber - 1,
conseqNumber(Programation, SlotIndexAux, SlotsNumberAux, Size, SerieId).
checkIfConsecutiveAux(Programation, DurationList, Size, SlotIndex, IndexCounter):-
element(SlotIndex, Programation, SerieId),
element(SerieId, DurationList, SerieDuration),
SlotsNumber #= (SerieDuration / 30) - 1,
SlotIndexAux #= SlotIndex + 1,
conseqNumber(Programation, SlotIndexAux, SlotsNumber, Size, SerieId),
IndexCounter #= SlotIndexAux + SlotsNumber.
checkIfConsecutive(_, _, Size, SlotIndex):- SlotIndex #> Size.
checkIfConsecutive(Programation, DurationList, Size, SlotIndex):-
checkIfConsecutiveAux(Programation, DurationList, Size, SlotIndex, IndexCounter),
checkIfConsecutive(Programation, DurationList, Size, IndexCounter).
抱歉英文不好