#0
by Mihailov Alexandr
Добрый день, форумчане и с новым 2016 годом! Есть проблема за такой задачей. Существует регистр сведений такого вида: На самом деле РС конечно же очень большой, добавлено много складов. Требуется написать процедуру которая бы искала кратчайший путь от СкладА до СкладЯ. Я уже голову всю сломал, подскажите, пожалуйста, как это сделать. Спасибо.
#0
by Mihailov Alexandr
Добрый день, форумчане и с новым 2016 годом! Есть проблема за такой задачей. Существует регистр сведений такого вида: На самом деле РС конечно же очень большой, добавлено много складов. Требуется написать процедуру которая бы искала кратчайший путь от СкладА до СкладЯ. Я уже голову всю сломал, подскажите, пожалуйста, как это сделать. Спасибо.
#0
by Mihailov Alexandr
Добрый день, форумчане и с новым 2016 годом! Есть проблема за такой задачей. Существует регистр сведений такого вида: На самом деле РС конечно же очень большой, добавлено много складов. Требуется написать процедуру которая бы искала кратчайший путь от СкладА до СкладЯ. Я уже голову всю сломал, подскажите, пожалуйста, как это сделать. Спасибо.
#1
by strange2007
Обходишь все возможные повороты от каждой точки. Строишь это в виде графа, хотя в некоторых случаях и дерево подойдёт. В каждом узле фиксируешь расстояние до предыдущих точек. Так-же фиксируешь все множества маршрутов до этого узла. В итоге потом надо будет просто обойти граф с поиском минимальный маршрут с учётом обхода всех складов. Как-то так. Я сейчас подобным на асме буду заниматься)))))
#2
by Fedor-1971
Как идея: построй матрицу по складам, в которой 1 есть путь со склада до склада, умножай её на саму себя и считай расстояние если в интересующем тебя складе есть 1. Типа граф связанности точек.
#4
by Sserj
Ну как бы можно обратиться к детям если есть в старших классах. Где то там начинают решать системы линейных уровнений.
#5
by strange2007
Уже сижу на обёртке от фасма, которая совсем даёт другой уровень абстракции и ассемблерные вставки делаю только в критических моментах. А так да, для масма есть блок для работы с деревьями.
#9
by Ildarovich
Вот статья: . Она называется "Определение кратчайших путей, критических путей одним запросом" . К статье прилагается работающая обработка. В частности, обработка позволяет находить кратчайшие пути по схеме метро. Думаю, и со складами проблем не будет. Но вообще говоря, задача о кратчайшем пути и транспортная задача - это не одно и то же. У транспортной задачи - другая формулировка. Она нацелена на составление плана перевозок между складами-источниками и складами-потребителями с минимальными издержками. Транспортная задача (но не задача о кратчайшем пути!) решается симплекс-методом.
#11
by Garykom
не факт, но у ТС думаю да добавь сущность Маршруты - справочник реквизиты (СкладОткуда, СкладКуда, ПолноеРасстояние) ТЧ (СкладПромежуточный, Расстояние) затем заполни перебором всевозможные маршруты (без графов даже можно но долго будет перебирать) затем эти Маршруты подвяжи к новым записям в регистр свой
#12
by NSSerg
Задача - не транспортная, а поиска пути. Самое простое (но не самое быстрое) - алгоритм Флойда, три вложенных цикла. Определяет кратчайший путь между всеми парами складов. По матрице смежности - for k = 1 to n for i = 1 to n for j = 1 to n
#16
by NSSerg
Нет. Хранить расстояния в матрице смежности, а использовать алгоритм Флойда. Четыре строчки, три вложенных цикла. Матрица достижимости - это не алгоритм.
#19
by Garykom
может быть но что то мне подумалось что в случае ТС лучше так как нужен не только кратчайший путь но меньшее число перегрузок (на вершинах - складах)
#20
by NSSerg
Алгоритм ли работает на дискретном поле! На клеточном например. Не вижу клеточного поля в задаче Тут самый быстрый - дейкстра. Но он сложнее в реализации, и куда спешить?
#21
by NSSerg
Кто мешает стоимость перегрузке прибавить к длине пути при формировании матрицы смежности?!
#22
by NSSerg
Всё, построили матрицу смежности. И каким образом учет стоимости перегрузки может зависеть от алгоритма поиска пути? Он совершенно одинаково учитывается в любом алгоритме.
#23
by Garykom
не дискретном а планарном не факт что в планарное но если рейсы всегда только между 2 складами то можно структуру перевозок привести к планарной))
#25
by NSSerg
Дискретном. С клеточками. И зачем тебе это? Я не понимаю логики. Самый простой в реализации алгоритм - Флойда. Четыре строчки кода. Ты же начинаешь что-то выдумывать.
#27
by Garykom
+ суть можно работать сразу с исходной структурой-таблицей (СкладОткуда, СкладКуда, Расстояние) достаточно добавить еще одну колонку и начать в цикле рассылать волны из исходного склада
#28
by Garykom
+ в алгоритме ли (на клеточках) очень легко определить соседей тут же придется на каждом шаге делать полный перебор всей таблицы с проверкой на условия - но при малом числе складов (<50) это вполне шустро
#29
by NSSerg
Я опять тебя не понимаю. Ты взял быстрый алгоритм, сделал так чтоб он стал медленным, и пытаешься им заменить самый простой из существующих алгоритмов? Зачем? Если писать быстрый алгоритм, например Дейкстру - то писать сразу нормально. Если нужен простой алгоритм, то проще Флойда алгоритма не существует.
#30
by Garykom
реализация проще получается, нет никакой предварительной подготовки данных для Флойда нужно как минимум склады пронумеровать (т.е. сохранить куда то последовательность складов с номерами) и матрицу составить для Дейкстры нужно тоже что то изобретать для хранения графа и состояния обхода
#31
by NSSerg
Ты издеваешься? Я тебе подготовку данных выше написал - - это весь код формирования матрицы смежности.
#32
by Garykom
+ "лучше день потерять потом за 5 минут долететь" - это не всегда верно т.е. если складов дофига, они никогда не меняются то да Флойд или Дейкстра если складов немного и иногда некоторые "не работают" то лучше волновой
#33
by NSSerg
Можешь скопировать в ветку работающий алгоритм ЛИ для случая ? Реализация ведь простая, проще +
#35
by Garykom
блин... вот был "Склад 1" запускаем алгоритм, а в это время кто то перименовал его в "Склад 21" как понять что "Склад 1" из алгоритма это "Склад 21" из базы?
#36
by Garykom
в данном случае не "алгоритм Ли", а просто "волновой алгоритм" и да реализация проще, у тебя только какие то непонятные переменные без понятия откуда они взялись из исходного регистра сведений
#39
by Garykom
Я не издеваюсь, а уточняю что реализация будет несколько сложнее и нужно предусмотреть варианты типа
#40
by Garykom
+ фишка что мы меняем вершины (склады) с ребрами (путь между парами складов) местами и начинаем сразу волновой на исходных данных
#41
by NSSerg
Начинаем с самого начала. Волновой алгоритм не работает в случае задачи . Далее - алгоритм Флойда по сложности написания самый простой. Проще не бывает. Суммарно всё, вместе с нумерацией складов (например при помощи формирования списка складов - номер в списке это порядковый номер склада), с выдачей самого пути - это максимум строк 20 простейшего кода. Что у тебя первым пунктом? А теперь читай И при чем тут переименование складов? Каким образом в алгоритме фигурирует имя склада? Внимательно прочитай условие по ссылке которую ты дал - у тебя дискретный граф, и расстояние между каждой парой вершин равно единице!
#42
by NSSerg
В любом алгоритме придется пронумеровать вершины. И я не понимаю в чем проблема. Неужели так тяжело пронумеровать, например путем формирования списка складов?
#43
by Garykom
> Внимательно прочитай условие по ссылке которую ты дал - у тебя дискретный граф, и расстояние между каждой парой вершин равно единице! перечитал, откуда взялось про дискретный граф не понял? "Дано: непyстой гpаф G=(V,E). " да волновой алгоритм решит не задачу "кратчайший путь", а задачу "меньшее число перевозок между складами/перевалок" лично я считаю что для логистики в плане оптимизации затрат (не времени доставки) это логичнее
#44
by NSSerg
Меньшее число перевалок - это тоже самое что путь между двумя вершинами в графе равен единице. Каждое ребро - одна перевалка, то есть длина пути единица. Вот отсюда и берется дискретность графа. Давай вернемся к нашему разговору - где реализация волнового алгоритма для недискретного графа? Где решение задачи волновым алгоритмом?
#45
by Garykom
блин... кто мешает заменить каждую пару (СкладN1, СкладN2, S) на нужное число пар "дискретных" ? но к задаче это уже не рассматриваем и тогда Флойд или Декстра ЗЫ и да ну как как получить из Флойда пусть в контексте исходных пар складов из регистра?
#48
by NSSerg
открываешь любую статью по флойду, и читаешь как получить путь :) во второй матрице просто вместо расстояний хранишь путь, когда находишь новый кратчайший путь - складываешь пути из двух ячеек матрицы (ровно так-же как складываются длины путей)
#49
by GANR
Как сделать? Взять готовый алгоритм, реализующий транспортную задачу на Pascal и переделать на 1С.
#50
by NSSerg
for k = 1 to n for i = 1 to n for j = 1 to n Путь не содержит начальную и конечную вершину, содержит только промежуточные в порядке их обхода. Изначально Путь[][] по всей матрице равен пустой строке.
#53
by Garykom
+ да это волновой алгоритм (ищет маршрут минимальным числом перевозок между складами) а не Флойд (минимальное расстояние перевозки) за Флойдом это к NS ))
#54
by NSSerg
Твой код, даже если и работает, ищет не кратчайший маршрут, а первый попавшийся маршрут за минимальное число шагов (за минимальное количество промежуточных складов). Какой смысл его проверять?
#55
by Garykom
наверно потому что найденный маршрут будет с минимальным числом шагом? ну да есть тонкость что из двух одинаковых по числу шагов маршрутов возьмет любой попавшийся не смотря на расстояние между шагами
#56
by NSSerg
Даже на первый взгляд - код соврешенно не рабочий, ибо нигде не запоминаются достижимые узлы на каждом шаге. И это что за комментарий? Ты пытаешься считать минимальное число перевалок, то есть расстояние между вершинами одинаково, то есть граф дискретный, считаешь "по клеточкам"
#57
by Garykom
+ в смысле можно находить всевозможные маршруты, их в табличку, рассчитать общий путь для каждого и затем выбрать с минимальным путем
#58
by Garykom
ыыы, а их и не нужно запоминать эти достижимые узлы, ибо вместо этого НомерВолны юзается ЗЫ потому и прошу проверить что на приведенном наборе пашет, а будет ли работать на разных хз
#59
by NSSerg
Сама суть волнового алгоритма - мы запоминаем вершины достижимые на каждом шаге. На следующем шаге из вершин достижимых на шаге n строим вершины достижимые на шаге n+1 Покажи строчку в твоем коде где запоминаются вершины достижимые на шаге n+1.... Волновой алгоритм аналогичен "алгоритму закраски в ширину"
#60
by Garykom
любой не дискретный граф можно привести к дискретному виду достаточно выбрать подходящий "шаг дискретизации", понятно что в некоторых случаях НОДа нету и придется округлять
#61
by Garykom
а хз где это, моя не стал делать чистый волновой для графа с двумя списками вершин и т.д. это модификация волнового для ТЗ
#62
by NSSerg
Не работает волновой алгоритм на любом графе приведенном к дискретному виду. Он вырождается в Дейкстру. Когда на каждом шаге строим путь из еще не обработанной вершины к которой текущий путь минимален.
#65
by NSSerg
Где у тебя на каждом шаге запись в ТЗ вершин достижимых на данном шаге? НомерВолны - это не вершина.
#66
by Garykom
+ эээ суть это "обратный волновой поиск" т.е. ищу с конца путь в начало, если нашли то просто по уменьшению чисел идем
#68
by NSSerg
Похоже на шутку. Покажи ссылку на "обратный волновой поиск", который не требует запоминания достигнутых вершин.
#69
by NSSerg
ЦИКЛ ДЛЯ каждой ячейки loc, помеченной числом d пометить все соседние свободные непомеченные ячейки числом d + 1 КЦ d := d + 1 ПОКА (финишная ячейка не помечена) И (есть возможность распространения волны) Смотри внимательно третью строчку псевдокода. Любой волновой алгоритм требует запоминания (пометки) достигнутых вершин.
#70
by Garykom
достигнутые вершины (пары маршрутов между складами) помечаются числами не достигнутые помечены -1
#71
by Garykom
блин, так запустить то код а? добавить туда маршрутов и проверить? дык не знаю как оно себя будет вести если данные некорректны если есть маршруты (Склад1, Склад1) или кольцевые маршруты
#73
by Garykom
см больше реально нигде нет записи в ТЗ для получения списка уже достигнутых "МаршрутыТекВолны = тзМаршруты.НайтиСтроки(Новый Структура("НомерВолны", НомерВолны));"
#74
by NSSerg
У тебя есть ТЗМаршруты, куда записаны ребра графа. У тебя даже структуры хранения пройденных (достигнутых) вершин нет.
#82
by NSSerg
Ты не в клеточки записываешь числа. Клеточки - это склады, вершины, а не ребра. А ты записываешь числа в ребра графа.
#84
by NSSerg
И более того - даже эти записанные числа нигде не используешь. Создается структура в которой хранятся все склады. Далее пишешь по пунктам волнового алгоритма. Берешь начальную вершину, из которой строится путь, и во все достижимые из неё вершины пишешь единицу. Потом в цикле по номерам волны начиная с единицы ищешь вершины достижимые из вершин помеченных текущем номером волны, и если там ноль, то пишешь туда "номер текущей волны + 1" Можно проще - просто в начальную вершину записать единицу, а потом начать цикл по волнам начиная с единицы. Тогда число в вершине равно "длинепути + 1"
#85
by Garykom
+ цель была наваять алгоритм без преобразования данных (исходный регистр + новая колонка) и без дополнительных структур
#87
by Garykom
зачем так сложно то? у нас ведь цель то не склады найти... а маршруты между складами зачем нам искать склады, а потом назад возвращаться из складов к маршрутам снова поиск делать?
#88
by NSSerg
Четыре ребра 1->2 2->3 3->4 4->5 Распиши по шагам как твой алгоритм найдет путь из "1" в "5"
#91
by NSSerg
Для Каждого МаршрутТекВолны Из МаршрутыТекВолны Цикл У тебя два вложенных цикла, которые ищут маршрут в два шага. В три шага естественно такой код уже не найдет.
#93
by Garykom
Нашли решение! СкладОткуда|СкладКуда|НомерВолны Склад1|Склад2|3 Склад2|Склад3|2 Склад3|Склад4|1 Склад4|Склад5|0 Найденные маршруты: 1|Склад1|Склад2|1 2|Склад2|Склад3|1 3|Склад3|Склад4|1 4|Склад4|Склад5|1 Общая длина маршрутов = 4
#94
by NSSerg
А, хотя ты добавляешь каждый раз ребра в новую ТЗ. Да, тогда рабочий, но по сложности алгоритма - это не волновой алгоритм. то есть это испорченный волновой алгоритм.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Зависает нумерация документов!
- HELP: обновление без cf (есть cfu)
- Как из BAT-файла запустить задачу из планировщика ?
- Вывод печатной формы в MS Word типовыми средствами. Розница УФ.
- Подскажите в СКД другие результаты, чем в консоли
- Интеграция ЕГАИС. Ошибка при загрузке классификатора организаций
- Помогте с запросом - соединение по вхождению в иерархию
- Итог по документу в запросе - задваиваются показатели верхней группировки
- Разница между "Провести и закрыть" и "Провести" и закрыть по крестику?
- КД: выгрузка характеристик из УТ 11.1 в БП 3
- Свертка Розница 2.1
- v7: Добавить из одной ТЗ в другую
- Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля
- вопрос по переносу данных между одинаковыми конфигурациями
- поиск и замена ссылок для уф 8.3
- "Предопределенный элемент отсутствует в данных" - а он есть
- Синхронизация данных между ЗУП и БУХ
- Платформа CUBA как альтернатива 1С (2)
- Чтение базы Perco
- Подсчет количества элементов в динамическом списке