Archived
0

implement loop route specification

This commit is contained in:
iMoHax
2015-07-30 12:00:06 +03:00
parent d1ac962d3d
commit 40b0f66d8d
5 changed files with 244 additions and 5 deletions

View File

@@ -0,0 +1,62 @@
package ru.trader.analysis;
import ru.trader.analysis.graph.Edge;
import ru.trader.analysis.graph.Traversal;
import java.util.Optional;
public class LoopRouteSpecification<T> implements RouteSpecification<T> {
private final boolean unique;
public LoopRouteSpecification(boolean unique) {
this.unique = unique;
}
private Traversal<T> getStart(Traversal<T> entry){
Traversal<T> res = null;
Traversal<T> last = entry;
Optional<Traversal<T>> head = entry.getHead();
while (head.isPresent()) {
Traversal<T> e = head.get();
res = last;
last = e;
head = e.getHead();
}
return res;
}
@Override
public boolean specified(Edge<T> edge, Traversal<T> entry) {
return check(edge, entry, false);
}
@Override
public boolean updateSpecified(Edge<T> edge, Traversal<T> entry) {
return check(edge, entry, true);
}
private boolean check(Edge<T> edge, Traversal<T> entry, boolean update) {
Optional<Traversal<T>> head = entry.getHead();
if (!head.isPresent() || head.get().getEdge() == null) return false;
Traversal<T> start = getStart(head.get());
boolean found = edge.isConnect(start.getTarget().getEntry());
if (found && unique){
found = !start.isSkipped();
if (update){
start.setSkipped(true);
setSkip(entry);
}
}
return found;
}
private void setSkip(Traversal<T> entry) {
Traversal<T> curr = entry;
Optional<Traversal<T>> head = entry.getHead();
while (head.isPresent()) {
curr.setSkipped(true);
curr = head.get();
head = curr.getHead();
}
}
}

View File

@@ -89,6 +89,10 @@ public class RouteSearcher {
return collector.get();
}
public List<Route> getLoops(Vendor source, Collection<Vendor> vendors, int count){
return search(source, source, vendors, count, new LoopRouteSpecification<Vendor>(true));
}
private class RouteCollector {
private List<Route> routes = new ArrayList<>();

View File

@@ -202,6 +202,10 @@ public class MarketAnalyzer {
return top;
}
public Collection<Route> getLoops(Vendor vendor, int limit){
return searcher.getLoops(vendor, getVendors(), limit);
}
public Collection<Route> getRoutes(Place from){
return searcher.getRoutes(getVendors(from), getVendors());
}