私はシフトの配列 (私は辞書として提示しています) を持っています。ここで、各行は個別であり、資格のある各シフトは複数になる可能性があります。この例では、データがどのように一致するかを伝えるために文字を使用しています。文字表現の実際のデータセットは 0 または 1 です。つまり、shifts = {Bob: (A, C, E), George: (B, C), Steve: (B, C, E), Greg: (C), Jose:(B,E)} は本質的に [[(A, 0, C, 0, E),(0, B, C, 0, 0), (0, 0, C, 0, 0), (0 、B、0、D、E)]]
各シフトを埋めるための人数の割り当てがあります。1 人を 2 つの異なるシフトに割り当てることはできません。
基本的に=> totalshifts = A=1 + B=1 + C=2 + E=1 => 5 つの合計位置の制約は A<=1:A>=0 、 B<=1:B>=0、C<= です2:C>=0、E<=1:E>=0
これは現在、シンプレックス LP を最大化するように設定された Excel ソルバーで解決されています。scipy.optimize.linprog の利用を検討していますが、これを正しく設定すること、または入力配列がシフトに必要な人数に達しない場合の処理方法に苦労しています。
各シフトの関数を最大化するため、または次のように最大化に近づけるために、個人に正しいシフトが割り当てられる出力が必要です: Bob:A、George:B、Steve:C、Greg: C, Jose:E 基本的に、答えの行列は [(A, 0, 0, 0, 0),(0, B, 0, 0, 0),(0 , 0, C, 0 ,0), ( 0, 0, C, 0, 0), (0, 0, 0, 0, E)] を使用して、正しいシフトで正しい候補を参照できるようにします。これは単純なケースで、10 の異なるシフトと数百から数千の個人のオーダーです。
Excel の例: 現在、画像を投稿する担当者が 10 人もいません http://i.imgur.com/ZZET86D.jpg