public IEnumerable <DirectedEdge> findNegativeCycle() { int V = m_edgeTo.Length; EdgeWeightedDigraph spt = new EdgeWeightedDigraph(V); for (int v = 0; v < V; v++) { if (m_edgeTo[v].IsSet) { spt.addEdge(m_edgeTo[v]); } } EdgeWeightedDirectedCycle finder = new EdgeWeightedDirectedCycle(spt); return(m_cycle = finder.cycle); }
private void CalculateShortestPath() { EdgeWeightedDigraph G = new EdgeWeightedDigraph(m_a.Rows); for (int v = 0; v < m_a.Rows; v++) { for (int w = 0; w < m_a.Cols; w++) { DirectedEdge e = new DirectedEdge(v, w, -Math.Log(m_a[v, w])); G.addEdge(e); } } BellmanFordSP spt = new BellmanFordSP(G, 0); if (spt.negativeCycleCount > 2) { double stake = 25000; double arbitrage = 1; ArbitrageCycle cycle = new ArbitrageCycle(m_currentTime); foreach (DirectedEdge e in spt.negativeCycle) { double weight = Math.Exp(-e.Weight); arbitrage *= weight; cycle.Edges.Add(new DirectedEdge(e.From, e.To, weight)); } if (!m_activeArbitrage.Contains(cycle, ARBITRAGE_CYCLE_COMPARER)) { m_activeArbitrage.Add(cycle); Status(cycle.Summary); Status("arbitrage(" + arbitrage + ") stake(" + stake + ") balance(" + (arbitrage * stake) + ") profit(" + Math.Round(((arbitrage * stake) / stake) - 1, 5) + "%)"); } } }
public IEnumerable<DirectedEdge> findNegativeCycle() { int V = m_edgeTo.Length; EdgeWeightedDigraph spt = new EdgeWeightedDigraph(V); for (int v = 0; v < V; v++) { if (m_edgeTo[v].IsSet) spt.addEdge(m_edgeTo[v]); } EdgeWeightedDirectedCycle finder = new EdgeWeightedDirectedCycle(spt); return m_cycle = finder.cycle; }