2012-03-24 18 views
1

制約付きの効率的なジョブスケジューリングの開発方法Javaでプログラミングされた制約

スケジューラは、これらのメソッドを含める必要があります。

startBeforeEndOf(Job j) 
startAfterEndOf(Job j) 
startBeforeStartOf(Job j) 
startAfterStartOf(Job j) 
endBeforeEndOf(Job j) 
endAfterEndOf(Job j) 
endBeforeStartOf(Job j) 
endAfterStartOf(Job j) 

すべてのジョブには、idと時間のパラメータを持っています。

この問題の可能な解決方法は、技術的なバックトラッキングに基づいている可能性があります。ジョブは選択肢として、一時的な瞬間は選択肢として使用されます(最悪の場合、アクティビティーの合計持続時間は、完全に逐次実行される結果となります)。

代わりに、データを適切に表現し、時間軸上でスケジューリングを生成し、制約が満たされない場合にジョブを制約の下に置き、ジョブ(およびそれに依存するすべてのジョブ)で進めるようにしてください。 しかし、私はどのように私はjavaでこれを行うことができますか分かりません。

言い換えれば、私は激しいバックトラッキングアプローチを回避する方法を探していました。

+1

この宿題ですか?あなたはこれに使用できるアルゴリズムを知っていますか?検索プロセスにヒューリスティックスを追加することもできますが、バックトラックはどちらの方法でも解決策の一部と思われます。あなたが徹底的な検索のために行きたい場合を除き、 –

+0

私はさまざまなリストを使用して個々の仕事を自分の制約に従って分けることを考えています。例えば、プライベートリスト startBeforeEnd; \tプライベートリスト startAfterEnd; \tプライベートリスト startBeforeStart; \tプライベートリスト startAfterStart; \tプライベートリスト endBeforeEnd; \tプライベートリスト endAfterEnd; \tプライベートリスト endBeforeStart; \tプライベートリスト endAfterStart; \tプライベートリストが制限されています。しかし、私はこれをいかに正確に開発できるかはわかりません。 – AndreaF

答えて

0

お試しOptaPlanner(java、オープンソース) a quick start hereがあります。例えば

、その後のような得点のルールを追加し、startMinuteに各Jobを割り当てる:

when 
    $leftJob : Job($startMinute : startMinute) 
    // getEndMinute() returns startMinute + durationInMinutes 
    $rightJob : Job(beforeJob == $leftJob, endMinute > $startMinute) 
then 
    // punish 
end 
+0

emmm ...この問題で解決策を満たすためにどのようにしゃぶれを適応させるのですか?ありがとう – AndreaF

+0

@AndreaF:上記を参照 –

0

オープンソース制約プログラミングライブラリを使用できます。 Thisは、制約充足問題などのためにJavaで書かれた多くのソルバーを指しています。

+0

ありがとうございますが、これらのライブラリはこの特定の問題には大きすぎます。 – AndreaF

+0

@AndreaF - 私が知っているわけではありません。しかし、ライブラリの1つから、必要な機能を見つけることができます。次に、図書館の実装を掘り下げて、あなたのケースに適応させます。 –

+0

100個のコードラインを読むadは、この問題でこれらの汎用ライブラリを適応させようとしています。 直感では、これは熟練した開発者が少しクラスを分けて解決できると思います。 – AndreaF

関連する問題