gpt4 book ai didi

prolog - 任务计划 sicstus prolog

转载 作者:行者123 更新时间:2023-12-02 08:54:21 26 4
gpt4 key购买 nike

我最近开始使用 sicstus prolog,并有这个作业要用 CLP(约束逻辑编程)来解决,请帮助我理解问题,我应该寻找什么以及我做错了什么。所以,

某建筑公司:

  • 为了获取原 Material ,BC 省必须租用一辆卡车,需要 6 天才能运输 25 吨原 Material ,每天的费用为 80 美元。
  • 地上建筑需要 15 吨原 Material ,需要 10 天,每层成本 150 美元。
  • build 地下需要20吨原 Material ,需要23天(由于挖掘),成本150美元,至少需要一台挖掘机,每天增加75美元,减少挖掘时间3天(两台机器一次最多)。 (1->20天,2->17天)
  • 如果租用起重机,则所有建筑时间会减少 25%,并且每天的成本为 120 美元。
  • 电力团队只有在建筑物建成 75% 后才能推进,需要 5 天时间,每层费用 200 美元。当建筑完工后,还需要一周的时间才能完成所有楼层的连接。

BC 假装 build 一座地上 150 层、地下 15 层的摩天大楼,该建筑必须如何组织才能最大化利润并最小化所需时间?

将问题定义为约束满足问题并使用 CLP 解决它,以便可以使用不同的参数(更多或更少的楼层,或调整团队的位置时间)来解决它。

到目前为止我所拥有的:

:- use_module(library(clpfd)).

start(Fdigs,Floors,Vars):-
length(Vars,5),

%S -> start, E -> end, D -> duration
%t -> transport, e -> excavating, f -> floor (build)

Vars=[St,Et,Se,Ee,Cost],

Se #>= Et,
Ee #= Se + 10,
Et #>=6,
Cost #>= Ee * 80, %transport cost since it starts at 0 Ee will be the days needed

domain(Vars,0,2000),
construct(0,Fdigs,Floors,Vars),
labeling([minimize(Cost)],Vars).

construct(Stock,0,Floors,Vars).

construct(Stock,Fdigs,Floors,[St,Et,Se,Ee,Cost]):-
Tasks=[
task(St,6,Et,0,1), %transport task
task(Se,10,Ee,5,2) %dig task, 5 because I'm digging all then building (20-15)
%10 because build is 10 so dig is 10
],
cumulative(Tasks,[limit(Stock)]),
Nfdigs is Fdigs - 1,
Nstock is Stock + 25,
construct(Nstock,Nfdigs,[Et,_Et,Ee,_Ee,Cost]).

当然它不起作用,因为我无法对需要 5 个资源的任务使用累积,而 0 个资源的限制是我无法解决的许多问题中的第一个......

最佳答案

这是我到目前为止想到的,似乎更容易并得到了我预期的结果:

:- use_module(library(clpfd)).

start(Floors,Fdigs,Vars):-
length(Vars,20),
domain(Vars,0,999999999), %all vars must be bounded
Vars=[ % S-start,D-duration,E-end,C-cost (money)
St,Dt,Et,Ct, % transport vars
Se,De,Ee,Ce, % excavation vars
Sb,Db,Eb,Cb, % building vars
Sc,Dc,Ec,Cc, % electricity vars
Machines,Crane,Cost,Time],
Machines in 1..2,
Crane in 0..1,
St is 0,
Dt is ceiling(((Floors*15)+(Fdigs*20))/25)*6,
Et is Dt,
Ct is 80 * Dt,
Se is 0,
De #= (13 - (Machines*3)) * Fdigs,
Ee #= De,
Ce #= De * (75*Machines),
Sb #>=6 #/\ Sb #>= Ee,
Db #= ((Fdigs * (10-(Crane*3))) + (Floors * (10-(Crane*3)))),
Eb #= Sb + Db,
Cb #= (Fdigs + Floors) * 150 + (Crane*Db*120),
Sc #= (Eb * 75 / 100),
Dc #>= (Eb * 25 / 100) + 5 #/\ Dc #=((Floors + Fdigs) * 5) + 5,
Ec #= Sc + Dc #/\ Ec #> Eb,
Cc is (Fdigs + Floors) * 200,

%Costs
Cost #= (Ct + Ce + Cb + Cc),

%Times (will be end time of final & nonoverlaping task)
Time #= Ec,

%labeling([minimize(Cost)],Vars), % - cost, + time
labeling([maximize(Cost)],Vars), % + cost, - time
writeVars(Vars).

writeVars([St,Dt,Et,Ct,Se,De,Ee,Ce,Sb,Db,Eb,Cb,Sc,Dc,Ec,Cc,Machines,Crane,Cost,Time]):-
write('1 '),write(St),write(' '),write(Dt),write(' '),write(Et),write(' '),write(Ct),write('\n'),
write('2 '),write(Se),write(' '),write(De),write(' '),write(Ee),write(' '),write(Ce),write('\n'),
write('3 '),write(Sb),write(' '),write(Db),write(' '),write(Eb),write(' '),write(Cb),write('\n'),
write('4 '),write(Sc),write(' '),write(Dc),write(' '),write(Ec),write(' '),write(Cc),write('\n'),
write('Cost: '),write(Cost),write('\n'),
write('Time: '),write(Time),write('\n'),
write('Crane: '),write(Crane),write('\n'),
write('Machines: '),write(Machines).
%write('4 ',St,' ', Dt,' ', Et,' ', Ct),
%write('5 ',St,' ', Dt,' ', Et,' ', Ct).

非常欢迎任何可以改进我的答案的建议、评论。

关于prolog - 任务计划 sicstus prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13771188/

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