Группируйте людей, чтобы максимизировать вероятность достижения квоты в каждой группе (MS Access) - PullRequest
0 голосов
/ 10 января 2012

У меня есть случайная группа людей, которые получают несколько услуг и должны разделить их по полученным услугам.Существует 7 служб, каждая из которых имеет квоту, чтобы быть представительной для целого.

В базе данных MS Access есть три таблицы.

tblQuota (ServiceType, NumberReq) - список имен служб и квот для каждого.

ServiceType    NumbersReq
Service1       446
Service2       426
Service3       458
Service4       446

tblUserService (UserID, ServiceType) - список пользователей и служб, которые они получают.От многих ко многим, каждая услуга может иметь много людей, и каждый человек может получить много услуг. tblUser (ИД пользователя, адрес и т. Д.) - контактные данные пользователя.

Как лучше всего программно с VBA или иным способом размещать людей в группы.Если кто-то получит и «редкую» услугу, и «общую», я бы, очевидно, хотел бы добавить их в редкую службу, в которой есть выбор из меньшего числа людей.Людям, которые получают только одну услугу, легко, а остальным у меня проблемы с придуманием хорошего алгоритма сортировки.

Надеюсь, у меня есть смысл;Я буду делать это каждый год с разными квотами и людьми, поэтому, если я смогу это решить, это сэкономит много времени в будущем.Спасибо.

РЕДАКТИРОВАТЬ: Это БД, с которой я работаю: http://db.tt/SwrOHOrd И как только человек назначен, его нельзя использовать в другом месте.

1 Ответ

0 голосов
/ 13 января 2012

Я думаю, что наконец понял ваше требование. Из первоначального вопроса я не оценил, что вы искали выбор клиентов для опросов об удовлетворенности. Ниже приведен мой пример алгоритма создания требуемого выделения.

Мой SQL ржавый, поэтому я просто скопировал таблицу доступа 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
   :        :

Я отсортировал этот список по Службам, а затем посчитал количество каждой комбинации, чтобы дать:

Таблица 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

При построении одной из предыдущих таблиц я рассчитал общее количество использований каждого сервиса и добавил результаты в таблицу 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

Я добавил четвертый столбец, Ratio, и отсортировал по этому столбцу.

Финальный стол 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, в которой есть 1 вхождение, которое выбрано в качестве вклада в квоту G. Но это также вклад в квоты A, B, C, D, E и F.

Полная сложность процесса выбора лучше демонстрируется при рассмотрении услуги B. Первая запись, включающая B, - это AB, из которых имеется 24 вхождения. Коэффициент обслуживания B составляет 38%, поэтому мы выбираем 8 из них в качестве вклада в квоту B. Это также вклад 8 в квоту А, но остальные 16 вхождений недоступны для выбора, поскольку это может привести к превышению квоты Б. То есть мы выбрали 8 клиентов с учетом квоты А в 446, но также сократили число клиентов, которые могли бы внести свою долю в квоту А, на 24 из 1285. Таким образом, при каждом выборе мы должны поддерживать итоги выбранных и все еще доступных для выбора. 1047 *

Квоты для каждой услуги могут быть удовлетворены следующими вариантами:

Таблица 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  

В этой таблице есть несколько нулей. Например, AC, ACD или ACDE не были выбраны, потому что квота для службы C была удовлетворена путем удовлетворения квот для G, B и F. Возможно, должен был быть первый проход, который выбрал одну из каждой комбинации.

Завершающим этапом будет выбор 58 Как в Таблице 5 из 182 в Таблице 2. Это будет достигнуто путем выбора примерно каждого третьего 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

Код, использованный для создания этих результатов, потребует небольшой корректировки, но я мог бы добавить его к этому ответу, если это будет полезно.

...