Имя: Пароль:
IT
 
Очередь с весовыми коэффициентами
,
0 servs
 
30.01.14
13:16
Добрый день!
Есть регистр сведений, в котором активные менеджеры.
В базе есть константа, которая хранит последнего получившего заказ менеджера. При поступлении нового заказа, список активных менеджеров сортируется по алфавиту, далее находим последнего получившего заказ, и следующий после него - тот кто получит текущий заказ.

Теперь вопрос, нужно ввести некие коэффициенты. И переделать как-то алгоритм. У тех менеджеров, где коэффициент больше - частота получения заказа выше. Как реализовать?
1 Ненавижу 1С
 
гуру
30.01.14
13:18
генератор случайных чисел используй, если число вне диапозона, то переходишь к следующему менеджеру
2 fmrlex
 
30.01.14
13:19
(0) Сначала "Теперь вопрос, нужно ввести некие коэффициенты"
3 Ненавижу 1С
 
гуру
30.01.14
13:19
4 servs
 
30.01.14
13:25
(2) у меня логика такая)
(1), (3) спасибо, пригодится
5 Torquader
 
30.01.14
13:28
Во-первых, нужно учитывать время освобождения менеджера, то есть первый, кто освободился, по идее, и должен получать заказ, так как это заставит их более быстро работать.
Во-вторых, если следует ввести пропорцию по количеству уже полученных заказов, чтобы кто-то не остался вообще без всего.

В идеале, мы пишем функцию, которая в параметрах получает данные менеджера, время освобождения, количество заказов и т.п.
Далее, мы выбираем максимум этой функции на множестве доступных менеджеров - он-то и будет получающим следующий заказ.
6 dk
 
30.01.14
13:31
генератор случайных + 1
0..5 - Петров
6..8 - Сидоров
9.. 15 - Иванов
7 servs
 
30.01.14
13:40
(5) Все это уже отработано. Те, у кого есть заказы необработанные, в очереди не участвуют. Они мотивированы получать больше заказов.

(6) Мне тоже идея с генератором понравилась.
8 ЗлобнийМальчик
 
30.01.14
13:40
(6) и че будем делать если сидорову и иванову выпадет 20 заказов а петврову 1? петров вам попртит лицо я думаю
9 dk
 
30.01.14
13:42
(8) у генератора равномерный закон распределения
такой вариант возможен, но крайне маловероятен
10 servs
 
30.01.14
13:43
(8) заказов не мало, думаю распределение будет примерно равномерным.
11 ЗлобнийМальчик
 
30.01.14
13:44
(9) крайне - это сколько? лицо у меня одно все таки
(10) а сколько менеджеров в отделе и сколько заказов в среднем
12 Йохохо
 
30.01.14
13:45
(8) карибасы должны страдать
13 dk
 
30.01.14
13:45
(11) тебе интересно - возьми и протестируй
14 ЗлобнийМальчик
 
30.01.14
13:46
(10) если я правильно понимаю, у менеджеров заработок зависит от заказов
в этом случае любые отклонения от "справедливого" распределения будут восприниматься очень болезненно. я бы не рекомендовал
(13) слив засчитан
15 servs
 
30.01.14
13:48
(11) в среднем 25 заказов на менеджера в день
16 dk
 
30.01.14
13:48
(14) слабо написать тест - засчитано )
17 servs
 
30.01.14
13:49
(14) согласен, потому вопрос все еще актуален
18 servs
 
30.01.14
13:50
Как справедливо распределить заказы между заинтересованными менеджерами, с учетом весовых коэфициентов?
19 ЗлобнийМальчик
 
30.01.14
14:01
постройте очередь в которой обойдите всех менеджеров. Те у которых коэффициент меньше 1 - всречаются в очереди меньше одного раза. те у кого больше 1 - больше одного раза. обходим по очереди менеджеров. когда очередь заканчивается - переносим дробные части в следующую очередь.
Я бы так делал
20 Torquader
 
30.01.14
15:07
(19) С дробными коэффициентами можно бороться - просто умножить на какое-то число, чтобы все коэффициенты стали целыми и повторять в очереди людей столько раз, какой коэффициент у него указан.
Далее, можно из этой очереди выдёргивать любую запись, то есть отдавать менеджеру заказ - хоть случайно, хоть по порядку.

И, всё же, мне кажется логичным, что заказ получает тот, кто раньше освободился.
То есть регистр - таблица:Менеджер,ВремяОсвобождения,Занят.
Выбираем запросом первую запись с минимальным временем освобождения, и условием, что Занят=Ложь.
Этой записи ставится Занят=Истина, а менеджер получает заказ.
После того, как менеджер освобождается, он нажимает кнопку для постановки в очередь, которая обновляет его запись, указывая время освобождения, а Занят проставляет в Ложь.
И всё.
21 Torquader
 
30.01.14
15:08
Если нужны какие-то приоритеты, то добавляем ещё одно поле, где пишем приоритет, и выбираем по его убыванию.
То есть заказ получит менеджер с максимальным приоритетом, который ранее всех освободился.
22 servs
 
30.01.14
15:47
(20), (21) спасибо, но я придумал по-другому:
добавляем 2 поля: Количество заказов в рамках одной очереди (A), Количество заказов полученных в текущей очереди (B).
А - постоянный коэф. задается вручную.
B - при каждом получении заказа увеличивается на 1
При B = A, B присваиваем нулю.

Далее сортируем активных менеджеров:
1) A-B по-убыванию
2) По фамилии возр

В такой схеме по-моему даже константа "Последний получивший заказ менеджер" не нужна.
23 servs
 
30.01.14
15:49
Там где описание А и В "очередь" надо читать как общая порция заказов, в рамках которой идет распределение.

Ошибся немного в терминах, но суть надеюсь понятна.
24 servs
 
30.01.14
15:50
Кто-нибудь "подводные камни" видит?
25 servs
 
30.01.14
15:55
(21) У нас очень хитрые менеджеры, если по времени освобождения распределять, то качество пострадает.
Например, самый умный будет фиктивно проводить заказы, чтобы ему система добавляла еще, а потом когда будет затишье - начнет обзванивать те заказы, что провел ранее и корректировать их.
А нужно, чтобы заказы обрабатывались сразу при поступлении, а не через час, например.
26 Зойч
 
30.01.14
15:58
Сначала всем, у кого вес больше 1 - остаток от (вес - 1) кладем в кэш
Потом по кэшу, у кого уже есть 1, выдаем, потом опять всем и тд
27 Torquader
 
30.01.14
16:02
(25) Тогда проще сделать:
А - весовой коэффициент заказности, то есть доля в количестве заказов (получаемых по сумме всех долей).
Б - количество уже выполненных заказов.
Если Б равно нолю, то заказ получает менеджер с максимальным А.
Если Б не равно нолю, то выбираем минимум Б/А.
28 5 Элемент
 
30.01.14
16:05
(25) В приведенном примере не видно как пострадает качество.
Ну наберет заказы, главное чтобы он их отработал.
29 servs
 
30.01.14
16:06
(28) он будет их отрабатывать долго, а те кто недополучили заказы из-за хитрости коллеги, будут сидеть без работы.
30 5 Элемент
 
30.01.14
16:06
Ты определись что тебе нужно "справедливость для менеджеров" или "повысить эффективность" отработки заказов.
31 servs
 
30.01.14
16:07
(30) мне нужно равномерное распределение заказов, согласно очереди и коэф-тов
32 Torquader
 
30.01.14
16:07
(22) Вообще, есть две ситуации - первая, когда очередь заказов, то есть заказ пришёл, а свободного менеджера нет, тогда да - нужно их подгонять, чтобы они работали побыстрее; а вторая - заказов нет, а несколько менеджеров их ждут - тут, наоборот, нужно мотивировать менеджеров подольше работать с заказами - иногда это приводит к росту объёмов заказов.
33 Зойч
 
30.01.14
16:08
(25) корректировки нужно фиксировать и учитывать в КПИ
34 servs
 
30.01.14
16:09
(33) не согласен.
35 servs
 
30.01.14
16:11
(32) обе ситуации есть, например утром заказов много (за ночь насобиралось), те кто с утра конкурируют чтобы больше забрать заказов. Днем заказы к распределению приходят по-одному, а менеджеров активных много.
При этом необходимо, чтобы менеджеры отзванивались втечение 5 минут после поступления заказа.
36 Torquader
 
30.01.14
16:12
А что мешает обрабатывать заказы через час.
Например, если покупатель запрашивает то, что сейчас нельзя рассчитать - не проще ли узнать у покупателя телефон и заняться расчётом и запросом цен у поставщиков, а в это время взять ещё несколько заказов ?
Потому как иногда заказ может переходить в состояние, когда от менеджера уже ничего не зависит.
37 servs
 
30.01.14
16:13
(27) не пойму почему проще, в моем варианте нужно просто посортировать колонку и сразу получить того кому заказ (первая строка в таблице), в вашем варианте нужно искать минимум и максимум.
38 servs
 
30.01.14
16:15
(36) количество менеджеров позволяет отзваниваться по новым заказам втечение пяти минут после поступления заказа.
39 5 Элемент
 
30.01.14
16:16
(31) для этого нужно знать время выполнения заказа
40 Torquader
 
30.01.14
16:16
(37) Да, в принципе, таким же запросом и делается.
Непонятно только, зачем нужно сортировать их по фамилии ?
41 Зойч
 
30.01.14
16:17
(37) В итоге все получат по 1 заказу, только в разной последовательности и где тут весовые коэффициенты?
42 servs
 
30.01.14
16:18
(39) у меня уже реализована та чать, которая автоматически управляет активностью менеджеров, поэтому вопрос был лишь в распределении.
43 servs
 
30.01.14
16:18
(41) В (22) А - это весовой коэф-т
44 Torquader
 
30.01.14
16:19
(38) Тогда, быть может, разбить их на группы - "попугаи" и "кроты" - первые, отзваниваются как можно бытсрее и выясняют заказ, если быстро, делают всё сами, если какие-то запросы, то передают "кротам", а вторые "разгребают" то, что не сделали первые.
В этом случае, в начале рабочего дня "попугаи" получают последние заказы, по которым нужно отзвониться быстрее.
Потом, лимит времени на работу попугая можно задать так, чтобы он его старался соблюдать и успевал утрясти все простые вопросы, "крот" же должен довести заказ до конца.
45 Torquader
 
30.01.14
16:20
(43) Так и в (27) - тоже, только там в Б накапливается количество заказов, которое, само по себе, очень интересно.
46 servs
 
30.01.14
16:21
(40) Сортировка по фамилии это как очередь второго порядка, для тех у кого значения по первой сортировке одинаковы.
47 servs
 
30.01.14
16:22
(45) (22) и (27) по-моему одну и ту же суть несут, только я не понял почему (27) проще?
48 Torquader
 
30.01.14
16:22
(46) Это несправедливо, так как первые в списке будут иметь приоритет.
49 Зойч
 
30.01.14
16:23
(43) да, и я типа такого же предложил
50 servs
 
30.01.14
16:23
(48) так пока первая порция заказов не распределится их приоритет по фамилии не сработает
51 Torquader
 
30.01.14
16:24
(47) Потому что В, в (22) ставим равным нолю после того, как оно дошло до А.
Если все дошли, и все стали равными нолю - что - начинаем новый день ?
52 Torquader
 
30.01.14
16:25
(50) Если не сортировать по фамилии, то первой записью будет та, которая первая в регистре - тоже как бы априори задана.
53 Torquader
 
30.01.14
16:27
Просто, если каждый день первый заказ будет получать какой-нить Абакумов, то справедливость системы сразу поставят под сомнение.
54 Torquader
 
30.01.14
16:28
Ладно - в принципе - всё уже описано и сделано в (22) осталось только убедить менеджеров, что так и должно быть.
А мне пора.
55 servs
 
30.01.14
16:28
(51, 52, 53) понял, это уже доводка алгоритма, буду смотреть как лучше, выбор вы мне предоставили, спасибо
56 Йохохо
 
30.01.14
16:31
А - заказов за день всего
Ам - этому манагеру
Вм - вес манагера
Вм-Ам/А - отклонение веса
решаем задачу минимизации вектора, надо ввести метрику, ужас
при равных бросок ГСЧ
57 servs
 
30.01.14
16:34
(56) непонятно чем ваш вариант лучше предложеного в (22), (23) или (27).
Чем хуже - сказать могу, только смысл объяснять, если я для себя решение уже нашел?
58 Йохохо
 
30.01.14
16:35
метрика Мин() по всем итым больше 0
59 servs
 
30.01.14
16:36
(56) Если менеджеры работают втечение дня разное время, то ваш алгоритм будет работать не верно, заказы должны распределяться равномерно среди активных менеджеров, а не учитывать общее количество заказов, и отношение к весовому коэф-ту.
60 Йохохо
 
30.01.14
16:37
(57) я бы добавил случайности, а так все равно. в (22) манагер довольно быстро выяснит что до обеда ловить не чего
61 servs
 
30.01.14
16:39
(60) случайность состоит в том что таблица активных менеджеров непостоянна, те кто получают заказ, или долго не обрабатывают поступивший заказ, автоматически становятся неактивными.