to route methods is static now
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user