私は最近 sicstus プロローグを開始しましたが、この宿題を CLP (制約論理プログラミング) で解決する必要があります。問題、何を探すべきか、何を間違っているかを理解するのを手伝ってください。そう、
建築会社:
- 原材料を入手するために、BC は 25 トンの原材料を輸送するのに 6 日かかるトラックをレンタルする必要があり、1 日あたり 80 ドルの費用がかかります。
- 地上に建設するには 15 トンの原材料が必要で、10 日かかり、1 階あたり 150 ドルの費用がかかります。
- 地下に建設するには20Tの原材料が必要で、23日かかり(掘削のため)、150ドルの費用がかかり、少なくとも1台の掘削機が必要です。これにより、1日あたり75ドルが追加され、掘削時間が3日短縮されます時間)。(1->20日、2->17日)
- クレーンをレンタルすると、すべての建設時間が 25% 短縮され、1 日あたり 120 ドルの費用がかかります。
- 電気チームは、建物の 75% が建設された場合にのみ前進できます。5 日かかり、1 フロアあたり 200 ドルの費用がかかります。建物が完成すると、すべてのフロアの接続が完了するまでにさらに 1 週間かかります。
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リソースの制限は、回避できない多くの問題の最初のものであるため、もちろん機能しません...