将一个资产转换为另一个资产的最佳算法

时间:2014-06-16 17:05:10

标签: algorithm graph-algorithm shortest-path

我的Java程序中有不同的金融资产对,例如EURUSDEURGBPEURCHF等......

更具体地说,这些是我拥有的对:

EURUSD, EURGBP, EURCHF, XAUUSD, XAUXAG, XAGUSD 
XAGNZD, AUDCHF, AUDHKD, CADHKD, CADSGD, NZDCAD 
SGDHKD 

我需要为列表中没有的对找到最短的转换链。

例如,如果我需要将EUR转换为NZD(因此我需要EURNZD对),因为您可以看到我的列表中没有{。} / p>

要进行此转换,我可以使用以下两个转换链(甚至不仅仅是这两个转换链):

chain1: EURUSD->USDXAU->XAUXAG->XAGNZD
chain2: EURUSD->USDCHF->CHFAUD->AUDHKD->HKDCAD->CADNZD

所以,在这两个转换链中,我会选择数字1,它是可用的最短的。

我的问题是,你能建议找到最短路径的最佳算法吗?你能否建议一个假代码呢?

感谢

1 个答案:

答案 0 :(得分:1)

图表上的标准Breadth First Search可以执行此操作,使用货币作为节点并在您可以在它们之间执行转换时连接两个节点(当然它将是无向图)。

上面我喜欢的维基百科页面中的伪代码是

1  procedure BFS(G,v) is
2      create a queue Q
3      create a vector set V
4      enqueue v onto Q
5      add v to V
6      while Q is not empty loop
7         t ← Q.dequeue()
8         if t is what we are looking for then
9            return t
10        end if
11        for all edges e in G.adjacentEdges(t) loop
12           u ← G.adjacentVertex(t,e)
13           if u is not in V then
14               add u to V
15               enqueue u onto Q
16           end if
17        end loop
18     end loop
19     return none
20 end BFS

其中G是图表,v是您开始的节点(在您的示例中为EUR)。在将其添加到Q(第15行)时,您应该稍微修改它以跟踪先前访问过的节点,以便在找到目标节点时可以重建路径(第9行)。