Archived
0

improve stack orders if low supply on station

This commit is contained in:
Mo
2016-06-19 15:40:07 +03:00
parent 2eced5a3a6
commit 9ac9605993

View File

@@ -14,8 +14,8 @@ public class MarketUtils {
List<Order> o = new ArrayList<>(orders);
LOG.trace("Fill stack orders {}, balance {}", o, balance);
o.forEach(or -> or.setMax(balance, cargo));
LOG.trace("Simple sort");
o.sort(Comparator.<Order>reverseOrder());
LOG.trace("Sort by profit by tonne");
o.sort(orderComparatorByTonneProfit.reversed());
LOG.trace("New order of orders {}", o);
List<Order> stack = new ArrayList<>();
long count = cargo;
@@ -30,12 +30,41 @@ public class MarketUtils {
LOG.trace("Remain cargo {}, remain balance {}", count, remain);
} else {
LOG.trace("Low profit, stopped");
remain = 0;
if (order.getCount() == 0 && order.getSell().getCount() > 0) {
remain = -1;
} else {
remain = 0;
}
}
if (count <= 0 || remain <= 0) {
break;
}
}
if (remain < 0) {
LOG.trace("Low balance, try fill");
LOG.trace("Simple sort");
o.sort(Comparator.<Order>reverseOrder());
LOG.trace("New order of orders {}", o);
stack.clear();
count = cargo;
remain = balance;
for (Order order : o) {
order = new Order(order.getSell(), order.getBuy(), remain, count);
LOG.trace("Next best order {}", order);
if (order.getProfit() > 0) {
stack.add(order);
remain -= order.getCount() * order.getSell().getPrice();
count -= order.getCount();
LOG.trace("Remain cargo {}, remain balance {}", count, remain);
} else {
LOG.trace("Low profit, stopped");
remain = 0;
}
if (count <= 0 || remain <= 0) {
break;
}
}
}
LOG.trace("Stack: {}", stack);
return stack;
}
@@ -80,4 +109,14 @@ public class MarketUtils {
public static boolean hasMarket(Vendor vendor) {
return vendor.has(SERVICE_TYPE.MARKET) || vendor.has(SERVICE_TYPE.BLACK_MARKET);
}
private final static Comparator<Order> orderComparatorByTonneProfit = (o1, o2) -> {
if (o1 == o2) return 0;
if (o1.getProfit() > 0 || o2.getProfit() > 0) {
if (o1.getProfit() <= 0) return -1;
if (o2.getProfit() <= 0) return 1;
return Double.compare(o1.getProfitByTonne(), o2.getProfitByTonne());
}
return o1.compareTo(o2);
};
}