Поиск кратчайшего пути между городами методом обратного отслеживания (поиском с возвратом)

04.07.26

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

Представлен алгоритм решения задачи нахождения кратчайшего расстояния между городами методом обратного отслеживания (поиском с возвратом)

Файлы

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

Наименование Скачано Купить файл
Поиск кратчайшего пути
.epf 8,59Kb
0 3 000 руб. Купить
Поиск кратчайшего пути + поддержать автора 1см
.epf 8,59Kb
0 3 400 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Всем привет!

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

На обдумывание, создание, написание и отладку такого алгоритма меня сподвигнуло обсуждение со своим сыном задач 4  по ОГЭ по Информатики (для 9 классов). Задачи 9 по ОГЭ по Информатики решаются аналогичным алгоритмом (о них будет сказано ниже и отдельно). 

Среди задач по ОГЭ по Информатике (для 9 классов) встречаются задачи (№4) такого содержания. В таблице 5х5 указаны расстояния между городами. Необходимо определить кратчайший путь от одного города (например, А) до другого (В или Е), посетив каждый город только один раз. Иногда накладывается условие, что обязательно нужно посетить какой-то определенный город (например, С). Если между городами нет дороги, значит в соответствующей ячейке таблицы будет пусто (или ноль).

    

 

Скажем, исторически так сложилось, что мой сын сдал ОГЭ, и мы с ним обсуждали подобные задачи. Я написал алгоритм решения подобных задач.

Для учеников написание подобных алгоритмов не требуется, так как для этого необходимы минимальные знания методов динамического программирования, применения рекурсивных функций (процедур), знания и понимания синтаксиса языка программирования. На создание и отладку подобного алгоритма может уйти много времени. 

Представлена внешняя обработка на обычных формах, разработанная на платформе 1С:Предприятие 8.3 (8.3.27.1936). От конфигурации не зависит. В окне обработки в левом поле нужно указать данные из таблицы по задаче в виде матрицы 5х5: между числами должны быть пробелы, между строками можно оставлять пустые строки, можно и не оставлять - как вам удобно.

 

 

Практическое применение подобных задач - когда вам нужно отвезти товар по разным точкам, и вам необходимо при этом выбрать кратчайший путь. Сам алгоритм легко масштабировать до любых размеров 8х8, 14х14, 20х20 и т.д. - см. Листинг.

 
 Листинг алгоритма поиска кратчайшего пути

 


Перем МассивГородов; 
Перем МассивДлинПутей;
Перем МассивПутей; 
Перем СоответствиеГородов;
Перем СоответствиеИндексовГородам;  
Перем ИндексГородаФиниш;
Перем а; //матрица 5х5 - наша исходная таблица по задаче

Процедура НачатьРасчет()  
	
	МассивГородов = Новый Массив;
	МассивДлинПутей = Новый Массив;
	МассивПутей = Новый Массив;
	
	//стартуем с вершины А
	//А - 0, В - 1, С - 2, Д - 3, Е - 4 
	СоответствиеГородов = Новый Соответствие;
	СоответствиеГородов.Вставить(0,"А");
	СоответствиеГородов.Вставить(1,"В");  
	СоответствиеГородов.Вставить(2,"С");
	СоответствиеГородов.Вставить(3,"Д");
	СоответствиеГородов.Вставить(4,"Е");
	
	СоответствиеИндексовГородам = Новый Соответствие;
	СоответствиеИндексовГородам.Вставить("А", 0);
	СоответствиеИндексовГородам.Вставить("В", 1);
	СоответствиеИндексовГородам.Вставить("С", 2);
	СоответствиеИндексовГородам.Вставить("Д", 3);
	СоответствиеИндексовГородам.Вставить("Е", 4);

	ИндексГородаСтарт = СоответствиеИндексовГородам.Получить(Старт);
	ИндексГородаФиниш = СоответствиеИндексовГородам.Получить(Финиш);
	
	МассивГородов.Добавить(ИндексГородаСтарт); ДлинаПути = 0; ПредыдущийИндекс = ИндексГородаСтарт;
	РассчитатьПуть(ИндексГородаСтарт, МассивГородов, ДлинаПути, ПредыдущийИндекс);
	
КонецПроцедуры

Процедура РассчитатьПуть(i, МассивГородов, ДлинаПути, ПредыдущийИндекс) 
	
	Если МассивГородов.Получить(МассивГородов.Количество()-1) = ИндексГородаФиниш Тогда
		//Если достигли города Финиш 
		МассивДлинПутей.Добавить(ДлинаПути);  	
		Путь = "";
		Для Каждого Эл Из МассивГородов Цикл
			Путь = Путь + СоответствиеГородов.Получить(Эл);
		КонецЦикла;		
		МассивПутей.Добавить(Путь);       	
		
		Результат = Результат + Символы.ПС + Путь + " = " + ДлинаПути;
		         	
		МассивГородов.Удалить(МассивГородов.Количество()-1); 
		ДлинаПути = ДлинаПути - а[ПредыдущийИндекс][i];
	Иначе
		Для j = 0 По 4 Цикл      		
			Если МассивГородов.Найти(j) = Неопределено Тогда 			
				Если а[i][j]>0 Тогда
					МассивГородов.Добавить(j);
					ДлинаПути = ДлинаПути + а[i][j];
					РассчитатьПуть(j,МассивГородов,ДлинаПути, i);
				КонецЕсли;                   			
			КонецЕсли;    		
		КонецЦикла;
		Если МассивГородов.Получить(МассивГородов.Количество()-1) <> ИндексГородаФиниш Тогда  
			//Если прошли цикл по городам, и достигли "тупикового" города, который "не Финиш" 
			МассивГородов.Удалить(МассивГородов.Количество()-1); 
			ДлинаПути = ДлинаПути - а[ПредыдущийИндекс][i];
		КонецЕсли;             
	КонецЕсли;      	

КонецПроцедуры

 

Индексация массивов начинается с 0, названия городов: А, В, С, Д, Е - кириллицей для упрощения набора букв. Индекс i - отвечает за строки матрицы. Индекс j - отвечает за столбцы матрицы.   

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

Дополнительно, как задавать матрицы и умножать их между собой - описано здесь Матрицы и матричное программирование.

В задачах по ОГЭ Информатика встречается также задача 9 - по которой для представленной схемы связанных городов нужно найти все различные пути от города А в город К. Двигаться от города к городу можно только в одном направлении. Для такой задачи можно составить такую же матрицу, что и для задачи 4. Только матрица не будет симметричной, заполнена 1 если дорога от города к городу имеется и заполнена нулем (или пусто), если дороги между городами нет. Для такой матрицы алгоритм решения такой же, что и для задачи 4. 

Целью написания алгоритма с помощью рекурсивной модели не было создание полноценного коммерческого приложения. 

Целью написания алгоритма именно полного перебора было понимание, правильно ли ученик перебрал все варианты проезда, не упустил ли что-нибудь. При написании алгоритма можно было бы отсекать заведомо длинные пути, сравнивая с первым найденным коротким путем. Но снова мы вспоминаем цель написания алгоритма полного перебора - это самопроверка - нам нужно на выходе видеть все возможные пути и расстояния!

Также, для меня это было личным вызовом - придумать алгоритм полного перебора с помощью рекурсии - я не брал готовый алгоритм из книги или интернета, я написал его самостоятельно. До этого задачами коммивояжера я не занимался. После написания статьи благодаря комментаторам я погрузился в тему глубже.  

К примеру, во всех публикациях интернета  вас будут отговаривать использовать полный перебор, будут предложены другие алгоритмы обхода, например, алгоритм Дейкстры https://thecode.media/shortest-path/.

Если вы самостоятельно напишите алгоритм Дейкстры, как вы сможете проверить его правильность?

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

Задумавшись над контекстом проблемы и задачи поиска наилучшего пути по точкам (магазинам) - к примеру, нужно отвезти товары со склада по магазинам - я пришел к тому, о чем в классической задаче коммивояжера не говорится.

А именно, что нам не всегда нужно искать кратчайший путь (в километрах). Сегодня организациям нужно искать наилучший путь - в терминах математики, это оптимальный путь с учетом стоимости заказов, тоннажа, габаритов груза, времени пути, сроков доставки. Мои мысли подтверждает статья https://blogs.epsilonmetrics.ru/route-optimization.

Дополнительно, я считаю, что в первом приближении, в реальных задачах для малых компаний, которые работают в УТ, можно объединять точки доставки (магазины) по "районам" (квадрантам, областям, зонам, улицам) - тем самым сокращая количество узлов - то есть, допускаем. что точки доставки одного "района" представляют собой один узел. Это будет решение первого приближения.

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

У решения, представленного в данной статье - есть свое название. Подобное использование рекурсии относится к алгоритмам Поиска с возвратом или Метода обратного отслеживания (Backtracking).

На этом все. Всем добра!

 
 См. также
  1. Анализ прав и ролей. Поиск подходящего профиля - алгоритмический анализ и поиск
  2. Оцифровка и визуализация склада - программная прорисовка склада
  3. Удаление документов для любых баз на управляемых формах
  4. Удаление справочников для любых баз на управляемых и обычных формах
  5. Перенумерация документов и справочников - с учетом префиксов номеров
  6. Свертка базы УТ 10.3 подокументно - новая концепция 
  7. Матричное программирование - демо-стенд матричного калькулятора
  8. Справочное хранение товаров в КА 2.5 - кейс запуска адресного склада
  9. Мини-обзор разных задач - от очевидного до неочевидного
  10. Поиск отчета по документам - пример анализа незнакомых конфигураций
  11. Флажок в динамическом списке - от теории до практики "как бы простой" задачи
  12. Из Json в ДеревоЗначений - удобный просмотрщик json-структуры
  13. Внедрение адресного склада в КА 2.5 - кейс запуска адресного склада
  14. Фрилансеру: про цены, про клиентов, про планирование - мое исследование
  15. Что такое форматированный документ - прекрасная возможность раскрасить любой текст
  16. Программная работа с упаковками в КА 2.5 - примеры адаптаций механизмов упаковок в КА 2.5
  17. Универсальное сравнение регистров накопления - связь по измерениям, сравнение по ресурсам
  18. Обход объекта рекурсивно - просмотр реквизитов документа с бесконечным открытием подуровней

 

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

  • Управление торговлей, редакция 10.3, релизы 10.3.88.3

Вступайте в нашу телеграмм-группу Инфостарт

поиск кратчайшего пути

См. также

Математика и алгоритмы Программист 1С 8.3 Абонемент ($m)

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

1 стартмани

07.11.2025    5952    14    InFlach    17    

27

Математика и алгоритмы Запросы Программист 1С:Предприятие 8 Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    6954    ivanov660    9    

24

Математика и алгоритмы Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

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

1 стартмани

30.01.2024    14787    stopa85    12    

43

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

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

19.10.2023    22968    user1959478    57    

41

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

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

2 стартмани

29.09.2023    13826    maksa2005    8    

27

Математика и алгоритмы Инструментарий разработчика Программист 1С:Предприятие 8 Россия Абонемент ($m)

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

1 стартмани

09.06.2023    23618    11    SpaceOfMyHead    20    

65

Математика и алгоритмы Программист 1С:Предприятие 8 Бесплатно (free)

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

03.04.2023    15665    RustIG    10    

30

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

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

23.11.2022    14687    gzharkoj    17    

27
Отзывы
36. RustIG 1979 04.07.26 13:37 Сейчас в теме
Для пытливых умов...Для интересующихся...Для новичков в теме оптимизации алгоритмов....

Почему полный перебор с учетом ограничений по условиям задачи не равен полному перебору всех перестановок n! -
Почему важно понимать локальные нюансы задачи: ограничения, допущения, приоритеты -

рассказано вот в этой статье - как задача с полным перебором вариантов сначала решалась за 4 часа (24 млрд. вариантов) - затем код полного перебора переписали с учетом ограничений и довели сначала до решения за 8,5 минут, а затем и вовсе за 0,5 сек. : https://thecode.media/einstein-3/

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

Конкретно, в задаче обхода городов - есть города - "тупики", из которых нет дорог в другие города - а потому алгоритм перебора не будет учитывать дальнейшие варианты с этими тупиковыми городами.

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

ПС. Так уж повелось, что в жизни, как внедренец и программист 1с, я предлагал заказчикам разные способы решений - для меня все аспекты задачи были равнозначными: учесть и это, и то... Но в заключительный момент ЛПР (директор, бухгалтер, руководитель) говорил, что "вот это нам в принципе не важно, давайте упростим задачу"... В итоге решение получалось выигрышным. Не универсальным - тут это не главное - а выигрышным.
Позже я выработал такой принцип решения задач клиентов: "сначала решаем задачу-минимум, затем решаем задачу-максимум". В большинстве случаев, достаточно было решить задачу-минимум.
Сказать точно не могу, но как будто задача -минимум давала 80%, а задача -максимум остальные 20% выигрыша...

Любой мой ответ- комментарий будет не полным. Я не стараюсь убедить вас в том, что полный перебор это крутое решение., но это решение , которое лежит на поверхности, и додуматься до него проще простого. Я не призываю не исследовать другие решения - алгоритм Дейкстры и другие. Наоборот, разберитесь сначала с решением полного перебора - для полной картины.
Человек с опытом может использовать разные инструменты. Человек без опыта всегда будет находить недочеты в любом решении, даже в самом очевидном.
Напоминает спор об использовании запроса в цикле, о котором я также много спорил и написал на ИС...
37. RustIG 1979 04.07.26 19:36 Сейчас в теме
Оказывается, у решения, представленного в данной статье - есть свое название. Подобное использование рекурсии относится к алгоритмам "поиска с возвратом" :
Алгоритм поиска с возвратом тоже относится к полным переборам, но у него есть особенность, которая делает этот перебор проще:
если алгоритм понимает, что идёт по неверному пути, то все остальные варианты в этом пути тоже помечаются как неправильные и алгоритм их не рассматривает.

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

1. для синтаксического анализа естественной речи, когда компьютеру нужно разложить текст на лексические составляющие, подобрать ответ, а потом поставить слова в ответе в правильном и естественном порядке;
2. для поиска решений в задачах «про наполнение рюкзака», когда нужно найти, например, оптимальное соотношение веса, объёма и цены;
3. в языках логического программирования — Prolog или Planner, которые используют этот алгоритм для создания ответов на запросы пользователя;
4. для решения логических задач и пазлов, например судоку:


ссылка на проф.статью https://thecode.media/backtracking/
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. V.Nikonov 126 26.06.26 10:11 Сейчас в теме
На практике, часто возникает задача построения Маршрута посещения Точек... Однако,если не обращаться к данным Yandex навигатора (платный расчёт маршрута), то из бесплатного будет только координаты точек.
Исходя из предположения, что при незначительных расстояниях можно считать одинаковую протяженность каждого градуса широты (или долготы), и предполагая очень разветвлённую сеть Дорог... Задача сводится к вычислению геометрических расстояний на плоскости (в градусах, не км). Отсюда оптимизационный поиск кратчайшего маршрута...
2. RustIG 1979 26.06.26 10:18 Сейчас в теме
(1) Как яндекс или дубльгис рисуют карты и проставляют координаты объектов?
- просто много лет ездят на спецмашинах и фиксируют на картах...
так делали мореплаватели и путешественники все 2000 лет ....
нужно пойти по тому же принципу + привлечь готовые карты яндекс с их расстояниями между объектами:
условно оператор в Навигаторе заводит точку А и точку В - ему Навигатор сам посчитает км и время. Эти два показателя нужно внести в 1с таблицу.

Далее, исходя из ежедневных маршрутных листов (согласно заказам), можно посчитать кратчайший путь или "кратчайшее время" между точками...Это приблизительный план...
5. RustIG 1979 26.06.26 11:09 Сейчас в теме
(2) время надо считать, чтобы решить такую задачу - успеть за 3 часа до обеда, и успеть за 4 часа после обеда. Примерно как-то так...
10. V.Nikonov 126 26.06.26 11:33 Сейчас в теме
(5) Интересный подход. Получить данные о времени прибытия в каждый из Пунктов, намного проще. Отсюда можно заполнять матрицу расстояний в Минутах... Остаётся только доделать механизм получения Усредненного времени.
Сложности только с Новыми точками (до первых поездок), как получить множество расстояний до ближайших зарегистрированных точек?
И значительные проблемы с объёмом хранимых данных...
7. V.Nikonov 126 26.06.26 11:24 Сейчас в теме
(2) Проблема с внесением этих данных в Информационную базу. Никакой водитель не будет фиксировать фактическое расстояние от точки А до Б. Как и последующий ввод в Информационную базу проблематичен, даже по данным Навигатора. Количество точек ОЧЕНЬ большое, а матрица расстояний - это Квадратичная зависимость...
11. RustIG 1979 26.06.26 11:35 Сейчас в теме
(7) это не водитель должен делать, статистику можно собирать - распечатав каждому водителю путевой лист - с доп. колонками - пусть в этих колонках он проставляет Км и Время....Путевой лист сортируется заранее по порядку следования машины.
...может вы и правы, стоит подключить яндекс на месяц - чтобы собрать данные между клиентам, далее уже использовать их - я не думал над этим. Думал, что бесплатного открытого исходника по задаче в интернете нет.... У многих эта задача просто в статусе "Неопределено"
15. V.Nikonov 126 26.06.26 11:44 Сейчас в теме
(11) Водитель в реальности может только СМС о прибытии отправлять (может в Приложении отмечаться). Эти сырые данные можно сопоставить с планируемым маршрутом, дополнить Матртицу расстояний. Никакой писанины от экспедиторов не дождётесь.
19. RustIG 1979 26.06.26 11:47 Сейчас в теме
(15) можно отметку ставить - во сколько приехал, во сколько уехал....
это не сложно - можно по смс определить время приезда
12. RustIG 1979 26.06.26 11:36 Сейчас в теме
(7)
Количество точек ОЧЕНЬ большое, а матрица расстояний - это Квадратичная зависимость...

Клиентов 1000, но за день надо объехать согласно заказам 10-20 точек - вполне разумно
16. V.Nikonov 126 26.06.26 11:45 Сейчас в теме
(12) В матрицу внося Потенциальные точки, а не текущий рейс.
18. RustIG 1979 26.06.26 11:46 Сейчас в теме
(16) согласно реальным заказам - сколько точек объедет машина до обеда?
14. RustIG 1979 26.06.26 11:43 Сейчас в теме
(7) карта яндеск заполнялась годами - надо понимать, что нужно или купить готовую базу с координатами, или так же постепенно наполнять по своим клиентам....

У меня был проект на складе https://infostart.ru/1c/tools/1946087/ и использован такой подобный подход:
Я же пошел по другому пути, потому что склад уже наполнен товарами, и процесс перехода на справочное хранение номенклатуры по ячейкам происходил на действующем складе.

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


- наполнение базы без отрыва от работы - бесшовная интеграция так сказать - со временем все товары были разнесены по ячейкам.... то же самое с адресами клиентов - они же постоянные, их не так много...
V.Nikonov; +1 Ответить
20. V.Nikonov 126 26.06.26 11:53 Сейчас в теме
(14) В реальности, перед доставкой достаточно найти Покупателя на карте Yandex, слизнуть оттуда координаты. Эти данные можно сохранить Грузополучателю в Базе.
Но, это не Матрица расстояний.
База данных от Yandex - это утопия.
32. RustIG 1979 26.06.26 21:34 Сейчас в теме
(1)
то из бесплатного будет только координаты точек.

вот тут побольше описано https://infostart.ru/1c/articles/2351369/
V.Nikonov; +1 Ответить
35. RustIG 1979 28.06.26 01:06 Сейчас в теме
(1) вот нашел https://thecode.media/shortest-path/ - для информации делюсь
3. SerVer1C 1104 26.06.26 10:50 Сейчас в теме
Зачем это за см выкладывать? неужели кому-то это понадобится? ))
4. RustIG 1979 26.06.26 11:07 Сейчас в теме
(3) к сожалению, 10 лет на ИС - и до сих пор не знаю как лучше монетизировать свой труд на ИС - то ли как статью выкладывать, то ли как обработку....
Очень жаль, конечно, что никто не подсказывает из администрации ИС....

Я посчитал, что скачав обработку , пользователи смогут проверить на задачах из ОГЭ и сравнить с ответами оттуда.
Тем самым поняв, что алгоритм работает корректно.
6. SerVer1C 1104 26.06.26 11:20 Сейчас в теме
(4)
как лучше монетизировать свой труд на ИС
Даю подсказку (на основании соседних статей). Генерите нейронкой статью на 10 килознаков и получаете свои 10СМ. Можно в день генерить по 4 публикации. Даже если статью никто не заценит, вы останетесь при своих СМ.
8. V.Nikonov 126 26.06.26 11:25 Сейчас в теме
(6) Некрасивый совет.
9. SerVer1C 1104 26.06.26 11:27 Сейчас в теме
(8) Зато жизненный. У народа прокатывает же...
13. V.Nikonov 126 26.06.26 11:38 Сейчас в теме
Реальные исходные данные:
Не менее 500 действующих точек доставки (без учета выбывших);
Соответственно матрица размером 500*500=250тыс. расстояний!!
А есть Продавцы доставляющие в десятки тысяч потенциальных точек!
17. RustIG 1979 26.06.26 11:45 Сейчас в теме
(13) расчет делается в разрезе одной машины и одного дня, обычно до обеда один маршрут, после обеда другой - таким образом ни одна машина 1000 точек обслуживать не будет....упрощайте задачу - сколько реально точек объедет одна ваша машина до обеда?
21. V.Nikonov 126 26.06.26 12:10 Сейчас в теме
(17) Вопрос не в Конкретном рейсе (для которого надо построить маршрут), а Матрице расстояний до потенциальных точек доставки. Именно Матрицу надо заполнить ДО НАЧАЛА Рейса, чтобы построить маршрут рейса.
22. MissionOnly 27 26.06.26 12:47 Сейчас в теме
(17) Что, серьезно считаете перебор всех возможных вариантов, хорошим решением этой задачи?

Может симплекс метод предложили бы для решения этой задачи? Десять городов, это примерно 10!/2 вариантов перебора. Сколько будет считать обработка, если нужно проехать через все города без повторений?

Можно взять 12 и два зафиксировать, как начало и конец. Для городов, это не реалистичная задача. А вот объезд точек поставки товаров уже реальная.
23. RustIG 1979 26.06.26 15:44 Сейчас в теме
(22) от точки А до точки В никогда не будет перебора 10!/2.
24. MissionOnly 27 26.06.26 15:55 Сейчас в теме
(23) Причина? Это типичная задача на графах с ребрами имеющими вес. Если из каждой вершины есть ребро в другую вершину, то вариантов пройти последовательно (без повторений) по всем - n!.

Даже в симплекс методе полный перебор не исключается, но он мало вероятен.
orakool2; +1 Ответить
26. RustIG 1979 26.06.26 16:15 Сейчас в теме
(24) ответил тут в (25)
25. RustIG 1979 26.06.26 16:15 Сейчас в теме
Посмотрите задачи в Огэ. Там 5 городов, там нет времени разбирать 5!/2 вариантов. Вы смешали теорию с практикой.
И в жизни также, для 10 точек доставок , расположите их по городу, половина путей отпадет сама собой...
Зачем вы усложняете на пустом месте?
27. MissionOnly 27 26.06.26 16:27 Сейчас в теме
(25) "Сам алгоритм легко масштабировать до любых размеров 8х8, 14х14, 20х20 и т.д. - см. Листинг." - цитата. А то, что водителям приходится обслуживать более 10 точек (за день), можете поверить на слово. Реальная задача заключается - определить оптимальный путь следования.
orakool2; +1 Ответить
28. RustIG 1979 26.06.26 16:30 Сейчас в теме
(27) масштабируйте хоть до 20 точек, с ограничениями. Вам водители сами скажут, что из точки Х никто не поедет в У, покажут варианты, этих вариантов будет ограниченное кол-во , исходя из их опыта, а не вашей теории
29. RustIG 1979 26.06.26 16:42 Сейчас в теме
(27) я бы спросил водителя, как он сегодня ездил, ввел данные в программу, и показал ему, что программа рассчитала более выгодный вариант - надо учесть, что экономический эффект должен быть ощутимым - не на 5 минут быстрее, или на 3 км короче, а более ощутимы эффект - на полчаса-40 минут быстрее, на 10 км короче...
Предложил бы в след. раз попробовать перед выездом просчитать маршрут на программе. И вечером уточнить как все прошло.... В жизни и ремонт дорог, и ДТП на участках, и частые светофоры, и ограниченный скоростной режим на одних участках, и дорога не по пути к своему дома - чтобы заскочить на обед - все будет иметь значение...
Вам об этом водители расскажут...

так-то я написал программу - для 1с - что-то я не видел на 1с подобных алгоритмов.... сразу начали хаять....поддержали бы...
30. MissionOnly 27 26.06.26 16:57 Сейчас в теме
(29) Эти задачи давно уже решаются с более сложными функциями оптимизации (по тоннажу, по времени доставки, по расходу топлива). Но не такими методами. И n = 10 там далеко не предел.

Спасибо, за интересную беседу!
31. RustIG 1979 26.06.26 17:08 Сейчас в теме
(30) так я не сомнеааюсь, коллега, что кто -то решает ... мне от этого ни тепло , ни холодно.... и другим тоже ни тепло, ни холодно... киньте ссылку, где описано решение.... тогда и поговорим... а так да , вам только дивана не хватает, а критика у вас "что надо"
33. RustIG 1979 26.06.26 21:38 Сейчас в теме
34. RustIG 1979 28.06.26 01:00 Сейчас в теме
В поисках смысла, нашел статью "Решаем задачу коммивояжера простым полным перебором" https://thecode.media/path-js
36. RustIG 1979 04.07.26 13:37 Сейчас в теме
Для пытливых умов...Для интересующихся...Для новичков в теме оптимизации алгоритмов....

Почему полный перебор с учетом ограничений по условиям задачи не равен полному перебору всех перестановок n! -
Почему важно понимать локальные нюансы задачи: ограничения, допущения, приоритеты -

рассказано вот в этой статье - как задача с полным перебором вариантов сначала решалась за 4 часа (24 млрд. вариантов) - затем код полного перебора переписали с учетом ограничений и довели сначала до решения за 8,5 минут, а затем и вовсе за 0,5 сек. : https://thecode.media/einstein-3/

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

Конкретно, в задаче обхода городов - есть города - "тупики", из которых нет дорог в другие города - а потому алгоритм перебора не будет учитывать дальнейшие варианты с этими тупиковыми городами.

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

ПС. Так уж повелось, что в жизни, как внедренец и программист 1с, я предлагал заказчикам разные способы решений - для меня все аспекты задачи были равнозначными: учесть и это, и то... Но в заключительный момент ЛПР (директор, бухгалтер, руководитель) говорил, что "вот это нам в принципе не важно, давайте упростим задачу"... В итоге решение получалось выигрышным. Не универсальным - тут это не главное - а выигрышным.
Позже я выработал такой принцип решения задач клиентов: "сначала решаем задачу-минимум, затем решаем задачу-максимум". В большинстве случаев, достаточно было решить задачу-минимум.
Сказать точно не могу, но как будто задача -минимум давала 80%, а задача -максимум остальные 20% выигрыша...

Любой мой ответ- комментарий будет не полным. Я не стараюсь убедить вас в том, что полный перебор это крутое решение., но это решение , которое лежит на поверхности, и додуматься до него проще простого. Я не призываю не исследовать другие решения - алгоритм Дейкстры и другие. Наоборот, разберитесь сначала с решением полного перебора - для полной картины.
Человек с опытом может использовать разные инструменты. Человек без опыта всегда будет находить недочеты в любом решении, даже в самом очевидном.
Напоминает спор об использовании запроса в цикле, о котором я также много спорил и написал на ИС...
37. RustIG 1979 04.07.26 19:36 Сейчас в теме
Оказывается, у решения, представленного в данной статье - есть свое название. Подобное использование рекурсии относится к алгоритмам "поиска с возвратом" :
Алгоритм поиска с возвратом тоже относится к полным переборам, но у него есть особенность, которая делает этот перебор проще:
если алгоритм понимает, что идёт по неверному пути, то все остальные варианты в этом пути тоже помечаются как неправильные и алгоритм их не рассматривает.

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

1. для синтаксического анализа естественной речи, когда компьютеру нужно разложить текст на лексические составляющие, подобрать ответ, а потом поставить слова в ответе в правильном и естественном порядке;
2. для поиска решений в задачах «про наполнение рюкзака», когда нужно найти, например, оптимальное соотношение веса, объёма и цены;
3. в языках логического программирования — Prolog или Planner, которые используют этот алгоритм для создания ответов на запросы пользователя;
4. для решения логических задач и пазлов, например судоку:


ссылка на проф.статью https://thecode.media/backtracking/
Для отправки сообщения требуется регистрация/авторизация