Транспортная задача 1С #762179


#0 by Mihailov Alexandr
Добрый день, форумчане и с новым 2016 годом! Есть проблема за такой задачей. Существует регистр сведений такого вида: На самом деле РС конечно же очень большой, добавлено много складов. Требуется написать процедуру которая бы искала кратчайший путь от СкладА до СкладЯ. Я уже голову всю сломал, подскажите, пожалуйста, как это сделать. Спасибо.
#0 by Mihailov Alexandr
Добрый день, форумчане и с новым 2016 годом! Есть проблема за такой задачей. Существует регистр сведений такого вида: На самом деле РС конечно же очень большой, добавлено много складов. Требуется написать процедуру которая бы искала кратчайший путь от СкладА до СкладЯ. Я уже голову всю сломал, подскажите, пожалуйста, как это сделать. Спасибо.
#0 by Mihailov Alexandr
Добрый день, форумчане и с новым 2016 годом! Есть проблема за такой задачей. Существует регистр сведений такого вида: На самом деле РС конечно же очень большой, добавлено много складов. Требуется написать процедуру которая бы искала кратчайший путь от СкладА до СкладЯ. Я уже голову всю сломал, подскажите, пожалуйста, как это сделать. Спасибо.
#1 by strange2007
Обходишь все возможные повороты от каждой точки. Строишь это в виде графа, хотя в некоторых случаях и дерево подойдёт. В каждом узле фиксируешь расстояние до предыдущих точек. Так-же фиксируешь все множества маршрутов до этого узла. В итоге потом надо будет просто обойти граф с поиском минимальный маршрут с учётом обхода всех складов. Как-то так. Я сейчас подобным на асме буду заниматься)))))
#2 by Fedor-1971
Как идея: построй матрицу по складам, в которой 1 есть путь со склада до склада, умножай её на саму себя и считай расстояние если в интересующем тебя складе есть 1. Типа граф связанности точек.
#3 by Vladal
На ассемблере строить массивы и деревья?
#4 by Sserj
Ну как бы можно обратиться к детям если есть в старших классах. Где то там начинают решать системы линейных уровнений.
#5 by strange2007
Уже сижу на обёртке от фасма, которая совсем даёт другой уровень абстракции и ассемблерные вставки делаю только в критических моментах. А так да, для масма есть блок для работы с деревьями.
#6 by wt
Линейное программирование. Исследование операций. Раздел Транспортная задача. Вам туда.
#7 by Drac0
маленький вопрос: склад1, склад2, 1 означает, что склад2, склад1,1?
#8 by Drac0
А вообще вот: Задача_о_кратчайшем_пути
#9 by Ildarovich
Вот статья: . Она называется "Определение кратчайших путей, критических путей одним запросом" . К статье прилагается работающая обработка. В частности, обработка позволяет находить кратчайшие пути по схеме метро. Думаю, и со складами проблем не будет. Но вообще говоря, задача о кратчайшем пути и транспортная задача - это не одно и то же. У транспортной задачи - другая формулировка. Она нацелена на составление плана перевозок между складами-источниками и складами-потребителями с минимальными издержками. Транспортная задача (но не задача о кратчайшем пути!) решается симплекс-методом.
#10 by Mihailov Alexandr
Всем спсибо, буду пробовать.
#11 by Garykom
не факт, но у ТС думаю да добавь сущность Маршруты - справочник реквизиты (СкладОткуда, СкладКуда, ПолноеРасстояние) ТЧ (СкладПромежуточный, Расстояние) затем заполни перебором всевозможные маршруты (без графов даже можно но долго будет перебирать) затем эти Маршруты подвяжи к новым записям в регистр свой
#12 by NSSerg
Задача - не транспортная, а поиска пути. Самое простое (но не самое быстрое) - алгоритм Флойда, три вложенных цикла. Определяет кратчайший путь между всеми парами складов. По матрице смежности - for k = 1 to n   for i = 1 to n     for j = 1 to n
#13 by Garykom
табличка умножения это гениально
#14 by Garykom
+ но что делать если Склад1 > Склад2 есть, а наоборот не возят?
#15 by Garykom
+ а понял юзать вариацию алгоритма с
#16 by NSSerg
Нет. Хранить расстояния в матрице смежности, а использовать алгоритм Флойда. Четыре строчки, три вложенных цикла. Матрица достижимости - это не алгоритм.
#17 by Garykom
да но алгоритм в ответ только число выдает - кратчайшее расстояние
#18 by NSSerg
Так же в три строчки определяется путь.
#19 by Garykom
может быть но что то мне подумалось что в случае ТС лучше так как нужен не только кратчайший путь но меньшее число перегрузок (на вершинах - складах)
#20 by NSSerg
Алгоритм ли работает на дискретном поле! На клеточном например. Не вижу клеточного поля в задаче Тут самый быстрый - дейкстра. Но он сложнее в реализации, и куда спешить?
#21 by NSSerg
Кто мешает стоимость перегрузке прибавить к длине пути при формировании матрицы смежности?!
#22 by NSSerg
Всё, построили матрицу смежности. И каким образом учет стоимости перегрузки может зависеть от алгоритма поиска пути? Он совершенно одинаково учитывается в любом алгоритме.
#23 by Garykom
не дискретном а планарном не факт что в планарное но если рейсы всегда только между 2 складами то можно структуру перевозок привести к планарной))
#24 by dumb851
#25 by NSSerg
Дискретном. С клеточками. И зачем тебе это? Я не понимаю логики. Самый простой в реализации алгоритм - Флойда. Четыре строчки кода. Ты же начинаешь что-то выдумывать.
#26 by Garykom
клеточки это только моделька, для упрощения это частный случай "волнового алгоритма"
#27 by Garykom
+ суть можно работать сразу с исходной структурой-таблицей (СкладОткуда, СкладКуда, Расстояние) достаточно добавить еще одну колонку и начать в цикле рассылать волны из исходного склада
#28 by Garykom
+ в алгоритме ли (на клеточках) очень легко определить соседей тут же придется на каждом шаге делать полный перебор всей таблицы с проверкой на условия - но при малом числе складов (<50) это вполне шустро
#29 by NSSerg
Я опять тебя не понимаю. Ты взял быстрый алгоритм, сделал так чтоб он стал медленным, и пытаешься им заменить самый простой из существующих алгоритмов? Зачем? Если писать быстрый алгоритм, например Дейкстру - то писать сразу нормально. Если нужен простой алгоритм, то проще Флойда алгоритма не существует.
#30 by Garykom
реализация проще получается, нет никакой предварительной подготовки данных для Флойда нужно как минимум склады пронумеровать (т.е. сохранить куда то последовательность складов с номерами) и матрицу составить для Дейкстры нужно тоже что то изобретать для хранения графа и состояния обхода
#31 by NSSerg
Ты издеваешься? Я тебе подготовку данных выше написал - - это весь код формирования матрицы смежности.
#32 by Garykom
+ "лучше день потерять потом за 5 минут долететь" - это не всегда верно т.е. если складов дофига, они никогда не меняются то да Флойд или Дейкстра если складов немного и иногда некоторые "не работают" то лучше волновой
#33 by NSSerg
Можешь скопировать в ветку работающий алгоритм ЛИ для случая ? Реализация ведь простая, проще +
#34 by NSSerg
Чем "волновой" лучше "Дейкстры"? В каких случаях волновой лучше Дейкстры?
#35 by Garykom
блин... вот был "Склад 1" запускаем алгоритм, а в это время кто то перименовал его в "Склад 21" как понять что "Склад 1" из алгоритма это "Склад 21" из базы?
#36 by Garykom
в данном случае не "алгоритм Ли", а просто "волновой алгоритм" и да реализация проще, у тебя только какие то непонятные переменные без понятия откуда они взялись из исходного регистра сведений
#37 by NSSerg
Дай ссылку на реализацию волнового алгоритма не "по сетке". На недискретном графе.
#38 by NSSerg
Ты издеваешься? Тебе выложить код который пронумерует склады?
#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) на нужное число пар "дискретных" ? но к задаче это уже не рассматриваем и тогда Флойд или Декстра ЗЫ и да ну как как получить из Флойда пусть в контексте исходных пар складов из регистра?
#46 by Garykom
+ *путь получить (по складам) а не только расстояние общее пути
#47 by Serginio1
#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 Путь не содержит начальную и конечную вершину, содержит только промежуточные в порядке их обхода. Изначально Путь[][] по всей матрице равен пустой строке.
#51 by NSSerg
Повторюсь - это не транспортная задача, а задача поиска кратчайшего пути по графу.
#52 by Garykom
Плиз проверьте кто нибудь...
#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
Не работает волновой алгоритм на любом графе приведенном к дискретному виду. Он вырождается в Дейкстру. Когда на каждом шаге строим путь из еще не обработанной вершины к которой текущий путь минимален.
#63 by NSSerg
Ты на вопрос не ответил. Где у тебя на каждом шаге запись в ТЗ?
#64 by Garykom
ТекМаршрут.НомерВолны = НомерВолны + 1;
#65 by NSSerg
Где у тебя на каждом шаге запись в ТЗ вершин достижимых на данном шаге? НомерВолны - это не вершина.
#66 by Garykom
+ эээ суть это "обратный волновой поиск" т.е. ищу с конца путь в начало, если нашли то просто по уменьшению чисел идем
#67 by Garykom
+ не треба
#68 by NSSerg
Похоже на шутку. Покажи ссылку на "обратный волновой поиск", который не требует запоминания достигнутых вершин.
#69 by NSSerg
ЦИКЛ   ДЛЯ каждой ячейки loc, помеченной числом d     пометить все соседние свободные непомеченные ячейки числом d + 1   КЦ   d := d + 1 ПОКА (финишная ячейка не помечена) И (есть возможность распространения волны) Смотри внимательно третью строчку псевдокода. Любой волновой алгоритм требует запоминания (пометки) достигнутых вершин.
#70 by Garykom
достигнутые вершины (пары маршрутов между складами) помечаются числами не достигнутые помечены -1
#71 by Garykom
блин, так запустить то код а? добавить туда маршрутов и проверить? дык не знаю как оно себя будет вести если данные некорректны если есть маршруты (Склад1, Склад1) или кольцевые маршруты
#72 by NSSerg
Строчку укажи в твоем коде, где помечаются вершины.
#73 by Garykom
см больше реально нигде нет записи в ТЗ для получения списка уже достигнутых "МаршрутыТекВолны = тзМаршруты.НайтиСтроки(Новый Структура("НомерВолны", НомерВолны));"
#74 by NSSerg
У тебя есть ТЗМаршруты, куда записаны ребра графа. У тебя даже структуры хранения пройденных (достигнутых) вершин нет.
#75 by NSSerg
Как-же ты их получаешь, если ты их не пишешь?
#76 by Garykom
блин... можешь ответить оно вообще работает? не смотря на то что "не должно"
#77 by NSSerg
Как можно что-то получить из структуры данных, не записав туда?
#78 by NSSerg
Еще раз тебе говорю - конечно не работает. Волновой алгоритм выглядит совсем не так.
#79 by Garykom
дык записываю в клеточки циферки, затем ищу клеточки с самой последней циферкой
#80 by Garykom
ладно это не "волновой алгоритм"... скажи тогда как его назвать?
#81 by NSSerg
Ты обидишься, если я придумаю адекватное название неработающему алгоритму :)
#82 by NSSerg
Ты не в клеточки записываешь числа. Клеточки - это склады, вершины, а не ребра. А ты записываешь числа в ребра графа.
#83 by Garykom
ну да в ребра пишу а что? какая разница ведь еще писал
#84 by NSSerg
И более того - даже эти записанные числа нигде не используешь. Создается структура в которой хранятся все склады. Далее пишешь по пунктам волнового алгоритма. Берешь начальную вершину, из которой строится путь, и во все достижимые из неё вершины пишешь единицу. Потом в цикле по номерам волны начиная с единицы ищешь вершины достижимые из вершин помеченных текущем номером волны, и если там ноль, то пишешь туда "номер текущей волны + 1" Можно проще - просто в начальную вершину записать единицу, а потом начать цикл по волнам начиная с единицы. Тогда число в вершине равно "длинепути + 1"
#85 by Garykom
+ цель была наваять алгоритм без преобразования данных (исходный регистр + новая колонка) и без дополнительных структур
#86 by NSSerg
Разница такая, что ты написал нерабочий алгоритм.
#87 by Garykom
зачем так сложно то? у нас ведь цель то не склады найти... а маршруты между складами зачем нам искать склады, а потом назад возвращаться из складов к маршрутам снова поиск делать?
#88 by NSSerg
Четыре ребра 1->2 2->3 3->4 4->5 Распиши по шагам как твой алгоритм найдет путь из "1" в "5"
#89 by Garykom
почему на приведенном тестовом наборе оно зараза тогда работает?
#90 by NSSerg
Потому что есть путь в два шага. А у тебя только в два шага и умеет искать.
#91 by NSSerg
Для Каждого МаршрутТекВолны Из МаршрутыТекВолны Цикл У тебя два вложенных цикла, которые ищут маршрут в два шага. В три шага естественно такой код уже не найдет.
#92 by HeKrendel
А религия не позволяет работать с яндекс или гугл апи?
#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
А, хотя ты добавляешь каждый раз ребра в новую ТЗ. Да, тогда рабочий, но по сложности алгоритма - это не волновой алгоритм. то есть это испорченный волновой алгоритм.
#95 by Garykom
Не мешай... мы тут изобретаем что потом будут юзать и яндекс и гугл в своем апи...
#96 by Garykom
ну пытался волновой упростить... получился вырожденный
#97 by NSSerg
Упростить? Волновой алгоритм - шесть строк кода. Как его можно упростить?
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С