Топологическая сортировка и её применение (возможное) на производстве и других процедурах предприятия от кладовщика до бухгалтера и главного инженера

19.03.25

Разработка - Математика и алгоритмы

Топологическая сортировка или как оптимизировать процессы производства. Математические методы примеряем к 1С и сотрудникам. Алгоритм Кана. Разберем на примере производства велосипедов и как оптимизировать на производстве этапы.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
Топологическая сортировка (обработка-пример)
.epf 8,86Kb
6
6 Скачать бесплатно

Топологическая сортировка - это алгоритм упорядочивания вершин ориентированного ациклического графа (DAG) таким образом, что для каждого ориентированного ребра (u, v) вершина u идет в упорядочении раньше вершины v. Проще говоря, это способ выстроить задачи в таком порядке, чтобы каждая задача выполнялась только после того, как будут выполнены все задачи, от которых она зависит.

Представление графа:

Представим граф в виде таблицы значений, где каждая строка представляет вершину, а колонки:

  • Идентификатор (Строка): Уникальный идентификатор вершины.
  • Зависимости (Строка): Список идентификаторов вершин, от которых зависит данная вершина, разделенных запятыми (или другим разделителем).

Разберем процедуру топологической сортировки (где Граф - это наша таблица на форме с строковыми колонками):

 &НаСервере
Функция ТопологическаяСортировка(Граф) Экспорт

    // 1.  Создаем копию графа (чтобы не менять исходный)
    ГрафКопия = Граф.Скопировать();

    // 2.  Находим вершины без входящих ребер (источники)
    Источники = Новый Массив;
    Для Каждого СтрокаГрафа Из ГрафКопия Цикл
        Если СтрокаГрафа.Зависимости.Количество() = 0 Тогда
            Источники.Добавить(СтрокаГрафа);
        КонецЕсли;
    КонецЦикла;

    // 3.  Инициализируем результат
    Результат = Новый Массив;

    // 4.  Основной цикл
    Пока Источники.Количество() > 0 Цикл

        // 4.1.  Берем вершину из источников
        Вершина = Источники[0];
        Источники.Удалить(0);

        // 4.2.  Добавляем вершину в результат
        Результат.Добавить(Вершина.Вершина);

        // 4.3.  Удаляем вершину из зависимостей других вершин
        Для Каждого СтрокаГрафа Из ГрафКопия Цикл
            ИндексЗависимости = СтрокаГрафа.Зависимости.Найти(Вершина.Вершина);
            Если ИндексЗависимости <> Неопределено Тогда
                СтрокаГрафа.Зависимости.Удалить(ИндексЗависимости);

                // 4.4.  Если после удаления зависимостей у вершины не осталось входящих ребер,
                // добавляем ее в источники
                Если СтрокаГрафа.Зависимости.Количество() = 0 Тогда
                    Источники.Добавить(СтрокаГрафа);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;

        // 4.5. Удаляем обработанную вершину из графа
        ГрафКопия.Удалить(ГрафКопия.Найти(Вершина.Вершина, "Вершина"));


    КонецЦикла;

    // 5. Проверяем, остались ли в графе вершины. Если да, то в графе есть цикл.
	Если ГрафКопия.Количество() > 0 Тогда  
		Возврат "Ошибка: В графе обнаружен цикл!";
    КонецЕсли;

    // 6. Возвращаем результат
    Возврат Результат;

КонецФункции

Перед сортировкой "Зависимости" перегоняем в "Массив".

 

Как работает обработка:

  1. Пользователь заполняет табличное поле "Граф".
    • В колонке "Идентификатор" указывается уникальный идентификатор вершины.
    • В колонке "Зависимости" указывается список идентификаторов вершин, от которых зависит данная вершина, разделенных запятыми (например, "B, C, D", или "3,4,5" если используем цифры вместо букв).
  2. Пользователь нажимает кнопку "Выполнить сортировку".
  3. Код получает данные из табличного поля, преобразует строку зависимостей в массив и вызывает функцию топологической сортировки.
  4. Результат сортировки выводится в окно сообщений.

Ну а теперь практика, притянем к производству.

Рассмотрим сложный пример с зависимостями, приближенный к производственной сфере, и посмотрим, какой будет результат топологической сортировки.

Производство велосипеда

Пусть у нас есть следующие задачи по производству велосипеда:

  • A: Собрать раму велосипеда.
  • B: Изготовить переднее колесо.
  • C: Изготовить заднее колесо.
  • D: Покрасить раму.
  • E: Установить руль.
  • F: Установить сиденье.
  • G: Установить тормоза.
  • H: Установить колеса на раму.
  • I: Установить трансмиссию (цепи, звезды, переключатели).
  • J: Проверить качество сборки.

Зависимости:

  • A зависит от D (сначала нужно покрасить раму, потом собирать)
  • B ни от чего не зависит (можно начинать сразу)
  • C ни от чего не зависит (можно начинать сразу)
  • D ни от чего не зависит (можно начинать сразу)
  • E зависит от A (руль устанавливается на раму)
  • F зависит от A (сиденье устанавливается на раму)
  • G зависит от A (тормоза устанавливаются на раму)
  • H зависит от A, B, C (колеса устанавливаются на раму и нужно иметь готовые колеса)
  • I зависит от A (трансмиссия устанавливается на раму)
  • J зависит от E, F, G, H, I (проверять качество можно только после установки всех компонентов)
Идентификатор Зависимости
A D
B  
C  
D  
E A
F A
G A
H A, B, C
I A
J E, F, G, H, I
 

 

Результат топологической сортировки:

B, C, D, A, E, F, G, I, H, J

 

Этот результат говорит нам, в каком порядке следует выполнять задачи для производства велосипеда:

  1. B: Изготовить переднее колесо.
  2. C: Изготовить заднее колесо.
  3. D: Покрасить раму.
  4. A: Собрать раму велосипеда.
  5. E: Установить руль.
  6. F: Установить сиденье.
  7. G: Установить тормоза.
  8. I: Установить трансмиссию (цепи, звезды, переключатели).
  9. H: Установить колеса на раму.
  10. J: Проверить качество сборки.

Этот пример демонстрирует, как топологическую сортировку можно использовать для планирования и оптимизации производственных процессов.

 

Топологическая сортировка в 1С:ERP может быть полезна в следующих областях:

1. Планирование производства и управление производственными заказами:

  • Определение последовательности операций: Как показано в предыдущем примере, топологическая сортировка позволяет определить оптимальный порядок выполнения производственных операций, учитывая зависимости между ними. Это может быть использовано для автоматизации планирования производственных маршрутов и определения приоритетов задач.
  • Разрешение конфликтов зависимостей: В сложных производственных процессах могут возникать ситуации, когда зависимости между операциями становятся неясными или противоречивыми. Топологическая сортировка может помочь выявить такие конфликты и определить, какие операции необходимо перепланировать или выполнить параллельно.
  • Оптимизация использования ресурсов: Топологическая сортировка может быть интегрирована с механизмами планирования ресурсов (оборудование, персонал, материалы) для оптимизации их использования и минимизации простоев. Например, можно спланировать выполнение операций таким образом, чтобы ресурсы были доступны в нужный момент и не простаивали в ожидании завершения других задач.

2. Управление проектами и задачами:

  • Планирование этапов проекта: В проекта топологическая сортировка может быть использована для определения приоритетов задач, особенно если задачи взаимосвязаны. Задачи, от которых зависят другие задачи, должны быть выполнены в первую очередь.

3. Управление бизнес-процессами:

  • Анализ бизнес-процессов: Топологическая сортировка может быть использована для анализа существующих бизнес-процессов с целью выявления узких мест и оптимизации последовательности шагов.

4. Управление жизненным циклом продукции (PLM):

  • Управление изменениями: При внесении изменений в конструкцию изделия необходимо пересмотреть все связанные с ним процессы. Топологическая сортировка может помочь определить, какие этапы жизненного цикла продукции (проектирование, производство, испытания, и т.д.) необходимо изменить в первую очередь, чтобы обеспечить согласованность всех процессов.

5. Интеграция с другими системами:

  • Построение ETL-процессов (Extract, Transform, Load): При интеграции 1С:ERP с другими системами часто требуется выполнять преобразование данных и загрузку их в целевую систему. Топологическая сортировка может быть использована для определения последовательности выполнения задач ETL, учитывая зависимости между ними.

 

Топологическая сортировка в компьютерной архитектуре: планирование выполнения инструкций

В компьютерной архитектуре топологическая сортировка находит своё применение в задачах планирования выполнения инструкций, особенно в конвейерных процессорах (pipelined processors) и системах с внеочередным выполнением (out-of-order execution).

Суть применения:

  1. Представление инструкций как графа: Инструкции в программе можно представить как вершины графа. Если инструкция B зависит от результата инструкции A (например, B использует значение, вычисленное A), то между A и B создаётся направленное ребро (A -> B). Такой граф называется графом зависимостей данных (data dependency graph).

  2. Зависимости между инструкциями:

    • Зависимость по данным (Data Dependency): Инструкция B использует результат, вычисленный инструкцией A.
      • RAW (Read After Write): B читает данные, которые были записаны A. Это наиболее распространенный тип зависимости.
      • WAR (Write After Read): B записывает данные, которые были прочитаны A.
      • WAW (Write After Write): B записывает данные в то же место, куда записывала A.
    • Зависимость по управлению (Control Dependency): Выполнение инструкции зависит от результата условного перехода (например, if statement).
    • Зависимость по ресурсам (Resource Dependency): Две инструкции требуют один и тот же ресурс (например, арифметическое устройство, память) в один и тот же момент времени.
  3. Топологическая сортировка графа зависимостей: Применяя алгоритм топологической сортировки к графу зависимостей, мы получаем порядок выполнения инструкций, который гарантирует, что каждая инструкция будет выполнена только после того, как все инструкции, от которых она зависит, уже завершены.

  4. Планирование выполнения: Результат топологической сортировки используется планировщиком (scheduler) процессора для определения последовательности выполнения инструкций. В конвейерных процессорах это позволяет заполнить конвейер инструкциями, минимизируя простои, вызванные зависимостями. В системах с внеочередным выполнением это позволяет выполнять инструкции в порядке, отличном от программного, но с соблюдением всех зависимостей.

Преимущества использования топологической сортировки:

  • Правильность: Гарантирует, что инструкции выполняются в правильном порядке с учётом всех зависимостей, обеспечивая корректный результат.
  • Оптимизация: Позволяет выявить независимые инструкции, которые могут выполняться параллельно или вне очереди, повышая производительность.
  • Эффективность: Алгоритмы топологической сортировки обычно имеют сложность O(V + E), где V — количество инструкций (вершин графа), а E — количество зависимостей (рёбер графа). Это делает их достаточно эффективными для практического применения.

Пример:

Рассмотрим следующий фрагмент кода (условно ассемблерный):

1.  ADD R1, R2, R3  ; R1 = R2 + R3
2.  MUL R4, R1, R5  ; R4 = R1 * R5
3.  SUB R6, R7, R8  ; R6 = R7 - R8
4.  DIV R9, R6, R10 ; R9 = R6 / R10
5.  ADD R11, R4, R9 ; R11 = R4 + R9

Граф зависимостей:

  • 1 -> 2 (RAW: инструкция 2 использует результат R1, вычисленный инструкцией 1)
  • 3 -> 4 (RAW: инструкция 4 использует результат R6, вычисленный инструкцией 3)
  • 2 -> 5 (RAW: инструкция 5 использует результат R4, вычисленный инструкцией 2)
  • 4 -> 5 (RAW: инструкция 5 использует результат R9, вычисленный инструкцией 4)

Топологическая сортировка может выдать следующий порядок:

1, 3, 2, 4, 5

В этом порядке инструкция 1 и 3 выполняются первыми (они независимы). Затем 2 и 4, и наконец 5. Такой порядок позволяет, например, начать выполнение инструкции 3, пока инструкция 1 ещё не завершилась.

Дополнительные замечания:

  • В реальных процессорах планирование инструкций — гораздо более сложный процесс, чем просто топологическая сортировка. Он учитывает множество факторов, таких как доступность ресурсов, приоритеты инструкций, предсказание переходов и т. д.
  • Топологическая сортировка часто используется как один из этапов в более сложных алгоритмах планирования.
  • Внеочередное выполнение инструкций (out-of-order execution) позволяет процессору динамически переупорядочивать инструкции во время выполнения, чтобы максимально использовать доступные ресурсы и минимизировать простои.

Вот так математические алгоритмы применимы и в компьютерной архитектуре, и в реализации 1С задач.

Проверено на следующих конфигурациях и релизах:

  • 1С:ERP Управление предприятием 2, релизы 2.5.21.104

топологическая сортировка математические функции оптимизация производства технологические карты

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 1C:Бухгалтерия Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    6205    stopa85    12    

39

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    11691    user1959478    56    

37

Математика и алгоритмы Разное Платформа 1С v8.3 1C:Бухгалтерия Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    6015    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    14083    8    SpaceOfMyHead    20    

63

Математика и алгоритмы Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    7267    RustIG    9    

26

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    6424    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

21.03.2022    9704    7    kalyaka    11    

45
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. V.Nikonov 122 20.03.25 08:37 Сейчас в теме
Граф для ТМЦ легко строится по Спецификациям...
Я так понимаю, это попытка расставить "по порядку" Операции? А механизм быстрого отбора задействованных Операций можно озвучить? Или это всё про Абстрактные механизмы перестроения Графов?
2. user1195929 20 20.03.25 09:48 Сейчас в теме
Попытка расставить "по порядку" операции. Этапы есть у ресурсной спецификации, рекурсивно вытаскиваете из основной все этапы по дочерним спецификациям и топологической сортировкой выстраиваете порядок, причем в ерп (см. скриншот) данные для заполнения уже есть в колонках "порядок". Тогда вы сможете абсолютно все этапы по головной (вершине) спецификации упорядочить все опреации
Прикрепленные файлы:
Оставьте свое сообщение