任务调度sicstus prolog
我最近开始学习sicstus prolog,有一个家庭作业要用CLP(约束逻辑编程)来解决,请帮助我理解这个问题,我应该寻找什么,我做错了什么。所以 建筑公司:任务调度sicstus prolog,prolog,clpfd,sicstus-prolog,Prolog,Clpfd,Sicstus Prolog,我最近开始学习sicstus prolog,有一个家庭作业要用CLP(约束逻辑编程)来解决,请帮助我理解这个问题,我应该寻找什么,我做错了什么。所以 建筑公司: 为了获得原材料,卑诗省必须租用一辆卡车,运输25吨原材料需要6天,每天80美元 在地面上建造需要15吨原材料,需要10天,每层造价150美元 建造地下20吨原材料需要23天(由于开挖),成本为150美元,至少需要一台挖掘机器,每天增加75美元,减少挖掘时间3天(一次最多两台机器)。(1->20天,2->17天) 如果租用起重机,所有建
- 为了获得原材料,卑诗省必须租用一辆卡车,运输25吨原材料需要6天,每天80美元
- 在地面上建造需要15吨原材料,需要10天,每层造价150美元
- 建造地下20吨原材料需要23天(由于开挖),成本为150美元,至少需要一台挖掘机器,每天增加75美元,减少挖掘时间3天(一次最多两台机器)。(1->20天,2->17天)
- 如果租用起重机,所有建筑时间将减少25%,每天的成本为120美元
- 电力团队只有在75%的建筑建成后才能前进,这需要5天,每层楼200美元。当建筑完工后,还需要一周的时间来完成所有楼层的连接
:- 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).
非常欢迎任何可以改进我答案的建议和评论。这是不是需要的?为什么不声明不同条件下的总成本并最小化?这没有多大意义,因为可用资源不断变化,它需要一个不同的谓词来评估在累积中声明哪个任务。。。所以我已经开始用条件来解决这个问题,并且没有使用这些废话。我在尝试累积BEA,因为我的老师提出了建议,但我不认为他已经解决了这个问题lol我将尽可能地使用我现有的初步解决方案,因为它似乎正在工作考虑使用format/2而不是这么多write/1调用。例如:<代码>格式(“1~W~W~W~W\N”、[ST、DT、ET、CT])、<代码>格式(“成本~W\N”、[成本])< /代码>。考虑将实际标记与核心谓词分开,这样您就可以同时尝试替换标记策略。谢谢Mat和Falm,我将对最终交付执行两个建议。