Имя: Пароль:
1C
1C 7.7
v7: Подскажите с алгоритмом сортировки
0 1s_ivan
 
09.06.15
12:05
Друзья, помогите решить следующую задачу:

человечек каждый день ходит по одному и тому-же маршруту, при этом он заходит
часто в зоопарк З
часто в Кино    К
иногда в Бар  Б
редко в Парикмахерскую П
повторюсь маршрут одинаковый, а вот куда заходит- возможны варианты.
Отчет выглядит так:
1. З  Б  П
2. Б  К
3. Б  П  К

Итак через пол-года такой статистики он говорит: пойду в БАР и Кино и Зоопарк
Как обработать его маршруты, чтобы сказать что порядок будет:
Зоопарк, Бар а потом Кино, если он ни разу так не ходил еще, но это понятно по-человечески. (связи что после чего).
Таким образом нужно получить универсальную статистическую последовательность (из около 100 отчетов куда он заходил)  вида:
З Б П К
, чтобы потом отсортировать любой произвольный вариант посещения мест.
1 ejikbeznojek
 
09.06.15
12:13
сгруппировать в запросе написать ряд полей

когда З тогда 1 иначе 0 конец
когда П тогда 1 иначе 0 конец
....
когда Ж тогда 1 иначе 0 конец

потом суммировать и отсортировать.

В условиях запроса написать
где пункт посещения в (&ПунктыПосещения)
и передать нужные пункты.

выполнить запрос и обойти поля, отсортировав их
2 1s_ivan
 
09.06.15
12:21
количество и названия точек произвольное и указать их в запросе поименно не представляется возможным.
3 1s_ivan
 
09.06.15
12:24
Решение или подсказки можно и без привязки к 1с коду или запросам. Как удобно, если есть идеи можно просто математически или алгоритмически объяснить. Спасибо.
4 1s_ivan
 
09.06.15
12:27
(1) допустим сумма "З" будет 20 ,  "П" будет 10, что даст сортировка их между собой? Ведь фактически "П" после "З".
5 ejikbeznojek
 
09.06.15
12:29
(4) ну я почему то из условий подумал, что он сначала заходит туда, где бывал чаще.
6 mistеr
 
09.06.15
12:36
(0) На множестве точек (мест) нужно построить отношение порядка, то есть множество пар (А,Б) таких, что на маршруте А предшествует Б. Дальше построить транзитивное замыкание этого отношения. По нему можно упорядочивать любой набор точек.
7 mistеr
 
09.06.15
12:42
Алгоритмически так. Написать а) процедуру ДобавитьТочки(А, Б), добавляющую пару точек в отношение (и по ходу дела поддерживающую замыкание); и б) функцию Порядок(А,Б), возвращающую относительный порядок пары точек.

Скормить процедуре ДобавитьТочки() все точки из отчетов.

Дальше входной набор точек сортировать любым алгоритмом, используя в качестве функции сравнения Порядок().
8 1s_ivan
 
09.06.15
13:08
(7) Я так-же как и вы первым делом подумал над таким-же вариантом, взять все пары точек кто после кого, парами. Подскажите как имея пары, расположить их в порядке следования? Например имея из отчетов ЗБ ЗК ЗП  и  БП  понять что  Б перед К, а не после -  ведь до этого они никогда не были рядом.
9 1s_ivan
 
09.06.15
13:11
(6) как из "АБ АВ БВ" построить "АБВ" ?
10 ejikbeznojek
 
09.06.15
13:13
(9) При обработке пары АБ присвоить приоритет
А - 1000, Б-2000

При обработке пары АВ присвоить приоритет
А - 1000, В-2000

При обработке пары БВ увидеть, что приоритеты одинаковы
Уменьшить приоритет В на 1.

Отсортировать по приоритетам.
11 1s_ivan
 
09.06.15
13:21
(10) попробуйте объяснить как на варианте "БВ АВ АБ" построить "АБВ" ?
(те же данные в другом порядке) я не улавливаю математическое обоснование почему между "Б и В" разница в 1, а не в 1000 или 532 ?
12 ejikbeznojek
 
09.06.15
13:25
(11)
Б-В (Б - 1000 , В - 2000)
А-В (А-1000, В-2000)
А-Б (корректируем точку А уменьшая приоритет на 1), получаем
А - 999, Б- 1000,В -2000

1000 это запас для корректировок равных приоритетов.
1, просто минимальный шаг, чтоюы этот запас не слишком сильно тратить.
13 ejikbeznojek
 
09.06.15
13:29
(8)
ЗБ (З - 1000, Б - 2000)
ЗК (З - 1000, К - 2000)
ЗП (З - 1000, П - 2000)
БП (уменьшаем Б на 1 получаем Б - 1999, П - 2000)
Сортируем по приоритету, получаем
Приоритет Б меньше приоритета К
Б - 1999 К 2000
Можно запас для корректировок скажем поменять с 1000 до 1000000
14 ejikbeznojek
 
09.06.15
13:38
(13) Причём правильнее корректировку Б считать не Б=Б-1
, а  из Б=П-1
15 1s_ivan
 
09.06.15
13:47
(13) в этом примере НЕТ информации о том, что Б меньше К, почему вы уменьшаете на 1 ? на основании чего?

ЗБ
ЗК
ЗП
БП
"К" может быть как ближе всех к "З" так и дальше всех других. Т.К точка "К" ограничена только слева "З" и известно что она больше "З", а на сколько больше определить никак нельзя. В ЭТОМ примере точка "К" неопределена относительно других точек кроме "З". А в Вашем алгоритме как-то получилось определить положение "К". Мне кажется алгоритм с ошибкой. Могу ошибаться.
16 ejikbeznojek
 
09.06.15
13:57
(15) Всё верно, с ошибкой.
Но эта ошибка касается только тех, точек которые неопределенны как точка К, алгоритм их суёт куда"-то.

Но эти точки мне кажется в любом случае не обработаешь.
С течением времени приоритеты таких точек будут сами выравниваться (ограничиваться справа)

Б я уменьшал на основании того, что мне нужно было её сдвинуть левее точки П.
17 mistеr
 
09.06.15
14:04
(8) >как имея пары, расположить их в порядке следования?

Кого "их"?

>имея из отчетов ЗБ ЗК ЗП  и  БП  понять что  Б перед К, а не после

Из ЗБ ЗК ЗП БП еще не следует БК. Алгоритм упорядочивания должен это предусматривать. Если данных недостаточно, так и сказать.

Алгоритм добавления пар также должен проверять непротиворечивость отношения и отвергать противоречивые данные.


(10) (12) Отображение на числовую прямую это тупиковый путь.
18 1s_ivan
 
09.06.15
14:08
(17) вот короткая формулировка: как из "АБ АВ БВ" построить "АБВ" ?
19 mistеr
 
09.06.15
14:14
(18) Объясни что значит запись "АБВ".
20 1s_ivan
 
09.06.15
14:18
(19) "АБВ" это последовательность - решение полученное из анализа 3-х вариантов следования "АВ, АБ, БВ ". Не усложняя, считаем что исходный набор данных "АБ, АВ..." транзитивен.
21 1s_ivan
 
09.06.15
14:19
(обладает свойством транзитивности)
22 mistеr
 
09.06.15
14:21
(19) Если это есть "универсальная статистическая последовательность" из (0), то так.
Первый шаг. Собираем все уникальные точки из "АБ АВ БВ" в любом порядке. Получили допустим "ВБА".
Второй шаг. Сортируем "ВБА" согласно (7).
23 1s_ivan
 
09.06.15
14:30
(22) Спасибо, понял метод. Напишу что получится. К сожалению мои наборы данных не обладают транзитивностью, но кое-как отсортировать их можно.
AdBlock убивает бесплатный контент. 1Сергей