我希望用R来计算最佳旅行路线。假设我有一个像下面这样的旅行时间表。
通过igraph和distance_table,我和我的同事已经找到了如何计算旅行路线,使旅行时间之和最小化,或者使路线中的边数最小化(我通过将所有旅行时间设置为1来实现)。
我还没有弄清楚如何做,是计算最小旅行时间,但为每个停止点添加时间旅行惩罚。这样,我就可以避免获得中途停留过多的最佳路线。最好的方法是什么?我想用R来做,但我愿意使用igraph以外的库(我不太熟悉)。
| 起源|目的地|旅行时间|
| --|--|--|
| 一|B| 10 |
| 一|C| 20 |
| 一|D| 10 |
| 一|E| 30 |
| B|一| 10 |
| B| D| 5 |
| C|一| 20 |
| D|一| 10 |
| D| B| 5 |
| E|一| 30 |
2条答案
按热度按时间6l7fqoea1#
你当然可以在这里使用
igraph
来使你的工作更容易。首先,将数据框转换为图形对象,这很简单:
我们可以通过做一些
如果我们想要节点之间的最短距离,考虑旅行时间,我们可以简单地使用函数
distances
,使用旅行时间作为权重:如果我们想添加一个固定的停留时间,那么我们可以为每条边添加一个固定的权重。我们需要在距离矩阵中的所有非零项的末尾删除一个中途停留时间,因为如果遍历n条边,将有n-1个中途停留:
如果中途停留时间根据节点而变化,则可以根据输入 Dataframe 中的目的地节点来编码该信息。
创建于2023-10-03带有reprex v2.0.2
来自问题的 Dataframe ,格式可重现
qij5mzcb2#
这里有一个替代方法,它允许在不同的点有不同的停止时间。
其主要思想是将每个顶点分为两个,in 和 out。所有指向原点的边都将指向 in 顶点,所有离开它的边都将从 out 顶点开始。这两者将通过从 in 到 out 的单个边连接,其权重表示停止时间。
现在
df
看起来像这样:最短路径可以计算:
数据来自@Allan卡梅隆的回答: