Страницы: 1
RSS
Как оценить "фрагменированность" ЖД-состава относительно станции назначения?
 
Здравствуйте.
В ступоре от задачи, возможно, кто-нибудь подскажет путь решения, или даже рабочий способ. Есть список поездов, в каждом поезде некоторое количество вагонов, естественно, расположенных друг за другом, последовательно. Вагоны имеют метку станции назначения. По данному признаку в составе вагоны могут располагаться как в разброс единично, так и кусками, крупными/мелкими, по несколько штук, причём кусков для одной станции может быть несколько. Задача - обоснованно выразить фрагментированность поезда по станции назначения через какой-то показатель. На листе данные располагаются так: 1й столбец - название поезда, 2й - количество вагонов на станцию, 3й - название станции. Ниже пример (в тексте, столбцы представлены разделителем /, лист выложить нет возможности):

Поезд1 / 1 / станция2

             / 3 / станция3

             / 2 / станция2

             / 8 / станция1

             / 4 / станция3

              / 7 / станция2

              / 2 / станция1

Поезд2 / 18 / станция3

                       

Поезд3 / 7 / станция1

             / 5 / станция3

             / 1 / станция2

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

Изменено: StavRos - 01.07.2022 06:32:48
 
Мне кажется все не сложно ибо если не учитывать порядок, то достаточно определить, разбита ли хоть одна группа вагонов, идущая на одну станцию, вагоном или вагонами идущими на другую. Для этого следует просто посчитать количество групп в поезде идущих на станцию и сравнить с максимальной серией групп идущих на туже станцию (в примерах самая длинная серия) . Если есть хоть одно несовпадение, то состав плохой. Сложность может быть только в организации данных, а это в примере вы не предоставили.

Перемудрил, это относилось бы если был список повогонный, а не по количеству вагонов. А так, просто если хоть одна станция в поезде встретилась не сколько раз, то принимаем решение.
что-то типа этого
=PRODUCT(--(MMULT(--(D1:D7=TRANSPOSE(D1:D7));ROW(D1:D7)^0)=1))

D1:D7 - это данные по станции одного поезда. Как определить этот диапазон - это другой вопрос и на примере реальных данных в файле.
Изменено: БМВ - 01.07.2022 07:59:47
По вопросам из тем форума, личку не читаю.
 
?
 
Наконец-то могу посмотреть ответы нормально :) и могу загрузить файлик. Спасибо откликнувшимся.

БМВ - в книге попробовал применить Вашу формулу, поменяв названия функций на русские, для понимания. В книге названия станций уникальные, вид в общем то такой же, как и в реальном файле. В ячейке E2 - Ваша формула, со ссылкой на станции, в ячейке D2 - Ваша формула со ссылкой на вагоны. Поменял диапазоны, решил проверить, не ошибся ли я при указании данных. Но формула не работает ни в том, ни в другом варианте. В ячейке G2 - формула Ваша в оригинале, со ссылкой на станции. Возможно, я что-то неправильно сделал.

Vik_tor - можно подробнее про логику работы, а то не понял ничего...
 
так как от вас не было примера, попытался реализовать логику БМВ из #2 т.е. посчитать количество стаций и количество групп вагонов ( подразумеваем что нет случая, когда две группы вагонов на одну станцию записаны непосредственно друг за другом  
Изменено: Vik_tor - 04.07.2022 14:55:47
 
Vik_tor, функция _xlfn.UNIQUE - это Ваша авторская какая-то?
 
StavRos, нет, это УНИК, имеется в Эксель 2021 и О365.
Вот горшок пустой, он предмет простой...
 
Если правильно понял, то вариант в PQ:
Код
let
  data = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
  fillDown = Table.FillDown ( data, { "Поезд" } ),
  group = Table.Group (
    fillDown,
    { "Поезд" },
    {
      {
        "Фрагментированность",
        ( t ) =>
          if Table.RowCount ( Table.Group ( t, { "Станция" }, {} ) ) = Table.RowCount ( Table.Group ( t, { "Станция" }, {}, GroupKind.Local ) ) then
            "не фрагментирован"
          else
            "фрагментирован",
        type text
      }
    }
  )
in
  group
 
Спасибо большое. Обсудим с коллегами, попробуем применить :)
 
Возможно, так будет шустрее (результат аналогичен предыдущему коду):
Код
let
  data = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
  fillDown = Table.FillDown ( data, { "Поезд" } ),
  group = Table.Group (
    fillDown,
    { "Поезд" },
    {
      {
        "Фрагментированность",
        ( t ) =>
          if List.Count ( List.Distinct ( t[Станция] ) ) = Table.RowCount ( Table.Group ( t, { "Станция" }, {}, GroupKind.Local ) ) then
            "не фрагментирован"
          else
            "фрагментирован",
        type text
      }
    }
  )
in
  group

По сути тут ничего сложного нет. Просто для каждого поезда смотрим количество станций и число строк таблицы, локально сгруппированной по станции (группируется по подряд идущим одинаковым станциям).
А вот как-то выделить, вагоны на какие станции фрагментированы, немного посложнее уже будет. Но решаемо :).
 
Цитата
StavRos написал:
Возможно, я что-то неправильно сделал.
там формулы массива.
Вот еще вариант
=PRODUCT(--(MATCH(C2:C7;C2:C7;)=ROW(C2:C7)-ROW(C1)))
Изменено: БМВ - 04.07.2022 22:02:59
По вопросам из тем форума, личку не читаю.
 
Спасибо всем откликнувшимся. Будем на месте дальше думать, а то вводные меняются, а без чёткого ТЗ невозможно хороший результат получить.
Страницы: 1
Наверх