2017-06-07 20 views
4

を生成します。各従業員のための私は列を持つ従業員のスケジュールのcsvファイルを与えられていた従業員のスケジュールに基づいて、最も近いチームC#

employee ID, first last name, sunday schedule, monday schedule, ... , saturday schedule 

1週間のスケジュールを。私はcsvファイルの一部のスクリーンショットを添付しました。総ファイル数は約300行です。

schedules.csv

各チームの従業員がお互いに最も近いスケジュールを持っているように、私は(場所は関係ありません)従業員のスケジュールに基づいて、15のチームを生成する必要があります。スケジュールの配列に

  • 解析csvファイル(私自身の構造体の定義)のチームに同じ正確なスケジュールを持っている

  • マッチ従業員は(〜5つのフルサイズのチームを作成し、私が試したものの擬似コード20〜25人の半分のチーム、誰もが一致しない〜50人のスケジュールを残す)

  • i = 1〜14の場合、サイズiのチームのそれぞれについて、全体)、メンバーをそのチームに追加します。チームが15に達すると、「完了」とマークします。

これは多少は機能しましたが、間違いなく私に最高のチームを与えてくれませんでした。私の質問は誰もこれを行うためのより良い方法を知っていますか?擬似コードまたは単に一般的なアイデアは、おかげで、感謝します。

EDIT:次の例は比較式の例です。 比較はエージェントのスケジュールの差が30分のブロックに基づいています。エージェント25はエージェント23と24とで8時間30分の差があるため、スコアは16です。チームの合計スコアは、一緒に追加されたすべてのスコアに基づいて32です。

Comparison

わけではありませんすべてのエージェントは、8時間の日の仕事、そして多くは、彼らの「近さ」のスコアに最も大きな影響を持ってオフに別の日を、持っています。また、いくつかのエージェントは、通常のスケジュールよりもある日に異なるスケジュールを持っています。たとえば、あるエージェントは月曜日に午前7時から午後3時まで働くかもしれませんが、火曜日には午前8時から午後4時まで働きます。

+0

"ベストチーム"をどのように定義しますか? – mrogers

+0

各チームの従業員がそれぞれのスケジュールの差異が最も小さい場合。 – obl

+0

@mrogers:これは本当の質問です。メトリックを取得したら、最適化を開始できます。 –

答えて

1

正確な答えが得られる方法が見つからない限り、私はチームの間でエージェントのペアをスワップすると物事が改善されるかどうかを繰り返し確認するヒルクライミングフェーズを最後に追加し、すべてのエージェントのペアを再チェックしたときに停止するだけで、それ以上の改善はありません。

私は2つの理由のためにこれを行うだろう:

1)このような山登りは驚くほど多くの場合、適度に良好な解を求めます。

2)人々はこのような改善を見つけることができます。コンピュータで作成されたスケジュールを作成し、人々が簡単な改善を見つけることができれば(たぶん他のチームの誰かと同じスケジュールでスケジュールされていることが分かったため)、あなたはばかげて見えます。

(2)地方の改善を見つける別の方法は、異なるチームの少人数が同時にスケジュールされているケースを探し、それらをすべて同じチームにスワップできるかどうかを確認することです。

1

スケジュールについてはっきり言えませんが、文字列アルゴリズムではedit distanceの計算が見つかります。アイデアは、別の文字列から1つの文字列を取得するために実行する必要がある操作の数を定義することです。たとえば、kittensittingの間の距離は、置換の場合は3,2、削除の場合は1です。 2人の従業員のスケジュールの間に同様の方法でメトリックを定義できると思います。

距離関数を設定したら、クラスタ化を開始できます。 k-meansアルゴリズムが適しているかもしれませんが、主な欠点はグループの数が最初に固定されていることです。しかし、私はあなたのニーズに合わせて一般的なロジックを簡単に調整できると思います。その後、データをクラスター化するいくつかの追加の方法を試すことができますが、実際に距離関数から始めて、単純に従業員の記録に最適化する必要があります。

関連する問題