当前位置: 首页 > 知识库问答 >
问题:

根据路径长度增加额外成本

冯卜鹰
2023-03-14

我有一个图/网络,它显然由一些节点和一些边组成。每条边都有一个权重,或者在本例中是一个成本。每条边也有一个附加到它的距离和一个类型。因此,基本上,重量/成本是根据边缘的距离以及两种类型边缘的一些其他度量预先计算的。

然而,在我的情况下,我希望增加一些额外的成本,比如说每100米左右,但只适用于一种边缘。但是我甚至不确定是否有可能根据Dijkstra等算法中路径中先前步骤的总和添加额外的成本/距离?

我知道我可以把成本分成每一个distance unit,从而得到一个大致的估计。存在的问题是边缘情况,在距离199处的成本几乎是在每100个距离处增加成本的两倍,即在100和200处增加成本。

但是也许有其他方法可以解决这个问题?

共有1个答案

洪照
2023-03-14

我认为您不能使用Dijkstra实现这一点,因为您需要验证不变量,这是正确性所必需的(参见例如wikipedia)。在每一步中,Dijkstra都建立在这个不变量的基础上,这个不变量或多或少地表示,所有“已经找到的路径”都是最优的,即最短的。但是,为了证明它在“按边缘类型和覆盖距离计算的额外成本”的情况下不成立,让我们看一个反例:

假设我们有两种边,第一种(-

start -1-> u_1 
start -1-> u_2 
start -1-> u_3 
... 
start -1-> u_7 
u_7 -1-> v 
start =7=> v 
v =4=> end

当我们使用Dijkstra(我跳过所有中间步骤)将start作为开始节点,将end作为目标,我们将首先检索路径start=7=

简言之,Dijkstra是不适用的——即使您修改了算法,将“已找到的路径”考虑在内,以便检索下一条边的成本。

也许您可以围绕Dijkstra的一个变体构建您的算法,它通常检索多个(次优)解决方案。首先,您需要扩展Dijkstra,以便它考虑已经找到的路径。(在此函数中,将cost=weight(v,u,e)替换为cost=weight(v,u,e,paths[v]),并编写一个合适的函数,根据前面的路径和考虑的边计算惩罚)。然后,从原始最优解中删除边,并迭代该过程以找到新的备选最短路径。但是,除了惩罚类型中的边之外,我看不到从图中选择要删除的边的简单方法,而且运行时的复杂性可能非常糟糕。

 类似资料:
  • 下面的while循环会额外运行一段时间。我试图执行一个用户输入,从用户那里接受10个有效数字并打印它们的总和。然而,while循环执行额外的时间并请求第11个输入。 }

  • 26.8. 增加对额外元数据API的支持 如果你希望提供对其它元数据API的支持,这很容易实现。 简单实现org.springframework.metadata.Attributes接口,并把它作为你的元数据API的门面。你就可以像前文所示那样在你的bean定义中包含这个对象。 所有象AOP元数据驱动自动代理这样的使用元数据的框架服务,都自动能使用你新建的元数据提供者。

  • 我尝试过创建循环,比如减去用户想要购买的物品的数量,同时计算取值时的模数为0,减去用户购买的数量,但我离它还很远。 数组来自其他方法: 是商品的价格是用户购买的商品数量是用户对折扣的选择,例如,用户可以将折扣设置为2包、3包甚至无。

  • 给定一个无权无向图的邻接矩阵,是否有一种有效的方法(多项式算法)来扩展或增加任意给定的两个结点s和T之间的最短路径长度? 示例: 在下面的例子中,从顶点S=1到顶点T=5有5条不同的“最短路径”,每个路径的长度为3。我想去除最少的边数,这样最短的路径长度被迫变成4或更多。(断开图形连接是可以的。) 表示此图形: 强制最短路径长度从3增加到4的最小代价是去除两条边(1,2)和(5,9) 目标:

  • 问题内容: 我有一个快速的问题。我在java中有一个整数数组,需要它的长度在整个类中变化。具体来说,在某些情况下,我需要将其增加一。我这样尝试过。 我会在需要时增加整数变量numberOfSBG,但我认为这不起作用。还有其他办法吗? 问题答案: 我建议您使用ArrayList,因为您不必担心长度。创建后,您将无法修改数组大小: 数组是一个包含固定数量的单一类型值的容器对象。创建数组时将确定数组的长

  • 笔:https://codepen.io/anon/pen/zezppk(在Chrome中可视化) 想法:动画一个SVG笔画,使它以长度0(一个等于路径总长度的dashOffset)开头,所以没有呈现任何内容。然后,逐步减小Dashoff集,直到显示出整个SVG笔画。到目前为止,没有问题,这是一个相当普遍的效果,事实上。但我想额外加点:笔画的“起点”也必须逐渐抵消,才能达到笔下的效果。 具体要求是