我有一组随机的人,他们接受多项服务,并需要将他们按收到的服务进行分层。共有7项服务,每项服务都有一个配额,以代表整个服务。
MS Access数据库中有三个表。
tblQuota(ServiceType,NumberReq) --每个服务名称和配额的列表。
ServiceType NumbersReq
Service1 446
Service2 426
Service3 458
Service4 446tblUserService(UserID,ServiceType) --他们接收的用户和服务列表。多到多,每项服务都可以有很多人,每个人都可以得到很多服务。tblUser(UserID,地址等)-用户联系方式。
使用VBA或其他编程的最佳方法是将人分组。如果有人同时获得“稀有”服务和“普通”服务,我显然希望将它们添加到可供选择的人数较少的稀有服务中。只有一种服务的人很容易,剩下的我很难想出一个很好的排序算法。
我希望我说得有道理,我每年都会用不同的配额和人员来做这件事,所以如果我能解决这个问题,将来会节省很多时间。谢谢。
编辑:这是我正在使用的DB:http://db.tt/SwrOHOrd,一旦分配了一个人,它们就不能在其他地方使用。
发布于 2012-01-12 20:51:08
我想我终于明白你的要求了。我没有从最初的问题中了解到,你们正在为满意度调查寻找一批客户。下面是我尝试创建所需选择的算法。
我的SQL很生疏,所以我只是将Access表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
: :我将这些记录合并到每个客户端创建一行,并将服务类型重命名为A到G,以便:
表2
CustomerID Services
25000005 AD
25000010 ACD
25000011 E
25000012 DE
25000022 AD
25000031 A
: :我按Services对该列表进行排序,然后计算要给出的每个组合的数量:
表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 下一个目标是确定每个组合中必须选择多少个才能达到配额。
从Access表tblProportions加载了所需的配额:
初始表4
Service Type Numbers Req
A 446
B 426
C 458
D 446
E 1290
F 452
G 452在构建前面的一个表时,我计算了每个服务的总使用数,并将结果添加到表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
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可以看到,90%的G服务客户必须经过挑选才能达到G的配额。因此,G的定额必须在B,F,等等之前考虑。
在表3(跨和向下读取)中,包括服务G在内的第一个条目是ABCDEFG,其中有一个事件被选为对G配额的贡献。但这也是对A、B、C、D、E和F的配额的贡献。
通过考虑服务B,更好地展示了选择过程的全部复杂性。包括B在内的第一项是AB,其中出现了24次。B服务的比例为38%,因此我们选择其中8项作为对B配额的贡献。这也是对A的配额的贡献8,但其他16次事件不能供选择,因为这将导致B的配额被超过。这就是说,我们选择了8个客户,对A的配额为446,但也减少了客户的数目可以贡献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 这个表中有许多零。例如,没有选择ACs、ACDs或ACDs,因为服务C的配额是通过满足G、B和F的配额来达到的,也许应该有第一关选择每种组合中的一种。
最后阶段将是从表2的182中选择表5中的58,这将通过选择大约三分之一的A来实现。
标准名称与算法使用的名称之间的关系应该在前面列出,但如表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用于创建这些结果的代码需要稍微整理一下,但如果有用的话,我可以将它添加到这个答案中。
https://stackoverflow.com/questions/8800225
复制相似问题