- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我被这个问题困住了(我的解决方案太慢了)。我将先描述问题,然后再描述我的解决方案。
问题:给定 N
个站,每个站都位于数轴上的 x_i
位置,我们想从第一个站移动一个机器人以最低的货币成本到最后一个站点(站点按非递减 x_i
顺序排序)。我们有一个机器人,它从充满电的电池开始,电池具有 K
(不一定是整数)个单位的功率,并且可以移动 E
(不一定是整数)个长度单位消耗的功率单位。在第一站和最后一站之间的任何一站,我们都可以充电。每个站收取相同的统一费率 F
美元开始充电,加上 c_i
美元的每单位电力补充。如果机器人当时的电量等于或低于K/2
,只有可以充电或者如果不充电就无法到达下一站;每次机器人充电时,它都必须充电到 100%(即 K
)。
我的解决方案:我很确定这是最短路径问题的变体,除了我们针对货币成本进行优化。我正在运行 Dijkstra SSSP。然而,对于每个州,我们都需要跟踪货币成本和剩余能源,因为通过在便宜的充电站充电来提前支付更高的成本可能比把钱存到最后要好。因此,我不再维护cost[i]=cheapest known way to station i
,而是维护cost[i][energy]=cheapest known way to station i能量
。在优先级队列中,我仅按成本对状态进行排序,因为我不确定是否有办法为成本和剩余能量创建试探法。这个算法在某些测试用例上真的很慢,因为如果 E
和 K
很大,那么每个站都可能会到达它前面的每个站,从而创建一个巨大的图。我想我必须修剪搜索边界,但我不确定该怎么做。有什么想法吗?
最佳答案
与 Dijkstra 相比,这听起来更像是动态规划的工作。从一个站的最优成本i
与您在到达那里之前所做的选择无关。
向后移动通过车站。求站i
,考虑所有站j > i
你可以从那里到达(你已经计算了他们的最优成本)。从中选择最佳的。
在伪代码中:
opt[N-1] = 0 // cost of the last station is 0
for i = N-2 down to 0 // loop backwards over the stations
opt[i] = infinity
for j = i+1 to N-1 where (x_j - x_i) * E <= K // loop over all next stations that can be reached without a flat battery
energyToJ = (x_j - x_i) * E
if (energyToJ >= K/2 // we are allowed to recharge
or j == N-1 // or we cannot reach the next station because there is none
or x_{j+1} - x_i) * E > K) // or because it is too far
costJ = F + energyToJ * c_j + opt[j] // total cost via j is cost to j + cost from j
if (costJ < opt[i]) // keep track of the optimal cost
opt[i] = costJ
return opt[0]
编辑
由于动态规划不是您的选择,这就是我使用 Dijkstra 的方法:
来自某站i
可以直接移动到各个站j
以下其中一项成立:
K/2 <= x_j - x_i <= K
0 <= x_j - x_i < K/2
并且没有 j' > j
为此 x_j' - x_i <= K
用 N
创建一个图表顶点,每个站一个。有一条有向边e_ij
从车站i
到站j
,当且仅当上述两个条件之一成立。 e_ij
的重量只是在那里充电的成本,即F + (x_j - x_i) * c_j
.
您现在只需在此图上运行 Dijkstra 即可找到到达终点站的最经济方式。我们不需要同时跟踪距离和金钱的原因是距离已经编码在图的结构中:图的边缘恰好是从一个站到另一个。
关于algorithm - Dijkstra 最短路径算法的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27032614/
谁能告诉我这个 Dijkstra 算法中优先级队列的空间复杂度。请注意,这里可以将一个顶点添加到队列中不止一次。但是,由于访问集,它不会被处理超过一次。这就是为什么我想知道队列的最大大小可以达到的原因
为什么我们不能将 Dijkstra 算法应用于具有负权重的图? 最佳答案 如果每次从 C 到 D 旅行都得到报酬,那么找到从 A 到 B 的最便宜的路径意味着什么? 如果两个节点之间存在负权重,则“最
我正在阅读 工作中的程序员 . 我在 Donald Knuth 的采访中看到了这一段。 Seibel: It seems a lot of the people I’ve talked to had
我一整天都在努力理解 Dijkstra 算法并实现,但没有取得任何重大成果。我有一个城市及其距离的矩阵。我想做的是给定一个起点和一个终点,找到城市之间的最短路径。 示例: __0__ __1
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
一 问题描述 小明为位置1,求他到其他各顶点的距离。 二 实现 package graph.dijkstra; import java.util.Scanner; import java.util.
一 问题背景 在现实生活中,很多问题都可以转化为图来解决问题。例如,计算地图中两点之间的最短距离、网络最小成本布线,以及工程进度控制,等等。这些问题都涉及最小路径的求解。 二 Dijkstra 算法
谁能告诉我这个程序的错误在哪里,这真的很有帮助,我尽力解决了这个问题,这段代码只通过了两个测试用例给定一个无向图和一个起始节点,确定从起始节点到图中所有其他节点的最短路径的长度。如果一个节点不可到达,
除了 Dijkstra 之外,还有其他方法可以计算接近完整图的最短路径吗?我有大约 8,000 个节点和大约 1800 万条边。我已经完成了线程 "a to b on map"并决定使用 Dijkst
我知道 Dijkstra 的算法、Floyd-Warshall 算法和 Bellman-Ford 算法,用于查找图中 2 个顶点之间的最便宜路径。 但是当所有边的成本都相同时,最便宜的路径是边数最少的
我的问题如下:根据不同的消息来源,Dijkstra 算法只不过是 Uniform Cost Search 的一种变体。我们知道 Dijkstra 的算法会找到源和所有目的地(单源)之间的最短路径。但是
所以我的问题是我有一个带有 的有向图 G非负 边长度,我希望找到两个节点 u 和 v 之间的最短路径,以便它们只通过图中的一个标记节点。 如果我们没有涉及标记节点的条件,这个问题可以使用 Dijkst
对于使用最小堆优先级队列的 Dijkstra 实现,我将其设置为查找网络上不存在的站,以便它必须检查所有内容。我的问题是由于整体时间复杂度 O(V + E log V) ,为什么网络查找到一个站点的最
我试图找出是否可以使用 Dijkstra 算法来找到有向无环路径中的最长路径。我知道由于负成本循环,不可能在一般图中找到 Dijkstra 的最长路径。但我认为它应该在 DAG 中工作。通过谷歌我发现
我正在研究 Dijkstra 算法,我真的需要找到所有可能的最短路径,而不仅仅是一条。我正在使用邻接矩阵并应用 Dijkstra 算法,我可以找到最短路径。但是我需要以最低成本找到所有路径,我的意思是
我正在尝试创建 Dijkstra 寻路的实现,除了我要求它创建一条在同一位置开始和结束的路线之外,它似乎工作得很好。 JSFiddle:http://jsfiddle.net/Lt6b4ecr/ 我需
我们可以使用负权重的 Dijkstra 算法吗? 停止! 在您认为“大声笑,您可以在两点之间无休止地跳跃并获得无限便宜的路径”之前,我更多地考虑的是单向路径。 对此的应用程序将是一个带有点的山地地形。
我认为 Dijkstra 算法是确定的,因此,如果您选择相同的起始顶点,您将得到相同的结果(到每个其他顶点的距离相同)。但我不认为它是确定性的(它为每个操作定义了以下操作),因为这意味着它不必首先搜索
我找到了this code使用 Dijkstra 算法来查找加权图中两个节点之间的最短路径。我看到的是代码没有跟踪访问过的节点。但是它对于我尝试过的所有输入都适用。我添加了一行代码来跟踪访问过的节点。
我将 Dijkstra 算法 的 C++ 实现转换为 Java。当我运行 Java 代码时,我没有得到预期的输出 我的 C++ 代码的预期: Minimum distance for source v
我是一名优秀的程序员,十分优秀!