web-dev-qa-db-ja.com

Excel VBAリソーススケジューリングアルゴリズムのガイダンス?

これは元々StackOverflowに投稿されていましたが、代わりにここに投稿することを提案しました。

アルゴリズムを使用してユーザーにサービスを提供するためのロータ/スケジュール割り当てスタッフを作成するExcel VBAソリューションを作成したいと考えています。この種の問題/アルゴリズムにはすでに既存の名前があると思いますが、何を参照するかは完全にはわかりません。

これが私のシナリオです:

同僚が、必要な訪問に対してスタッフをスケジュールするという問題で私に近づきました。現在、これは毎週行われる手動プロセスであり、労働集約的です。データセットは小さく、平均して20人のサービスユーザーが1日あたり2回の訪問を必要とし、5人のスタッフが毎日対応できます。

次の週に対応可能なスタッフのリストを含むワークシートがあります。データの各行には、名前、性別、スキルレベル、自宅の郵便番号、勤務時間、開始時刻と終了時刻が含まれています。スタッフは、朝と夕方の何時間も利用できる場合があるため、同じ日に複数回リストされることがあります。

別のワークシートには、翌週に必要なサービスユーザーと訪問のリストが含まれています。データの各行には、名前、郵便番号、訪問日、訪問時間、訪問期間、必要な性別(つまり、男性/女性が見なければならない)、必要なスキルレベル(つまり、任意、認定済み)、および必要なスタッフの数が含まれますその訪問(つまり1または2)。繰り返しになりますが、サービスユーザーは、1日の異なる時間(つまり、朝と夕方)に複数回の訪問を必要とする可能性があるため、同じ日に複数回現れることがあります。

郵便番号の処理を処理し、緯度と経度の座標を取得するVBA関数と、2点間の距離を計算する関数を作成しました。現在、座標がある郵便番号の個別の値は、VBAが参照できるようにヘルパーシートに保存されています。

私が本当に探しているのは、提案されたロータ/スケジュールを生成する手順/アルゴリズムを作成する方法についてのガイダンスです。これは、スタッフと訪問を組み合わせた単純なテーブルにすることができます。プロセスは常に、以下に基づいて適切なペアリングを行う必要があります。

  • 必要なスキルレベル
  • 性別が必要
  • スタッフの空き状況

最も重要なことは、試合は訪問と訪問の間の移動に必要な距離を考慮に入れることです。これは遺伝的アルゴリズムと呼ばれていると思いますか?

利用可能なスタッフに対してサービスユーザーが多すぎる場合、またはその逆の場合があります。すべての訪問を処理する場合は、すべてのスタッフを使用する必要はありません。スタッフの可用性が不足しているためにすべての訪問をペアリングできない場合、これを満たされていないものとしてリストする必要があります。

私は必要に応じてSQL Serverを利用できますが、最終的にはExcelでエンドユーザーにソリューションを提示する必要があります。

手順/プロセスは次のようにする必要があると思います:

  1. 毎日、訪問を開始時間でソートします
  2. 訪問ごとに、性別とスキルレベルの要件を満たし、その日に対応できるスタッフを決定します
  3. 上記で決定された各スタッフメンバーは、要求された時間に利用可能ですか?
  4. 利用可能な各スタッフメンバーについて、現在の場所から必要な場所までの距離を計算します。
  5. 移動に必要な距離で優先順にランク付けします
  6. これが毎日行われたら、ある種の採点方法を使用して、訪問に提案されたスタッフの割り当てを考え出します

私はVBAの専門家ではありませんが、SQL Serverを日常業務として扱っていますが、適切な解決策を考え出そうと思っています。最適な開始方法に関するガイダンスが必要です。

2
mheptinstall

私はあなたが提示している種類のスケジューリングの問題と使用している技術スタックについてある程度の経験を持っているので、権威から話して言うことができますこれはデータベースの問題であり、ExcelではなくSQL Serverに属しています!

これらがすでにスケジュールされている定期的な訪問であり、さまざまなタスクにスタッフを割り当てるだけでよい(そして、スタッフは訪問の間にホームオフィスに戻る必要がある)と仮定すると、次のプロセスをお勧めします。

  1. スタッフリストを、EmployeeテーブルとAvailabilityテーブルを別々にして、正規化されたテーブル構造に移行します。
  2. CustomerテーブルとVisitテーブルを使用して、サービスユーザーにも同じことを行います。 (訪問数の設定方法は別の質問です。)
  3. スタッフに与える割り当てを反映した、明確なAssignmentテーブルを作成します。この表には、実際のシフトと必要な非訪問の割り当て(「町を横切る」など)の両方が含まれます。プログラムは提案を生成しますが、人間がリストを修正できるようにする必要があります。
  4. 必要なすべての要件をまとめて追加することにより、visitごとに「複雑さ」のスコアを生成します。 (たとえば、「2人の認定された女性が3時間見なければならない」は7ポイントになることがあります。)
  5. 最も高い複雑度の値を得るには、その割り当てのすべての訪問について、その期間のすべての割り当てを行います。訪問時間と開始時間に基づいてタイブレーカーを使用して、一度に1行ずつこれを実行します。可用性に基づいてニーズを満たすスタッフを選択し、適切な並べ替えの値(優先度または「このシフトの実行時間」)を選択します。
  6. 顧客の場所と従業員の中央の場所の間の割り当てられたスタッフの移動時間エントリをマークします。
  7. すべての訪問が満たされるまで、上記の#5から繰り返します。
  8. Excelに戻る2つのリスト、1つのCustomer Visitsは、割り当てられた従業員を示し、Employee assignmentsは、各従業員が割り当てられる時間を示しています。割り当てられていないアイテムの両方にハイライトを含めます。

これの多くをあなたに代わるプロの労働力管理システムがありますが、それは購入に数万ドルを必要とし、従業員が多くの仕事を手動で行うと仮定します。 Excelで手動でこれを行っていた場合、any自動化が助けとなり、作業を進めるにつれて改善することができます。

(また、.NETまたはAccessを見て、Excelを置き換える場合もあります。ExcelからSQL Serverへのデータの往復は、AccessでSQLサーバーテーブルのフォームを作成するよりもはるかに困難です。)

2
DougM