Archived
0

to route methods is static now

This commit is contained in:
iMoHax
2015-07-17 15:35:57 +03:00
parent 86163caef8
commit 2a4465d3fc
4 changed files with 93 additions and 38 deletions

View File

@@ -16,6 +16,7 @@ public class Route implements Comparable<Route> {
private double score = 0; private double score = 0;
private double fuel = 0; private double fuel = 0;
private int lands = 0; private int lands = 0;
private int refills = 0;
public Route(RouteEntry root) { public Route(RouteEntry root) {
entries = new ArrayList<>(); entries = new ArrayList<>();
@@ -35,6 +36,10 @@ public class Route implements Comparable<Route> {
return entries.get(index); return entries.get(index);
} }
public boolean isEmpty(){
return entries.isEmpty();
}
void setBalance(double balance){ void setBalance(double balance){
this.balance = balance; this.balance = balance;
} }
@@ -55,6 +60,10 @@ public class Route implements Comparable<Route> {
return lands; return lands;
} }
public int getRefills() {
return refills;
}
public void add(RouteEntry entry){ public void add(RouteEntry entry){
LOG.trace("Add entry {} to route {}", entry, this); LOG.trace("Add entry {} to route {}", entry, this);
entries.add(entry); entries.add(entry);
@@ -100,9 +109,19 @@ public class Route implements Comparable<Route> {
updateStats(); updateStats();
} }
public void dropTo(Vendor vendor){
for (ListIterator<RouteEntry> iterator = entries.listIterator(entries.size()); iterator.hasPrevious(); ) {
RouteEntry entry = iterator.previous();
if (entry.is(vendor)){
break;
}
iterator.remove();
}
}
void updateStats(){ void updateStats(){
LOG.trace("Update stats, old: profit={}, distance={}, lands={}, fuel={}, score={}", profit, distance, lands, fuel, score); LOG.trace("Update stats, old: profit={}, distance={}, lands={}, fuel={}, refills={}, score={}", profit, distance, lands, fuel, refills, score);
profit = 0; distance = 0; lands = 0; fuel = 0; profit = 0; distance = 0; lands = 0; fuel = 0; refills = 0;
if (entries.isEmpty()) return; if (entries.isEmpty()) return;
RouteEntry entry = entries.get(0); RouteEntry entry = entries.get(0);
for (int i = 1; i < entries.size(); i++) { for (int i = 1; i < entries.size(); i++) {
@@ -114,6 +133,9 @@ public class Route implements Comparable<Route> {
if (entry.isLand()){ if (entry.isLand()){
lands++; lands++;
} }
if (entry.isRefill()){
refills++;
}
entry = next; entry = next;
} }
LOG.trace("new stats profit={}, distance={}, lands={}, fuel={}, score={}", profit, distance, lands, fuel, score); LOG.trace("new stats profit={}, distance={}, lands={}, fuel={}, score={}", profit, distance, lands, fuel, score);

View File

@@ -51,11 +51,11 @@ public class RouteEntry {
this.score = score; this.score = score;
} }
public void add(Order order){ void add(Order order){
orders.add(order); orders.add(order);
} }
public void addAll(Collection<Order> orders){ void addAll(Collection<Order> orders){
this.orders.addAll(orders); this.orders.addAll(orders);
} }
@@ -63,7 +63,7 @@ public class RouteEntry {
return orders; return orders;
} }
public void clearOrders(){ void clearOrders(){
orders.clear(); orders.clear();
} }
@@ -75,7 +75,7 @@ public class RouteEntry {
return land || refill || !orders.isEmpty(); return land || refill || !orders.isEmpty();
} }
public void setLand(boolean land) { void setLand(boolean land) {
this.land = land; this.land = land;
} }

View File

@@ -106,40 +106,63 @@ public class RouteSearcher {
public List<Route> get() { public List<Route> get() {
return routes; return routes;
} }
}
private Route toRoute(List<Edge<Vendor>> edges){ public static Route toRoute(List<Edge<Vendor>> edges){
List<RouteEntry> entries = new ArrayList<>(edges.size()+1); List<RouteEntry> entries = new ArrayList<>(edges.size()+1);
Vendor buyer = null; Vendor buyer = null;
VendorsGraph.VendorsEdge vEdge = null; VendorsGraph.VendorsEdge vEdge = null;
for (Edge<Vendor> e : edges) { for (Edge<Vendor> e : edges) {
vEdge = (VendorsGraph.VendorsEdge) e; vEdge = (VendorsGraph.VendorsEdge) e;
List<ConnectibleEdge<Vendor>> transitEdges = vEdge.getPath().getEntries(); List<ConnectibleEdge<Vendor>> transitEdges = vEdge.getPath().getEntries();
for (int k = 0; k < transitEdges.size(); k++) { for (int k = 0; k < transitEdges.size(); k++) {
ConnectibleEdge<Vendor> edge = transitEdges.get(k); ConnectibleEdge<Vendor> edge = transitEdges.get(k);
Vendor vendor = edge.getSource().getEntry(); Vendor vendor = edge.getSource().getEntry();
RouteEntry entry = new RouteEntry(vendor, edge.isRefill(), edge.getFuelCost(), 0); RouteEntry entry = new RouteEntry(vendor, edge.isRefill(), edge.getFuelCost(), 0);
if (buyer != null && vendor.equals(buyer)) { if (buyer != null && vendor.equals(buyer)) {
entry.setLand(true); entry.setLand(true);
buyer = null; buyer = null;
} }
if (k == 0) { if (k == 0) {
entry.setScore(vEdge.getWeight()); entry.setScore(vEdge.getWeight());
List<Order> orders = vEdge.getOrders(); List<Order> orders = vEdge.getOrders();
if (!orders.isEmpty()) { if (!orders.isEmpty()) {
buyer = orders.get(0).getBuyer(); buyer = orders.get(0).getBuyer();
entry.addAll(orders); entry.addAll(orders);
} }
}
entries.add(entry);
} }
}
if (vEdge != null) {
RouteEntry entry = new RouteEntry(vEdge.getTarget().getEntry(), false, 0, 0);
if (buyer != null) entry.setLand(true);
entries.add(entry); entries.add(entry);
} }
return new Route(entries);
} }
if (vEdge != null) {
RouteEntry entry = new RouteEntry(vEdge.getTarget().getEntry(), false, 0, 0);
if (buyer != null) entry.setLand(true);
entries.add(entry);
}
return new Route(entries);
}
public static Route toRoute(Order order, List<Edge<Place>> edges){
Route route = toRoute(order.getSeller(), order.getBuyer(), edges);
if (route.isEmpty()) return route;
route.get(0).add(order);
route.updateStats();
return route;
}
public static Route toRoute(Vendor from, Vendor to, List<Edge<Place>> edges){
List<RouteEntry> entries = new ArrayList<>(edges.size()+1);
for (int i = 0; i < edges.size(); i++) {
ConnectibleEdge<Place> edge = (ConnectibleEdge<Place>) edges.get(i);
Vendor vendor = i == 0 ? from : edge.getSource().getEntry().asTransit();
RouteEntry entry = new RouteEntry(vendor, edge.isRefill(), edge.getFuelCost(), 0);
entries.add(entry);
if (i == edges.size()-1){
entry = new RouteEntry(to, false, 0, 0);
entry.setLand(true);
entries.add(entry);
}
}
return new Route(entries);
} }
} }

View File

@@ -35,6 +35,10 @@ public class MarketAnalyzer {
this.callback = callback; this.callback = callback;
} }
public Profile getProfile() {
return profile;
}
public List<Offer> getOffers(OFFER_TYPE offerType, Item item, MarketFilter filter){ public List<Offer> getOffers(OFFER_TYPE offerType, Item item, MarketFilter filter){
return market.getOffers(offerType, item).filter(o -> !filter.isFiltered(o.getVendor())).collect(Collectors.toList()); return market.getOffers(offerType, item).filter(o -> !filter.isFiltered(o.getVendor())).collect(Collectors.toList());
} }
@@ -173,8 +177,12 @@ public class MarketAnalyzer {
return searcher.getPaths(from, to, getPlaces()); return searcher.getPaths(from, to, getPlaces());
} }
public List<Edge<Place>> getPath(Place from, Place to){ public Route getPath(Vendor from, Vendor to){
return searcher.getPath(from, to, getPlaces()); return RouteSearcher.toRoute(from, to, searcher.getPath(from.getPlace(), to.getPlace(), getPlaces()));
}
public Route getPath(Order order){
return RouteSearcher.toRoute(order, searcher.getPath(order.getSeller().getPlace(), order.getBuyer().getPlace(), getPlaces()));
} }
public Collection<Route> getTopRoutes(int limit){ public Collection<Route> getTopRoutes(int limit){
@@ -182,7 +190,9 @@ public class MarketAnalyzer {
LimitedQueue<Route> top = new LimitedQueue<>(limit); LimitedQueue<Route> top = new LimitedQueue<>(limit);
Collection<Vendor> vendors = getVendors(); Collection<Vendor> vendors = getVendors();
callback.setMax(vendors.size()); callback.setMax(vendors.size());
for (Vendor vendor : vendors) { Iterator<Vendor> iterator = market.getMarkets(false).iterator();
while (iterator.hasNext()){
Vendor vendor = iterator.next();
if (callback.isCancel()) break; if (callback.isCancel()) break;
Collection<Route> paths = searcher.getRoutes(vendor, vendor, vendors, 3); Collection<Route> paths = searcher.getRoutes(vendor, vendor, vendors, 3);
top.addAll(paths); top.addAll(paths);