これは元々StackOverflowに投稿されていましたが、代わりにここに投稿することを提案しました。
アルゴリズムを使用してユーザーにサービスを提供するためのロータ/スケジュール割り当てスタッフを作成するExcel VBAソリューションを作成したいと考えています。この種の問題/アルゴリズムにはすでに既存の名前があると思いますが、何を参照するかは完全にはわかりません。
これが私のシナリオです:
同僚が、必要な訪問に対してスタッフをスケジュールするという問題で私に近づきました。現在、これは毎週行われる手動プロセスであり、労働集約的です。データセットは小さく、平均して20人のサービスユーザーが1日あたり2回の訪問を必要とし、5人のスタッフが毎日対応できます。
次の週に対応可能なスタッフのリストを含むワークシートがあります。データの各行には、名前、性別、スキルレベル、自宅の郵便番号、勤務時間、開始時刻と終了時刻が含まれています。スタッフは、朝と夕方の何時間も利用できる場合があるため、同じ日に複数回リストされることがあります。
別のワークシートには、翌週に必要なサービスユーザーと訪問のリストが含まれています。データの各行には、名前、郵便番号、訪問日、訪問時間、訪問期間、必要な性別(つまり、男性/女性が見なければならない)、必要なスキルレベル(つまり、任意、認定済み)、および必要なスタッフの数が含まれますその訪問(つまり1または2)。繰り返しになりますが、サービスユーザーは、1日の異なる時間(つまり、朝と夕方)に複数回の訪問を必要とする可能性があるため、同じ日に複数回現れることがあります。
郵便番号の処理を処理し、緯度と経度の座標を取得するVBA関数と、2点間の距離を計算する関数を作成しました。現在、座標がある郵便番号の個別の値は、VBAが参照できるようにヘルパーシートに保存されています。
私が本当に探しているのは、提案されたロータ/スケジュールを生成する手順/アルゴリズムを作成する方法についてのガイダンスです。これは、スタッフと訪問を組み合わせた単純なテーブルにすることができます。プロセスは常に、以下に基づいて適切なペアリングを行う必要があります。
最も重要なことは、試合は訪問と訪問の間の移動に必要な距離を考慮に入れることです。これは遺伝的アルゴリズムと呼ばれていると思いますか?
利用可能なスタッフに対してサービスユーザーが多すぎる場合、またはその逆の場合があります。すべての訪問を処理する場合は、すべてのスタッフを使用する必要はありません。スタッフの可用性が不足しているためにすべての訪問をペアリングできない場合、これを満たされていないものとしてリストする必要があります。
私は必要に応じてSQL Serverを利用できますが、最終的にはExcelでエンドユーザーにソリューションを提示する必要があります。
手順/プロセスは次のようにする必要があると思います:
私はVBAの専門家ではありませんが、SQL Serverを日常業務として扱っていますが、適切な解決策を考え出そうと思っています。最適な開始方法に関するガイダンスが必要です。
私はあなたが提示している種類のスケジューリングの問題と使用している技術スタックについてある程度の経験を持っているので、権威から話して言うことができますこれはデータベースの問題であり、ExcelではなくSQL Serverに属しています!。
これらがすでにスケジュールされている定期的な訪問であり、さまざまなタスクにスタッフを割り当てるだけでよい(そして、スタッフは訪問の間にホームオフィスに戻る必要がある)と仮定すると、次のプロセスをお勧めします。
Employee
テーブルとAvailability
テーブルを別々にして、正規化されたテーブル構造に移行します。Customer
テーブルとVisit
テーブルを使用して、サービスユーザーにも同じことを行います。 (訪問数の設定方法は別の質問です。)Assignment
テーブルを作成します。この表には、実際のシフトと必要な非訪問の割り当て(「町を横切る」など)の両方が含まれます。プログラムは提案を生成しますが、人間がリストを修正できるようにする必要があります。visit
ごとに「複雑さ」のスコアを生成します。 (たとえば、「2人の認定された女性が3時間見なければならない」は7ポイントになることがあります。)Customer Visits
は、割り当てられた従業員を示し、Employee assignments
は、各従業員が割り当てられる時間を示しています。割り当てられていないアイテムの両方にハイライトを含めます。これの多くをあなたに代わるプロの労働力管理システムがありますが、それは購入に数万ドルを必要とし、従業員が多くの仕事を手動で行うと仮定します。 Excelで手動でこれを行っていた場合、any自動化が助けとなり、作業を進めるにつれて改善することができます。
(また、.NETまたはAccessを見て、Excelを置き換える場合もあります。ExcelからSQL Serverへのデータの往復は、AccessでSQLサーバーテーブルのフォームを作成するよりもはるかに困難です。)