private bool check(EdgeWeightedDigraph G) { if (hasCycle) { DirectedEdge first = new DirectedEdge(0, 0, 0); DirectedEdge last = new DirectedEdge(0, 0, 0); foreach (DirectedEdge e in cycle) { if (!first.IsSet) first = e; if (last.IsSet) { if (last.To != e.From) { Log.Info("cycle edges " + last + " and " + e + " not incident"); return false; } } last = e; } if (last.To != first.From) { Log.Info("cycle edges " + last + " and " + first + " not incident"); return false; } } return true; }
public void addEdge(DirectedEdge e) { int v = e.From; if (m_adj[v].Add(e)) { m_e++; } /*if (!m_adj[v].Contains(e)) { } else { }*/ }
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) + "%)"); } } }