gpt4 book ai didi

prolog - 使用累积量

转载 作者:行者123 更新时间:2023-12-04 23:50:26 24 4
gpt4 key购买 nike

我正在解决使用 cumulatives/[2,3] 的问题谓词。
但是当我尝试将其与 minimize 结合使用时,我的性能非常差。在 labeling
我有以下演示。 10 个任务,所有持续时间为 1,4 台机器,所有容量=1。我的目标是最小化总时间,即 minimize(maximum(Es)) :

:- use_module(library(clpfd)).
:- use_module(library(lists)).

go( Ss, Es, Ms, Tm, Lab ) :-

Ss = [S1, S2, S3, S4,S5,S6,S7,S8,S9,S10], %Starttimes
Es = [E1, E2, E3, E4,E5,E6,E7,E8,E9,E10], %Endtimeds
Ms = [M1, M2, M3, M4,M5,M6,M7,M8,M9,M10], %MachineIds


domain(Ss, 1, 20),
domain(Es, 1, 20),
domain(Ms, 1, 10),

%All task has duration = 1
Tasks = [
task( S1, 1, E1, 1, M1 ),
task( S2, 1, E2, 1, M2 ),
task( S3, 1, E3, 1, M3 ),
task( S4, 1, E4, 1, M4 ),
task( S5, 1, E5, 1, M5 ),
task( S6, 1, E6, 1, M6 ),
task( S7, 1, E7, 1, M7 ),
task( S8, 1, E8, 1, M8 ),
task( S9, 1, E9, 1, M9 ),
task( S10, 1, E10, 1, M10 )
],

%All machines has resource capacity = 1
Machines = [
machine( 1, 1 ),
machine( 2, 1 ),
machine( 3, 1 ),
machine( 4, 1 )
],

cumulatives(Tasks, Machines, [bound(upper)] ),

maximum( MaxEndTime, Es ),

%Make the list of options to pass to the labeling predicate
append( [ [minimize(MaxEndTime)], [time_out( Tm, _)], Lab ], LabOpt ),
%The variables to lable:
append([Ms, Ss ], Vars),

labeling( LabOpt, Vars).

如果我现在运行它并解决 1 秒钟,我会得到:
| ?- go( S, E, M, 1000, []).
E = [2,3,4,5,6,7,8,9,10,11],
M = [1,1,1,1,1,1,1,1,1,1],
S = [1,2,3,4,5,6,7,8,9,10] ?

IE。所有任务都已安排在机器 1 上运行

在看到任何最小化迹象之前,我需要运行求解器 30 秒:
| ?- go( S, E, M, 30000, []).
E = [2,3,4,5,6,7,8,9,10,2],
M = [1,1,1,1,1,1,1,1,1,2],
S = [1,2,3,4,5,6,7,8,9,1] ?

如果我跑了 60 秒,我开始得到可以接受的结果:
| ?- go( S, E, M, 60000, []).
E = [2,3,4,2,3,4,2,3,4,2],
M = [1,1,1,2,2,2,3,3,3,4],
S = [1,2,3,1,2,3,1,2,3,1] ?

我觉得这花费的时间太长了。
关于为什么需要这么长时间的任何评论?

最佳答案

我发现了两个可以加快代码速度的标准技巧。

第一,可变顺序。您在 S 变量之前标记所有 M 变量。这需要大约 51 秒。一次为一项任务同时修复 S 和 M 会好得多。 IE。可变顺序[S1,M1,S2,M2,S3,M3,S4,M4,S5,M5,S6,M6,S7,M7,S8,M8,S9,M9,S10,M10]。这使时间缩短到大约 2 秒。

其次,您的任务是可以互换的,您的机器也是如此。也许情况并非总是如此,如果您的代码旨在成为一个玩具示例而不是真实的东西。但是如果你有这样的对称性,你可以通过打破对称性来防止搜索进入很多死胡同,例如经过:

lex_chain([[S1,M1],[S2,M2],[S3,M3],[S4,M4],[S5,M5],[S6,M6],[S7,M7],[S8,M8],[S9,M9],[S10,M10]]),

这将时间缩短到 10 毫秒。

这两个技巧都是约束编程技术的标准。

关于prolog - 使用累积量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23649534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com