时间表限制时间内的最低费用?

时间:2016-05-17 08:46:39

标签: algorithm graph

我有这样的时间表:

+-----------+-------------+------------+------------+------------+------------+-------+----+
| transport | trainnumber | departcity | arrivecity | departtime | arrivetime | price | id |
+-----------+-------------+------------+------------+------------+------------+-------+----+
| Q         | Q00         | BJ         | TJ         | 13:00:00   | 15:00:00   |    10 |  1 |
| Q         | Q01         | BJ         | TJ         | 18:00:00   | 20:00:00   |    10 |  2 |
| Q         | Q02         | TJ         | BJ         | 16:00:00   | 18:00:00   |    10 |  3 |
| Q         | Q03         | TJ         | BJ         | 21:00:00   | 23:00:00   |    10 |  4 |
| Q         | Q04         | HA         | DL         | 06:00:00   | 11:00:00   |    50 |  5 |
| Q         | Q05         | HA         | DL         | 14:00:00   | 19:00:00   |    50 |  6 |
| Q         | Q06         | HA         | DL         | 18:00:00   | 23:00:00   |    50 |  7 |
| Q         | Q07         | DL         | HA         | 07:00:00   | 12:00:00   |    50 |  8 |
| Q         | Q08         | DL         | HA         | 15:00:00   | 20:00:00   |    50 |  9 |    
| ...       | ...         | ...        | ...        | ...        | ...        |   ... | ...|
+-----------+-------------+------------+------------+------------+------------+-------+----+

在此表中,共有13个城市和116条路线,最小的时间单位为半小时。 有不同的运输,这无关紧要。正如您所看到的,可能有多个边缘具有相同的离开和到达城市但不同的时间和差价。时间每天都是不变的。

现在,这里出现了一个问题。

用户想知道他如何从A市到B市旅行( A和B可能是一个城市),通过零或一些城市C,D ...(是否应该是按顺序取决于用户是否希望它,即有两个问题),在X小时内,而且成本最低在上述条件下。

在此问题出现之前,我已经解决了另一个更简单的问题。

用户想知道他如何从A市到B市旅行( A和B可能是一个城市),通过零或一些城市C,D ...(是否应该是在上述条件下依次),成本最低

以下是我如何解决它的问题(以不按顺序为例):

  1. 对必须通行的城市进行排序:C1,C2,C3 ...... Cn。设C0 = A,C(n + 1)= B,minCost.cost = INFINITE;
  2. i = 0,j = 1,W = {};
  3. 使用Dijkstra算法找到从Ci到Cj的最低成本方式S,其中price是边的权重。 W =W∪S;
  4. i = i + 1,j = j + 1;
  5. 如果j <= n + 1,则转到3;
  6. 如果W.cost&lt; minCost.cost,minCost = W;
  7. 如果存在C1 ... Cn的下一个排列,则按C1 ... Cn和goto 2的下一个排列的顺序重新排列列表C1 ... Cn;
  8. 返回minCost;
  9. 但是,我无法想出第一个问题的有效解决方案,请帮助我,谢谢。

    如果有人能解决另一个问题,我将不胜感激:

    用户想知道他如何从A市到B市旅行( A和B可能是一个城市),通过零或一些城市C,D ...(是否应该是在上述条件下依次),在最短时间内

1 个答案:

答案 0 :(得分:0)

这是一个非常大的问题,所以我只想草拟一个解决方案。

首先,按如下方式重新构建图表。代替每个顶点代表一个城市,让顶点代表(city, time)的元组。这是可行的,因为只有13个城市,只有(time_limit - current_time) * 2个可能的时间段,因为最小的时间单位是半小时。现在根据给定的时间表连接顶点,并将价格作为之前的权重。不要忘记,用户可以在任何城市免费停留任何时间。城市A的所有节点都是起始节点,城市B的所有节点都是目标节点。获取所有(B, time)顶点的最小值,以获得最低成本的解决方案。如果有多个,请选择时间最短的那个。

现在迫使用户按顺序通过某些城市。如果有n个城市要通过(加上开始和目标城市),则需要n+2个相同图表的副本作为不同级别。该级别表示您已经通过的列表中有多少个城市。所以你从顶点A的0级开始。一旦你到达0级C1,你就会移动到图形1级的顶点C1(用0权重边连接顶点)。这意味着,当您处于等级k时,您已经将城市C1传递给Ck,并且您只能通过C(k+1)进入下一级别。最后一级城市B的顶点是您的目标节点。

注意:我说的是相同图表的副本,但这并不完全正确。您无法允许用户在级别C(k+2), ..., B中触及k,这会违反所需的订单。

要以任何顺序强制传递城市,需要一种连接级别(并在运行时修改它们)的不同方案。我会留给你的。