Предложите алгоритм (график - возможно, NP-Complete)

Это сеть городов, соединенных дорогами разной протяженности.

Путешественник хочет путешествовать на своей машине из одного города в другой. Однако он не хочет минимизировать пройденное расстояние; вместо этого он хочет минимизировать расходы на бензин в пути. Бензин можно купить в любом городе, однако каждый город поставляет бензин по разным (целым) ценам (поэтому самый короткий маршрут не обязательно самый дешевый). 1 единица бензина позволяет ему проехать 1 единицу расстояния. Его машина может вместить только определенное количество бензина в баке, и он может выбрать, сколько единиц бензина покупать в каждом городе, по которому он путешествует. Найдите минимальную стоимость бензина.

Кто-нибудь знает эффективный алгоритм, который можно было бы использовать для решения этой проблемы? Было бы полезно даже название такого типа проблемы, чтобы я мог исследовать ее сам! Очевидно, это не совсем то же самое, что и задача о кратчайшем пути. Любые другие советы приветствуются!

РЕДАКТИРОВАТЬ - актуальная проблема у меня гласит, что будет ‹1000 городов; ‹10000 дорог; а емкость бензобака будет где-то от 1 до 100.


person Andrew Wills    schedule 17.08.2012    source источник
comment
Мне кажется, это немного напоминает задачу о рюкзаке. Посмотрим, что говорят другие.   -  person Mihai Todor    schedule 17.08.2012
comment
Могу я предложить вам изменить титул на «Вариант коммивояжера» или что-то в этом роде. Текущее название несколько невзрачно.   -  person Nicolas78    schedule 17.08.2012
comment
Это не проблема рюкзака и не проблема коммивояжера: он хочет идти из пункта А в пункт Б, а не везде. Это конкретная проблема с графом, у которой нет названия afaik.   -  person Pieter Bos    schedule 17.08.2012
comment
Я думаю, что на самом деле это комбинация вариации обеих задач. Каждая проблема так или иначе влияет на другую.   -  person Chris Dargis    schedule 17.08.2012
comment
согласен с niomaster и тестом, тем не менее, это название менее конкретное, чем могло бы быть   -  person Nicolas78    schedule 17.08.2012
comment
проблема с источником @ s3-eu-west-1.amazonaws.com / marathon24-public /   -  person evandrix    schedule 18.10.2013


Ответы (6)


Вы можете решить эту проблему напрямую, используя алгоритм Джикстры, если хотите увеличить размер графика. .

Предположим, ваш бензобак вмещает от 0 до 9 единиц бензина.

Идея состоит в том, чтобы разделить каждый город на 10 узлов, причем узел x для города t представляет собой город t с x единицами бензина в баке.

Затем вы можете построить рёбра с нулевой стоимостью на этом расширенном графике, чтобы представить путешествие между разными городами (используя в процессе бензин, так что вы перейдете от узла уровня 8 к узлу уровня 5, если расстояние было 3), и больше ребер к представляют собой заправку бака в каждом городе одной единицей бензина (стоимость зависит от города).

Тогда применение джикстры должно дать самый дешевый путь от начала до конца.

person Peter de Rivaz    schedule 17.08.2012
comment
умница - мне это нравится! Хотя это делает график намного больше, если у вас большой резервуар! - person Andrew Wills; 18.08.2012

Я думаю, что вопрос заключается в следующем: есть ли шанс, что бензин сделает основную задачу коммивояжера более выполнимой в вычислительном отношении? В противном случае не существует эффективного алгоритма без аппроксимации.

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

person Nicolas78    schedule 17.08.2012
comment
на самом деле согласен с @niomaster, дальше от проблемы коммивояжера, чем я думал - person Nicolas78; 17.08.2012
comment
Но в целом проблема коммивояжера тривиально сводится к этой, устанавливая для всех цен на бензин одно и то же значение и делая бензобак автомобиля достаточно большим, чтобы пройти всю поездку без дополнительной заправки, поэтому проблема NP-трудная в Общее. - person Qnan; 17.08.2012
comment
+1 за использование размера резервуара для уменьшения вычислительной сложности :) однако дополнительная разница в том, что он не хочет посещать все города - person Nicolas78; 20.08.2012
comment
Приношу свои извинения, похоже, я неправильно прочитал постановку проблемы. - person Qnan; 20.08.2012

Я думаю, вы можете решить эту проблему с помощью динамического программирования. Для каждого узла вы сохраняете массив кортежей стоимости бензина и длину пути, по которому вы используете этот бензин, содержащий оптимальное решение. На каждом шаге вы проходите через все узлы, и если есть узел, к которому вы можете перейти, у которого уже есть решение, вы проходите через все узлы, к которым вы можете перейти с решением. Вы выбираете минимальную стоимость, но обратите внимание: вы должны учитывать стоимость бензина в текущем узле. Все затраты в массиве, которые выше, чем стоимость в текущем узле, вместо этого могут быть куплены в текущем узле. Обратите внимание, что узлы, для которых уже есть решение, следует пересчитать, поскольку узлы, к которым вы можете перейти оттуда, могут измениться. Вы начинаете с конечного узла, устанавливая в качестве решения пустой массив (или одну запись со стоимостью и длиной 0). Окончательное решение - взять решение в начале и просуммировать каждую стоимость * длину.

person Community    schedule 17.08.2012
comment
Я не совсем понимаю, как это работает, но завтра я еще раз посмотрю, когда буду меньше уставать! - person Andrew Wills; 18.08.2012

Я бы попробовал это:

  1. Найдите кратчайший маршрут от начала до пункта назначения. Для этого подходит алгоритм Дейкстры.
  2. Найдите минимальную стоимость бензина для проезда по этому маршруту. Я не знаю ни одного стандартного алгоритма для этого, но если на маршруте нет большого количества городов, даже исчерпывающий поиск не должен быть невозможным с вычислительной точки зрения.
  3. Найдите следующий кратчайший маршрут ...

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

Итак, используйте 2 алгоритма, по одному для каждой части задачи.

person High Performance Mark    schedule 17.08.2012
comment
Это тоже верное решение, но, к сожалению, очень медленное. - person Pieter Bos; 17.08.2012
comment
Я не думаю, что вы сможете остановиться, как только минимальная стоимость снова начнет расти, возможно, что самый дешевый маршрут будет самым длинным, а второй дешевый - самым коротким, например ... для того, чтобы быть уверенным, что у вас будет самый дешевый пришлось бы изучить каждый маршрут: / - person Andrew Wills; 18.08.2012

Это можно оптимизировать подходящим образом с помощью генетического алгоритма. Генетические алгоритмы побеждают людей в решении некоторых сложных задач: http://en.wikipedia.org/wiki/Genetic_algorithm

Суть генетического алгоритма:

  1. Придумайте функцию ранжирования для возможных решений
  2. Придумайте набор уникальных возможных решений. Инициализируйте его с помощью некоторых случайно сгенерированных возможностей. Может, 10, 100 или 1000 ...
  3. Скопируйте возможное решение из пула и измените его каким-либо образом - добавьте город, удалите город, добавьте два города и т. Д. Это может улучшить или ухудшить ситуацию - ваша функция ранжирования поможет вам в этом. Какой ты выберешь? Обычно вы выбираете лучшее, но время от времени вы намеренно выбираете тот, который не позволяет избежать застревания на локальном оптимуме.
  4. Has the new solution already been ranked? If yes, junk it and go to
    1. If no, continue...
  5. Добавить возмущенного кандидата обратно в пул под его вновь рассчитанным рангом.
  6. Продолжайте так (повторите с пункта 3), пока не почувствуете, что делаете это достаточно долго.
  7. Наконец, выберите ответ с лучшим рейтингом. Возможно, это не оптимально, но должно быть неплохо.
person user1277476    schedule 17.08.2012

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

Переменными в этой конкретной задаче будут количество бензина, купленного в каком-либо одном городе, количество бензина в баке в любом городе по пути и фактически пройденные дороги. Ограничения должны гарантировать, что автомобиль расходует необходимое топливо на каждой дороге и не имеет менее 0 или более MAX единиц топлива в любом городе, и что дороги составляют путь от A до B. общая стоимость закупленного топлива.

Все это может выглядеть чудовищно (как часто бывает в формулировках ПДОДИ), но это не значит, что эту проблему нельзя решить в разумные сроки.

person Qnan    schedule 20.08.2012