Я застрял в этой проблеме (мое решение слишком медленное). Я опишу проблему, а затем свое решение.
Проблема: учитывая N
станцию, каждая из которых находится в позиции x_i
в числовой строке, мы хотим переместить робота с первой станции на последнюю (станции сортируются в неубывающем x_i
порядке) в самая низкая денежная стоимость. У нас есть робот, который начинает работу с максимально заряженной батареей с K
(не обязательно целыми) единицами мощности и может перемещать E
(не обязательно целых) единиц длины на единицу затраченной энергии. На любой станции между первой и последней станциями мы можем подзарядить. Каждая станция взимает одинаковую фиксированную ставку F
долларов за начало зарядки плюс c_i
долларов за единицу восполненной мощности. Робот ТОЛЬКО может заряжаться, если его мощность в данный момент равна или ниже K/2
ИЛИ, он не может добраться до следующей станции без зарядки; каждый раз, когда робот заряжается, он должен заряжаться до 100% (т.е. K
).
Мое решение: я почти уверен, что это вариант задачи кратчайшего пути, за исключением того, что мы оптимизируем денежные затраты. Я использую Dijkstra SSSP. Однако для каждого штата нам необходимо отслеживать как денежные затраты, так и оставшуюся энергию, потому что повышение затрат на более раннем этапе с помощью зарядки на дешевой станции может быть лучше, чем экономия ваших денег до конца. Поэтому вместо того, чтобы поддерживать cost[i]=cheapest known way to get to station i
, я поддерживаю cost[i][energy]=cheapest known way to get to station i with a certain energy
. В очереди приоритетов я упорядочиваю состояния по стоимости только потому, что не уверен, что есть способ создать эвристику как для стоимости, так и для оставшейся энергии. Этот алгоритм очень медленный в некоторых тестовых примерах, потому что если E
и K
были большими, то каждая станция потенциально могла бы перемещаться к каждой станции перед ней, создавая массивный график. Я думаю, что мне нужно сократить границы поиска, но я не знаю, как это сделать. Любые идеи?