2012-12-07 3 views
3

나는 최근에 sicstus 프롤로그를 시작했고 CLP (제약 논리 프로그래밍)로 해결할이 숙제를 가지고 있는데 문제를 이해하는데 도움이되고, 무엇을 찾고 있어야하며 무엇을 잘못하고 있는지 이해하도록 도와주세요. 그래서,작업 일정 sicstus 프롤로그

건물 회사 :

  • 는 BC 원료의 25T를 수송 6 일이 소요 트럭을 임대하는 원료를 얻으려면, 그것은 하루 80 $의 요금으로 제공됩니다.
  • 지상에 건설하려면 15 톤의 원료가 필요합니다. 10 일이 걸리고 층당 150 $가 들었습니다.
  • 지하 20 톤의 원자재를 건설하려면 굴착으로 인해 23 일이 걸리고 150 달러가 들며 하루에 75 달러를 추가하고 굴착 시간을 3 일 단축하는 굴착 기계가 적어도 하나 필요합니다 (두 대의 기계 한 번에 최대). (1-> 20days, 2-> 17days)
  • 크레인을 대여 할 경우 모든 빌딩 시간이 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 자원의 한계로 누적 사용할 수 있기 때문에, 물론 작동하지 않는 것은 많은 문제 중 첫 번째 내가

여기
+0

누적 적립이 필요합니까? 왜 다른 조건 하에서 총 비용을 진술하고 최소화하지 않는가? – CapelliC

+0

availiable 리소스가 계속 변하기 때문에 의미가 없으며 누적으로 선언 할 작업을 평가하는 데 다른 조건이 필요합니다 ... 그래서 이미 조건으로 해결하기 시작했고 그 쓰레기를 사용하지 않았습니다. 내 교사가 sugested 누적 beacause와 함께 노력했지만, 나는이 문제를 해결했습니다 생각하지 않아 LOL 나는 가능한 예비 해결책 솔루션으로 지금까지 내가 가지고있는 것 때문에 작동하는 것 같습니다 –

답변

3

그것은 내가 지금까지 해낸거야 ... 주위를 얻을 수없는, 훨씬 쉽게 것 같다 나에게 기대되는 결과를 얻기 :

:- 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). 

어떤 sugestions을한다는 코멘트를 impro 내 대답은 대단히 환영합니다.

+1

대신에/2 형식 사용을 고려해보십시오 이렇게 많은 쓰기/1 호출. 예를 들면 다음과 같습니다. 'format ("~ w ~ w ~ w ~ n", [St, Dt, Et, Ct])'및 format ("Cost ~ w \ n", [Cost])'. – mat

+1

핵심 레이블에서 실제 레이블을 분리하는 것을 고려하십시오. 이렇게하면 대체 레이블링 전략을 동시에 시도해 볼 수 있습니다. – false

+1

매트 감사합니다. 그리고 거짓, 나는 최종 배달에 대한 두 가지 제안을 구현할 것입니다. =) –