我最近开始了 sicstus prolog,并有这个作业要使用 CLP(约束逻辑编程)来解决,请帮助我理解问题,我应该寻找什么以及我做错了什么。所以,
某建筑公司:
- 为了获得原材料,卑诗省必须租用一辆卡车需要 6 天才能运送 25 吨原材料,而且每天的费用为 80 美元。
- 在地面上建造需要 15 吨原材料,需要 10 天,每层成本 150 美元。
- 建造地下需要 20 吨原材料,需要 23 天(由于挖掘),成本 150 美元,至少需要一台挖掘机,每天增加 75 美元,挖掘时间减少 3 天(最多两台机器一次时间)。(1->20天,2->17天)
- 如果租用一台起重机,所有建造时间将减少 25%,费用为每天 120 美元。
- 电力团队只有在建筑物建成 75% 时才能推进,需要 5 天,每层成本 200 美元。当大楼完工后,还需要一周时间才能完成所有楼层的连接。
BC 假装要建造一个地上 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 个资源的限制是我无法解决的许多问题中的第一个......