質問

私は私ができる最善のように、ここを通じて検索し、私はいくつかの関連の質問を見つけましたけれども、私は彼らが手元に疑問カバーされないと思います。

単一のリソースおよびタスクをスケジュールする要求の既知のリストを想定。各要求はstart_after、start_by、expected_duration、およびアクションを含む。

目標はstart_afterとstart_byの間にスケジュール各タスクを維持しながら、できるだけ早く実行するためのタスクをスケジュールすることです。

私は動作するはずですが、私は残念ながら、実行時にエラーが発生してきた「と思った」という単純なPrologの例をコード化された:「> = / 2:引数が十分にインスタンス化されていません」。

すべてのヘルプやアドバイスをいただければ幸いです。

startAfter(1,0).
startAfter(2,0).
startAfter(3,0).

startBy(1,100).
startBy(2,500).
startBy(3,300).

duration(1,199).
duration(2,199).
duration(3,199).

action(1,'noop1').
action(2,'noop2').
action(3,'noop3').

can_run(R,T) :- startAfter(R,TA),startBy(R,TB),T>=TA,T=<TB.
conflicts(T,R1,T1) :- duration(R1,D1),T=<D1+T1,T>T1.
schedule(R1,T1,R2,T2,R3,T3) :- 
           can_run(R1,T1),\+conflicts(T1,R2,T2),\+conflicts(T1,R3,T3),
           can_run(R2,T2),\+conflicts(T2,R1,T1),\+conflicts(T2,R3,T3),
           can_run(R3,T3),\+conflicts(T3,R1,T1),\+conflicts(T3,R2,T2).

% when traced I *should* see T1=0, T2=400, T3=200

編集: 必要に応じて余分なT> T1句

:競合の目標はかなり右ではなかったです。

編集: どうやら私のスケジュールの目標は、私は有効な要求を供給した場合、タイムペアを動作します...しかし、私は

?R1..3を与えられたときT1..3の有効な値を見つけるために、プロローグを強制しようとしてこだわっています
役に立ちましたか?

解決

元の実装に問題がいくつかあります。これは、制約論理プログラミングシステムではなく、ストレートPrologで(軽微な変更で)OKを働くかもしれません。プロローグでは、目標の順序は重要です。私はそれが動作するようにコードを変更しました。

can_run(R, T) :-
    startAfter(R,TA),
    startBy(R,TB),
    between(TA,TB,T).

conflicts(T,R1,T1) :- 
    duration(R1,D1),
    T=<D1+T1,
    T>=T1.

schedule(R1,T1,R2,T2,R3,T3) :- 
    can_run(R1,T1), 
    can_run(R2,T2), 
    R1 \= R2,
    \+ conflicts(T1,R2,T2),
    can_run(R3,T3),
    R3 \= R1, 
    R3 \= R2,
    \+ conflicts(T1,R3,T3),
    \+ conflicts(T2,R1,T1),
    \+ conflicts(T2,R3,T3),
    \+ conflicts(T3,R1,T1),
    \+ conflicts(T3,R2,T2).

between(Low, High, Between) :-
    Between is Low
    ;
    Low < High,
    Next is Low + 1,
    between(Next, High, Between).

I 3 /の間の述語(いくつかのPrologの実装で定義された組み込み)の使用を加えました。それは2つの特定のエンドポイント間の整数を生成します。

私は異なる値であることがR1、R2、及びR3を強制的にスケジュール/ 6で不等式チェックを追加しました。

最後に、私はこれらの変数が競合/ 3によりチェックした前can_run / 2述語をRiを/ Tiの変数のペアを評価したことを確認するために、スケジュール/ 6で目標を並べ替えます。

は、クエリのスケジュール(R1、T1、R2、T2、R3、T3)が数分間実行され、最終的に生成されます。


?-schedule(R1,T1,R2,T2,R3,T3)
R1 = 1
T1 = 0
R2 = 2
T2 = 400
R3 = 3
T3 = 200

この問題のためにはるかに効率的な実装があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top