2013-05-20 7 views
6

これらの重複しないイベントを可能な限りスケジュールに配置できるアルゴリズムを見つけることを考えています(これらのイベントのいずれかを追加したり削除したりすることができます必要に応じてスケジュール)。これらの事象はいずれも重複することはできませんが、私は可能な限り毎日のスケジュールにそれらの多くに合うようにしたい:可能な限り多くのイベントに対応するアルゴリズム

12:00 PM - 12:45 PM: Lunch 

1:00 AM - 3:00 AM: Math class 1 

3:30 PM - 5:00 PM: Math class 2 

7:00 PM - 10:00 PM: History class 1 

9:00 PM - 11:00 PM: History class 2 

Any time of day: Grocery shopping, 40 minutes 

Any time of day: Study math for 30 minutes 

Any time of day between 11:00 AM and 4:00 PM: Basketball practice for 2 hours 

私はしばらくの間、この問題について考えてきた、と私はまだ方法について見当がつかない私はそれを解決する必要があります。どのようなタイプのカレンダースケジューリングアルゴリズムがこの場合最も効果的でしょうか?

+0

これがhttp://stackoverflow.com/やhttp://math.stackexchange.com/に適しているかどうかはまだ分かりません。 –

+0

http://stackoverflow.com/questions/2746309/best-fit-scheduling-algorithm?rq=1 –

+0

@JarrodRobersonその質問の説明は曖昧で、OPが実際に多くの人に合っているかどうかは不明ですアイテムを可能な限りスケジュールに入れます。私はそれが本当に重複しているかどうかはわかりません。 –

答えて

1

を獲得した[X]順列配列のイベントの可能な重複しない組み合わせをすべて生成します。この配列から、可能な限り多くのイベントを含む範囲である範囲の最大の配列を抽出できます。

http://jsfiddle.net/nvYZ8/1/

var theArray = generateCombination([[0, 2], [2, 3], [4, 5], [0, 9], [2, 50]]); 
alert(JSON.stringify(theArray)); 

function generateCombination(theArray) { 
    var theString = ""; 
    var tempArray = new Array(); 
    for (var i = 0; i < theArray.length; i++) { 
     theString += "1"; 
    } 
    var maximumNumber = convertFromBaseToBase(theString, 2, 10); 

    for (var k = 0; k <= maximumNumber; k++) { 
     theString = convertFromBaseToBase(k + "", 10, 2); 
     while(theString.length != theArray.length){ 
      theString = "0" + theString; 
     } 
     var theResult = getArray(theArray, theString); 
     if(theResult != false){ 
      tempArray[tempArray.length] = JSON.stringify(theResult); 
     } 
    } 
    return tempArray; 
} 

function getArray(theArray, theString){ 
     var tempArray = new Array(); 
    for(var i = 0; i < theArray.length; i++){ 
     if(theString[i] == 1){ 
      tempArray[tempArray.length] = theArray[i]; 
     } 
    } 
     for (var i = 0; i < theArray.length; i++) { 
      for (var j = i; j < theArray.length; j++) { 
       if ((j != i) && (theString[i] == 1) && (theString[j] == 1)) { 
        //check whether theArray[i] overlaps with theArray[j] 
        var overlaps = rangesOverlap(theArray[i][0], theArray[i][1], theArray[j][0], theArray[j][1]); 
        //if overlaps is true, break out of the current loop 
        //otherwise, add theArray[j] to tempArray 
        if(overlaps == true){ 
         return false; 
        } 
       } 
      } 
     } 
     return tempArray; 
} 

function convertFromBaseToBase(str, fromBase, toBase) { 
    var num = parseInt(str, fromBase); 
    return num.toString(toBase); 
} 

function rangesOverlap(x1, x2, y1, y2) { 
    if (x1 <= y2 && y1 <= x2) { 
     return true; 
    } else { 
     return false; 
    } 
} 
+0

制約プログラミング言語を知る前に私はこの答えを書きました。 [MiniZinc](http://www.minizinc.org/)と呼ばれるプログラミング言語があり、このような問題をもっと簡単に解決することができます。 –

2

梱包期間は1日の長さになります。あなたはあなたの問題の可能な解決策を見つけ出し、あなたがそれを詰め込んで管理する期間の数に応じてそれを評価したいと考えています。

  1. 午前1時から午後10時までは21 * 4フレームになるように1日を15分間隔で分割します。
  2. 制約で可能なすべての置換を生成します(フレームの重複はありません)。有効な各順列に対して
  3. 、あなたに合うように、管理期間の数を数える。
  4. 印刷私は配列を受け取りgenerateCombinationと呼ばれる関数を書いて、最高
+0

今すぐイベントのすべての可能な順列を生成する方法を理解する必要があります。私はどこから始めたらいいのか分かりません - あなたはアイディアがありますか? –

+0

[アイテムのセットのすべての順列を生成](https://www.google.com/#hl=en&sclient=psy-ab&q=generate+all+permutations+of+a+にさまざまな方法があるように見えます&oq = + a +&gs_l = hp.3.1.04.1655.7558.0.8774.26.20.2.4.4.0.174.1593.16j4.20.0 ... 0.0 ... 1c.1.14.psy-abの+すべての順列+を生成する。 vpkq349cqys&pbx = 1&bav = on.2、または.r_cp.r_qf。&bvm = bv.46751780、d.dmg&fp = 8be17aaf92ef5992&biw = 1366&bih = 631)。私から –

+0

1 ... 5の答え(これまでに)彼女とこれが唯一の組合せ最適化パターンを認識するためのものです - 私はそれらを参照として、特にビンパッキング、または「ナップサック」問題。 – doug

0

私は、動的プログラミングソリューションだと思います。..については

、イベントなどのB:F(A)>(B)〜期間(a)の<期間F(B G Fと(X)> G(Y)〜ナンバー・オブ・イベント(X)>ナンバー・オブ・イベント(Y)

ダイナミックプログラミング(イベント):スケジュールとしてY X用)

、 g(予定)以上。最適なスケジュールを見つけるには

+0

'〜'記号は何を表していますか? –

+0

'〜'示しequivlance .. 'F(イベント)=時間(イベント)'、 'グラム(スケジュール)=ナンバー・オブ・イベント(スケジュール)' –

0

OTOH私は2つの適切な解決策、計画アルゴリズム、PopPlanまたはGraphPlanを考えることができます。もう1つは、シミュレーテッドアニーリングを使用することができます。

+0

[このGoogle検索](HTTPSによると:// WWW。 google.com/#output=search&sclient=psy-ab&q=popPlan&oq=popPlan&gs_l=hp.3..0j0i10j0j0i10.479.1502.0.1797.7.7.0.0.0.0.191.719.4j3.7.0.epsugrpqhmsignedin%2Chtma%3D120%2Chtmb%3D120。 .0.0.0..1.1.17.psy-ab.3P6Tq2ZSMTw&PBX = 1&BAV = on.2、or.r_cp.r_qf。&BVM = bv.48293060、d.dmg&FP = f0df6dbdb7c58c71&BIW = 1366&BIH = 631)、 "PopPlan" は、通常意味します「プレミアムプランのみ」に変更します。あなたは何か他のものを参照していますか? –

+0

@AndersonGreenはい、http://pages.cs.wisc.edu/~dyer/cs540/notes/pop.htmlを参照してください。 –

関連する問題