2012-01-10 2 views
0

私は複数のサービスを受け取り、受け取ったサービスによって層別化する必要があるランダムなグループの人がいます。 7つのサービスがあり、それぞれが全体を代表するためにクォータを持っています。各グループ(MSアクセス)のクォータに達する機会を最大限に集める人々をグループ化します。

MS Accessデータベースには3つのテーブルがあります。

tblQuota(ServiceType、NumberReq) - それぞれのサービス名とクォータのリスト。

ServiceType NumbersReq 
Service1  446 
Service2  426 
Service3  458 
Service4  446 

tblUserService(ユーザーID、サービス種別) - 彼らが受け取るユーザーとサービスの一覧。多くの場合、各サービスは多くの人を持つことができ、それぞれの人は多くのサービスを受けることができます。 tblUser(ユーザーID、住所など) - ユーザーの連絡先の詳細。

VBAなどを使用してプログラム的に最適な方法は、グループに人を配置することです。誰かが "まれな"サービスと "一般的な"サービスの両方を受け取った場合、私は明らかにそれらを希少なサービスに追加して、より少ない人数のプールを選択したいと考えています。 1つのサービスしか受けられない人は簡単です。それは残りの部分です。並べ替えのための良いアルゴリズムを思いつくのが難しいです。

私は意味をなさないと思います。私は毎年違うクォータと人でこれをやっていきますので、もしこれがうまくいくなら、将来的に多くの時間を節約できます。ありがとう。

EDIT:これは私が使用しているDBです。http://db.tt/SwrOHOrd 一度割り当てられた人は、他の場所では使用できません。

+0

あなたの説明にはそこにないものを読んでいるかもしれませんが、あなたは2つの方法で 'サービスタイプ'を使用しているようです。あなたに私の解釈を教えてあげましょう。ジョンは、サービスが必要な様々な健康問題(糖尿病、てんかん、高血圧、まれな遺伝病)を持っています。地元のサービスチームには専門はありますが、どんな条件にも対応できます。選ぶことで、Johnは "Rare conditions"チームに割り当てられますが、どのチームもこれを行います。私は正しいか、あなたの説明を修正する必要がありますか?いずれにせよ、あなたが手動でこれをどうやって行うかについてのいくつかのアイデアは、私が信じるでしょう。 –

+0

あなたはこれを見たことがありますか:[関連する可能性のある質問と回答](http://stackoverflow.com/questions/4765015/algorithm-for-fairly-assigning-tasks-to-workers-based-on-skills) –

+0

サービスはものです宿泊施設、設備、援助施設などのように、人々は1つまたは複数のものにアクセスすることができます。私は無作為に全人口のサンプルを選び、そのサンプルから全人口に基づいてクォータに合わせる必要があります。 – vbevan

答えて

0

私は最終的にあなたの要件を理解すると思います。元の質問から、あなたが満足度調査のためのクライアントを探していたことは分かっていませんでした。以下は、あなたが必要とする選択肢を作成するためのアルゴリズムでの私のスタブです。

私のSQLは錆びているので、Access table tbtUserServiceをExcelにコピーしました。

表1

CustomerID ServiceType 
25000005 Service 1 - Hostel and Community Residential 
25000005 Service 2 - Therapy 
25000010 Service 1 - Hostel and Community Residential 
25000010 Service 2 - Day options 
25000010 Service 2 - Therapy 
25000011 Service 3 - LAC 
    :   : 

私は、クライアントごとに1つの行を作成するために、これらのレコードをマージして与えるGへとサービスの種類と名前を変更:私は与えることをクライアントとサービスの種類によってソート

表2

CustomerID Services 
25000005 AD 
25000010 ACD 
25000011 E 
25000012 DE 
25000022 AD 
25000031 A 
    :  : 

私はサービスによって、そのリストをソートしてからcounte D与えるために、各組み合わせの数:

表3

Services Number Services Number Services Number Services Number 
A   182 AB   24 ABC   9 ABCD  34 
ABCDE  8 ABCDEF  7 ABCDEFG  1 ABCDEG  6 
ABCDF  2 ABCDG  1 ABCE  5 ABCEF  4 
ABCEFG  2 ABCEG  5 ABCF  1 ABCG  2 
ABD  17 ABDE  7 ABDEF  3 ABE   9 
ABEF  3 ABEFG  4 ABF   2 AC  185 
ACD  217 ACDE  18 ACDEF  8 ACDEFG  6 
ACDEG  2 ACDF  44 ACDFG  1 ACDG  6 
ACE  92 ACEF  12 ACEFG  6 ACEG  5 
ACF   2 ACFG  2 ACG   3 AD  254 
ADE  12 ADEF  4 ADF   4 AE   43 
AEF   8 AEFG  3 AEG   4 AFG   6 
B   143 BC   71 BCD  11 BCDE  18 
BCDEF  13 BCDEFG  19 BCDEG  11 BCDF  1 
BCDG  5 BCE  163 BCEF  47 BCEFG  16 
BCEG  18 BCF   1 BCFG  2 BCG   1 
BD   8 BDE  60 BDEF  20 BDEFG  1 
BDEG  2 BDF   1 BE  260 BEF  34 
BEFG  16 BEG  13 BF   4 BFG   1 
BG   2 C   43 CD   3 CDE  143 
CDEF  69 CDEFG  44 CDEG  26 CDF   3 
CE  489 CEF  177 CEFG  55 CEG  82 
CF   8 CG   1 D   111 DE  1726 
DEF  130 DEFG  28 DEG  13 DF   1 
E  5840 EF  312 EFG  40 EG   38 
F   17 FG   2 

次の目的は、クォータを満たすように選択されなければならないどのようにこれらの組合せのそれぞれの数を決定することです。

必要クォータがアクセステーブルtblProportionsからロードされた:以前のテーブルのいずれかを構築しながら

初期テーブル4

Service Type Numbers Req 
A    446 
B    426 
C    458 
D    446 
E    1290 
F    452 
G    452 

、Iは、各サービスの使用の合計数を計算したと結果を表4に追加して、以下のように与える:

Service Type Numbers Req Total uses 
A    446   1285 
B    426   1118 
C    458   2236 
D    446   3129 
E    1290   10210 
F    452   1197 
G    452   501 

私は4番目の列Ratioを追加し、t帽子の列。図から分かるように

ファイナル表4

Service Type Numbers Req Total uses Ratio 
G    452   501  0.902195609 
B    426   1118  0.381037567 
F    452   1197  0.377610693 
A    446   1285  0.347081712 
C    458   2236  0.204830054 
D    446   3129  0.142537552 
E    1290   10210  0.126346719 

、サービスGのクライアントの90%がGのクォータを満たすように選択されなければなりません。したがって、Gの割当量は、B、Fなどの割当量よりも前に考慮する必要があります。

表3(上下に読む)では、サービスGを含む最初のエントリは、Gのクォータへの寄与として選択された1つのオカレンスがあるABCDEFGです。しかし、それはまた、A、B、C、D、E、およびFの割当てに寄与する。

選択プロセスの完全な複雑さは、サービスBを考慮することによってよりよく実証される。 24回の出現がある。サービスBの比率は38%なので、これらのうち8つをBのクォータへの寄付として選択します。これはAのクォータに対する8の貢献度ですが、他の16のオカレンスはBのクォータを超える可能性があるため、選択できません。つまり、Aのクォータ446に向かって8人のクライアントを選択しましたが、Aクォータに割り当てられるクォータの数を1285から24で減らしました。したがって、すべての選択で、選択した合計を維持して選択する必要があります。各サービスの

クォータは次のように選択することによって満たすことができる。

表5

Services Slct'd Services Slct'd Services Slct'd Services Slct'd 
A   58 AB   8 ABC   3 ABCD  11 
ABCDE  2 ABCDEF  2 ABCDEFG  1 ABCDEG  5 
ABCDF  1 ABCDG  1 ABCE  2 ABCEF  1 
ABCEFG  2 ABCEG  5 ABCF  1 ABCG  2 
ABD   5 ABDE  2 ABDEF  1 ABE   3 
ABEF  1 ABEFG  4 ABF   1 AC   0 
ACD   0 ACDE  0 ACDEF  2 ACDEFG  5 
ACDEG  2 ACDF  10 ACDFG  1 ACDG  5 
ACE   0 ACEF  3 ACEFG  5 ACEG  5 
ACF   1 ACFG  2 ACG   3 AD  157 
ADE   0 ADEF  1 ADF   1 AE  107 
AEF   2 AEFG  3 AEG   4 AFG   5 
B   44 BC   22 BCD   3 BCDE  6 
BCDEF  4 BCDEFG  17 BCDEG  10 BCDF  1 
BCDG  4 BCE  51 BCEF  15 BCEFG  14 
BCEG  16 BCF   1 BCFG  2 BCG   1 
BD   2 BDE  19 BDEF  6 BDEFG  1 
BDEG  2 BDF   1 BE   79 BEF  11 
BEFG  14 BEG  12 BF   1 BFG   1 
BG   2 C   0 CD   0 CDE   0 
CDEF  15 CDEFG  40 CDEG  23 CDF   1 
CE   0 CEF   5 CEFG  49 CEG  74 
CF   0 CG   1 D   0 DE   0 
DEF  38 DEFG  25 DEG  12 DF   1 
E   402 EF   90 EFG  36 EG   34 
F   5 FG   2 

このテーブルのゼロの数があります。たとえば、サービスCのクォータがG、B、Fのクォータを満たしているため、AC、ACD、またはACDEは選択されていません。おそらく、すべての組み合わせの1つを選択した最初のパスがあったはずです。

最終段階は、これはすべての第A.

を約選択することにより、標準名とアルゴリズムのために使用されるものとの間の関係を達成することになる表2の182から表5のように58を選択するであろうおそらく以前に記載されているはずですが、表6

A Service 1 - Hostel and Community Residential 
B Service 1 - Supported Community Living 
C Service 2 - Day options 
D Service 2 - Therapy 
E Service 3 - LAC 
F Service 4 - Family support 
G Service 4 - Respite 

少し以降の整理整頓が必要になり、これらの結果を作成するために使用されるコードに示されているが、それは有用であろう場合、私はこの答えにそれを追加することができます。

関連する問題