diff --git a/core/src/main/java/ru/trader/core/VendorsIterator.java b/core/src/main/java/ru/trader/core/VendorsIterator.java index ae44114..f191158 100644 --- a/core/src/main/java/ru/trader/core/VendorsIterator.java +++ b/core/src/main/java/ru/trader/core/VendorsIterator.java @@ -157,6 +157,11 @@ public class VendorsIterator implements Iterator { public int hashCode() { return place.hashCode(); } + + @Override + public String toString() { + return "Transit"; + } } } diff --git a/core/src/main/java/ru/trader/graph/Graph.java b/core/src/main/java/ru/trader/graph/Graph.java index b608c86..60786cb 100644 --- a/core/src/main/java/ru/trader/graph/Graph.java +++ b/core/src/main/java/ru/trader/graph/Graph.java @@ -96,6 +96,7 @@ public class Graph> { Vertex target = getVertex(entry); TopList> paths = newTopList(max); findPathsTo(target, paths, deep); + paths.finish(); return paths; } @@ -112,6 +113,7 @@ public class Graph> { paths.add(path); } } + paths.finish(); return paths; } diff --git a/core/src/main/java/ru/trader/graph/RouteSearcher.java b/core/src/main/java/ru/trader/graph/RouteSearcher.java index 232353e..fee6e15 100644 --- a/core/src/main/java/ru/trader/graph/RouteSearcher.java +++ b/core/src/main/java/ru/trader/graph/RouteSearcher.java @@ -3,12 +3,9 @@ package ru.trader.graph; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ru.trader.core.Place; import ru.trader.core.Vendor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; @@ -65,7 +62,7 @@ public class RouteSearcher { LOG.trace("Segment jumps {}", jumpsToAll); sGraph.setCargo(cargo); sGraph.setBalance(balance); - List res = new ArrayList<>(limit); + TopList res = new TopList<>(limit, RouteGraph.byProfitComparator); if (jumps <= jumpsToAll){ LOG.trace("Is last segment"); List> paths; @@ -83,6 +80,13 @@ public class RouteSearcher { int i = 0; ArrayList subTasks = new ArrayList<>(THRESHOLD); while (i < paths.size()) { + if (target != null){ + PathRoute path = (PathRoute) paths.get(i); + if (path.getTarget().isEntry(target)){ + LOG.trace("Is path to target, add to res"); + res.add(path); + } + } subTasks.clear(); for (int taskIndex = 0; taskIndex < THRESHOLD && i+taskIndex < paths.size(); taskIndex++) { PathRoute path = (PathRoute) paths.get(i+taskIndex); @@ -98,8 +102,8 @@ public class RouteSearcher { i+=subTasks.size(); } } - finish(res); - return res; + res.finish(); + return res.getList(); } private int getPathsOnSegmentCount(RouteGraph graph){ @@ -111,21 +115,18 @@ public class RouteSearcher { } - private void add(SegmentSearcher task, PathRoute path, List res){ + private void add(SegmentSearcher task, PathRoute path, TopList res){ List tail = task.join(); if (tail.isEmpty()){ LOG.trace("Not found route from {} to {}, jumps {}", task.source, task.target, task.jumps); } else { path.add(tail.get(0), false); path.sort(balance, cargo); - TopList.addToTop(res, path.getEnd(), limit, RouteGraph.byProfitComparator); + res.add(path.getEnd()); } } - private void finish(List res){ - if (res.size() < limit) - res.sort(RouteGraph.byProfitComparator); - } + } diff --git a/core/src/main/java/ru/trader/graph/TopList.java b/core/src/main/java/ru/trader/graph/TopList.java index 1a0759f..97fcd77 100644 --- a/core/src/main/java/ru/trader/graph/TopList.java +++ b/core/src/main/java/ru/trader/graph/TopList.java @@ -31,6 +31,11 @@ public class TopList { return true; } + public void finish(){ + if (comparator != null && list.size() < limit) + list.sort(comparator); + } + public List getList() { return list; } @@ -55,7 +60,7 @@ public class TopList { if (list.size() == limit) { int index = Collections.binarySearch(list, entry, comparator); if (index < 0) index = -1 - index; - if (index == limit) return null; + if (index == limit || list.get(index).equals(entry)) return null; list.add(index, entry); return list.remove(limit); @@ -75,7 +80,7 @@ public class TopList { if (list.size() == limit) { int index = Collections.binarySearch(list, entry, comparator); if (index < 0) index = -1 - index; - if (index == limit) return; + if (index == limit || list.get(index).equals(entry)) return; list.add(index, entry); list.remove(limit); } else { diff --git a/core/src/main/java/ru/trader/graph/Vertex.java b/core/src/main/java/ru/trader/graph/Vertex.java index 374b52b..3e2eede 100644 --- a/core/src/main/java/ru/trader/graph/Vertex.java +++ b/core/src/main/java/ru/trader/graph/Vertex.java @@ -17,6 +17,10 @@ public class Vertex> { return entry; } + public boolean isEntry(T entry){ + return this.entry.equals(entry); + } + public boolean isConnected(Vertex other){ return isConnected(other.entry); }