compute route score as time/profit
This commit is contained in:
@@ -8,16 +8,15 @@ import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/*TODO: change to compute profit for seocnd
|
||||
* times:
|
||||
* 26810 - 7:15
|
||||
* 1980 - 3:46
|
||||
* 1330 - 2:47
|
||||
* 1380 - 2:32
|
||||
* 780 - 2:10
|
||||
* 430 - 2:04
|
||||
* 306 - 1:54
|
||||
* 88 - 1:25
|
||||
/* times:
|
||||
* 26810 - 7:15 - 435
|
||||
* 1980 - 3:46 - 226
|
||||
* 1330 - 2:47 - 167
|
||||
* 1380 - 2:32 - 152
|
||||
* 780 - 2:10 - 130
|
||||
* 430 - 2:04 - 124
|
||||
* 306 - 1:54 - 116
|
||||
* 88 - 1:25 - 85
|
||||
*
|
||||
* launch_to_start_jmp - 0:40, 0:43, 0:40
|
||||
* jmp - 0:33, 0:33, 0:30, 0:32, 0:32, 0:32
|
||||
@@ -84,6 +83,10 @@ public class Scorer {
|
||||
return avgProfit * profile.getShip().getCargo();
|
||||
}
|
||||
|
||||
public double getMaxProfit() {
|
||||
return maxProfit;
|
||||
}
|
||||
|
||||
public double getMaxScore() {
|
||||
return maxScore;
|
||||
}
|
||||
@@ -101,38 +104,33 @@ public class Scorer {
|
||||
return getScore(vendor.getDistance(), profit, jumps, lands, fuel);
|
||||
}
|
||||
|
||||
public double getTransitScore(double fuel){
|
||||
LOG.trace("Compute transit score fuel={}", fuel);
|
||||
double profit = maxProfit;
|
||||
profit -= profile.getFuelPrice() * fuel / profile.getShip().getCargo();
|
||||
if (avgDistance > 0) {
|
||||
profit -= - avgProfit * profile.getDistanceMult();
|
||||
private double getTime(double distance){
|
||||
double a = 6000;
|
||||
double b = 673;
|
||||
double c = 1670;
|
||||
return Math.log(distance + a)*b*profile.getDistanceTime() - c;
|
||||
}
|
||||
|
||||
public double getProfit(double profit, double fuel){
|
||||
profit -= profile.getFuelPrice() * fuel;
|
||||
profit = profit / profile.getShip().getCargo();
|
||||
return profit;
|
||||
}
|
||||
|
||||
public double getTime(double distance, int jumps, int lands){
|
||||
double time = profile.getTakeoffTime();
|
||||
if (jumps > 0){
|
||||
time += profile.getJumpTime() + (jumps-1) * (profile.getRechargeTime() + profile.getJumpTime());
|
||||
}
|
||||
if (profile.getLandMult() > 0){
|
||||
profit = profit / profile.getLandMult();
|
||||
if (profile.getLandingTime() > 0){
|
||||
time += (lands-1)*(getTime(avgDistance) + profile.getLandingTime() + profile.getTakeoffTime()) + getTime(distance) + profile.getLandingTime();
|
||||
}
|
||||
double score = profit * (1 - profile.getJumpMult()/profile.getJumps());
|
||||
LOG.trace("score={}", score);
|
||||
return score;
|
||||
return time;
|
||||
}
|
||||
|
||||
public double getScore(double distance, double profit, int jumps, int lands, double fuel){
|
||||
LOG.trace("Compute score distance={}, profit={}, jumps={}, lands={}, fuel={}", distance, profit, jumps, lands, fuel);
|
||||
profit -= profile.getFuelPrice() * fuel;
|
||||
profit = profit / profile.getShip().getCargo();
|
||||
if (avgDistance > 0) {
|
||||
profit -= avgProfit * profile.getDistanceMult() * (distance - avgDistance) / avgDistance;
|
||||
}
|
||||
double score = profit;
|
||||
if (profit > 0){
|
||||
if (lands > 0 && profile.getLandMult() > 0){
|
||||
score = profit / (lands * profile.getLandMult());
|
||||
}
|
||||
if (profile.getPathPriority() == Profile.PATH_PRIORITY.ECO){
|
||||
jumps = 1;
|
||||
}
|
||||
score -= profile.getJumpMult()/profile.getJumps() * score * jumps;
|
||||
}
|
||||
double score = getProfit(profit, fuel)/getTime(distance, jumps, lands);
|
||||
LOG.trace("score={}", score);
|
||||
return score;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package ru.trader.analysis;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import ru.trader.analysis.graph.*;
|
||||
@@ -397,6 +398,8 @@ public class VendorsGraph extends ConnectibleGraph<Vendor> {
|
||||
public class VendorsEdge extends ConnectibleEdge<Vendor> {
|
||||
private TransitPath path;
|
||||
private List<Order> orders;
|
||||
private Double profitByTonne;
|
||||
private Double time;
|
||||
|
||||
protected VendorsEdge(Vertex<Vendor> source, Vertex<Vendor> target, TransitPath path) {
|
||||
super(source, target);
|
||||
@@ -433,19 +436,54 @@ public class VendorsGraph extends ConnectibleGraph<Vendor> {
|
||||
return path;
|
||||
}
|
||||
|
||||
public double getProfitByTonne() {
|
||||
if (profitByTonne == null){
|
||||
profitByTonne = computeProfit();
|
||||
}
|
||||
return profitByTonne;
|
||||
}
|
||||
|
||||
public double getTime() {
|
||||
if (time == null){
|
||||
time = computeTime();
|
||||
}
|
||||
return time;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(@NotNull Edge other) {
|
||||
double w = getWeight();
|
||||
double ow = other.getWeight();
|
||||
if (ow >= 0 && w >= 0) return super.compareTo(other);
|
||||
if (w < 0 && ow < 0) return Double.compare(Math.abs(w), Math.abs(ow));
|
||||
return w < 0 ? 1 : -1;
|
||||
}
|
||||
|
||||
protected double computeProfit(){
|
||||
double fuel = fuelCost;
|
||||
if (path != null){
|
||||
fuel = path.getFuelCost();
|
||||
}
|
||||
return scorer.getProfit(getProfit(), fuel);
|
||||
}
|
||||
|
||||
protected double computeTime(){
|
||||
int jumps = source.getEntry().getPlace().equals(target.getEntry().getPlace())? 0 : 1;
|
||||
int lands = 1;
|
||||
if (path != null){
|
||||
jumps = path.size()-1;
|
||||
lands += path.getRefillCount();
|
||||
//not lands if refuel on this station
|
||||
if (path.isRefill()) lands--;
|
||||
} else {
|
||||
lands += isRefill() ? 1 :0;
|
||||
}
|
||||
return scorer.getTime(target.getEntry().getDistance(), jumps, lands);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double computeWeight() {
|
||||
int jumps = source.getEntry().getPlace().equals(target.getEntry().getPlace())? 0 : 1;
|
||||
int lands = 1; double fuel = fuelCost;
|
||||
if (path != null){
|
||||
jumps = path.size()-1; fuel = getFuelCost();
|
||||
lands += path.getRefillCount();
|
||||
}
|
||||
double profit = getProfit();
|
||||
double score = scorer.getScore(target.getEntry(), profit, jumps, lands, fuel);
|
||||
score = scorer.getMaxScore() - score;
|
||||
if (score < 0) score = 0;
|
||||
return score;
|
||||
return getTime()/getProfitByTonne();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -536,12 +574,23 @@ public class VendorsGraph extends ConnectibleGraph<Vendor> {
|
||||
@Override
|
||||
public double getWeight() {
|
||||
if (weight == null){
|
||||
Edge<Vendor> edge = getEdge();
|
||||
VendorsEdge edge = (VendorsEdge) getEdge();
|
||||
Optional<Traversal<Vendor>> head = getHead();
|
||||
weight = (head.isPresent() ? ((VendorsTraversalEntry)head.get()).getWeight() : 0) + (edge != null ? edge.getWeight() : 0);
|
||||
double profit = 0; double time = 0;
|
||||
if (edge != null){
|
||||
weight = weight / (1+Math.floorDiv(profile.getLands() - this.size(),this.size()));
|
||||
profit = edge.getProfitByTonne();
|
||||
time = edge.getTime();
|
||||
}
|
||||
while (head.isPresent()){
|
||||
VendorsTraversalEntry hEntry = (VendorsTraversalEntry) head.get();
|
||||
edge = (VendorsEdge) hEntry.getEdge();
|
||||
if (edge != null){
|
||||
profit += edge.getProfitByTonne();
|
||||
time += edge.getTime();
|
||||
}
|
||||
head = hEntry.getHead();
|
||||
}
|
||||
weight = profit > 1 ? time / profit : time;
|
||||
}
|
||||
return weight;
|
||||
}
|
||||
|
||||
@@ -12,9 +12,11 @@ public class Profile {
|
||||
private boolean refill;
|
||||
private int routesCount;
|
||||
//Scorer multipliers
|
||||
private double distanceMult;
|
||||
private double jumpMult;
|
||||
private double landMult;
|
||||
private double distanceTime;
|
||||
private double jumpTime;
|
||||
private double landingTime;
|
||||
private double takeoffTime;
|
||||
private double rechargeTime;
|
||||
private double fuelPrice;
|
||||
private PATH_PRIORITY pathPriority;
|
||||
|
||||
@@ -24,10 +26,12 @@ public class Profile {
|
||||
jumps = 6;
|
||||
lands = 4;
|
||||
routesCount = 30;
|
||||
distanceMult = 0.8;
|
||||
landMult = 0.95;
|
||||
distanceTime = 0.3;
|
||||
fuelPrice = 100;
|
||||
jumpMult = 0.5;
|
||||
landingTime = 80;
|
||||
takeoffTime = 40;
|
||||
jumpTime = 32;
|
||||
rechargeTime = 12;
|
||||
pathPriority = PATH_PRIORITY.FAST;
|
||||
}
|
||||
|
||||
@@ -79,28 +83,44 @@ public class Profile {
|
||||
this.routesCount = routesCount;
|
||||
}
|
||||
|
||||
public double getDistanceMult() {
|
||||
return distanceMult;
|
||||
public double getDistanceTime() {
|
||||
return distanceTime;
|
||||
}
|
||||
|
||||
public void setDistanceMult(double distanceMult) {
|
||||
this.distanceMult = distanceMult;
|
||||
public void setDistanceTime(double distanceTime) {
|
||||
this.distanceTime = distanceTime;
|
||||
}
|
||||
|
||||
public double getJumpMult() {
|
||||
return jumpMult;
|
||||
public double getJumpTime() {
|
||||
return jumpTime;
|
||||
}
|
||||
|
||||
public void setJumpMult(double jumpMult) {
|
||||
this.jumpMult = jumpMult;
|
||||
public void setJumpTime(double jumpTime) {
|
||||
this.jumpTime = jumpTime;
|
||||
}
|
||||
|
||||
public double getLandMult() {
|
||||
return landMult;
|
||||
public double getLandingTime() {
|
||||
return landingTime;
|
||||
}
|
||||
|
||||
public void setLandMult(double landMult) {
|
||||
this.landMult = landMult;
|
||||
public void setLandingTime(double landingTime) {
|
||||
this.landingTime = landingTime;
|
||||
}
|
||||
|
||||
public double getTakeoffTime() {
|
||||
return takeoffTime;
|
||||
}
|
||||
|
||||
public void setTakeoffTime(double takeoffTime) {
|
||||
this.takeoffTime = takeoffTime;
|
||||
}
|
||||
|
||||
public double getRechargeTime() {
|
||||
return rechargeTime;
|
||||
}
|
||||
|
||||
public void setRechargeTime(double rechargeTime) {
|
||||
this.rechargeTime = rechargeTime;
|
||||
}
|
||||
|
||||
public double getFuelPrice() {
|
||||
@@ -124,13 +144,15 @@ public class Profile {
|
||||
Profile profile = new Profile(ship);
|
||||
profile.setBalance(Double.valueOf(values.getProperty("profile.balance","1000")));
|
||||
profile.setJumps(Integer.valueOf(values.getProperty("profile.jumps", "6")));
|
||||
profile.setLands(Integer.valueOf(values.getProperty("profile.lands","4")));
|
||||
profile.setPathPriority(PATH_PRIORITY.valueOf(values.getProperty("profile.search.priority","FAST")));
|
||||
profile.setRoutesCount(Integer.valueOf(values.getProperty("profile.search.routes","100")));
|
||||
profile.setFuelPrice(Double.valueOf(values.getProperty("profile.search.fuel.price","100")));
|
||||
profile.setDistanceMult(Double.valueOf(values.getProperty("profile.search.mult.distance","0.8")));
|
||||
profile.setLandMult(Double.valueOf(values.getProperty("profile.search.mult.land","0.95")));
|
||||
profile.setJumpMult(Double.valueOf(values.getProperty("profile.search.mult.jump","0.5")));
|
||||
profile.setLands(Integer.valueOf(values.getProperty("profile.lands", "4")));
|
||||
profile.setPathPriority(PATH_PRIORITY.valueOf(values.getProperty("profile.search.priority", "FAST")));
|
||||
profile.setRoutesCount(Integer.valueOf(values.getProperty("profile.search.routes", "100")));
|
||||
profile.setFuelPrice(Double.valueOf(values.getProperty("profile.search.fuel.price", "100")));
|
||||
profile.setDistanceTime(Double.valueOf(values.getProperty("profile.search.times.distance", "0.3")));
|
||||
profile.setLandingTime(Double.valueOf(values.getProperty("profile.search.times.landing", "80")));
|
||||
profile.setTakeoffTime(Double.valueOf(values.getProperty("profile.search.times.takeoff", "40")));
|
||||
profile.setJumpTime(Double.valueOf(values.getProperty("profile.search.times.jump", "32")));
|
||||
profile.setRechargeTime(Double.valueOf(values.getProperty("profile.search.times.recharge", "12")));
|
||||
return profile;
|
||||
}
|
||||
|
||||
@@ -141,9 +163,11 @@ public class Profile {
|
||||
values.setProperty("profile.search.priority", String.valueOf(pathPriority));
|
||||
values.setProperty("profile.search.routes", String.valueOf(routesCount));
|
||||
values.setProperty("profile.search.fuel.price", String.valueOf(fuelPrice));
|
||||
values.setProperty("profile.search.mult.distance", String.valueOf(distanceMult));
|
||||
values.setProperty("profile.search.mult.land", String.valueOf(landMult));
|
||||
values.setProperty("profile.search.mult.jump", String.valueOf(jumpMult));
|
||||
values.setProperty("profile.search.times.distance", String.valueOf(distanceTime));
|
||||
values.setProperty("profile.search.times.landing", String.valueOf(landingTime));
|
||||
values.setProperty("profile.search.times.takeoff", String.valueOf(takeoffTime));
|
||||
values.setProperty("profile.search.times.jump", String.valueOf(jumpTime));
|
||||
values.setProperty("profile.search.times.recharge", String.valueOf(rechargeTime));
|
||||
ship.writeTo(values);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,12 +24,14 @@ public class RouteFillerTest extends Assert {
|
||||
private Vendor v4;
|
||||
private Vendor v5;
|
||||
|
||||
private RouteFiller getFillerInstance(double balance, int cargo, double landsMult, Market market){
|
||||
private RouteFiller getFillerInstance(double balance, int cargo, boolean skipLandingTime, Market market){
|
||||
Ship ship = new Ship();
|
||||
ship.setCargo(cargo);
|
||||
Profile profile = new Profile(ship);
|
||||
profile.setBalance(balance);
|
||||
profile.setLandMult(landsMult);
|
||||
if (skipLandingTime){
|
||||
profile.setLandingTime(0);
|
||||
}
|
||||
Scorer scorer = new Scorer(new FilteredMarket(market, new MarketFilter()), profile);
|
||||
return new RouteFiller(scorer);
|
||||
}
|
||||
@@ -60,7 +62,7 @@ public class RouteFillerTest extends Assert {
|
||||
public void testRoute1() throws Exception {
|
||||
LOG.info("Start route test 1");
|
||||
Route route = initTest1();
|
||||
RouteFiller filler = getFillerInstance(10000, 5, 0, market);
|
||||
RouteFiller filler = getFillerInstance(10000, 5, true, market);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(10000, route.getBalance(), 0.0001);
|
||||
@@ -102,7 +104,7 @@ public class RouteFillerTest extends Assert {
|
||||
public void testPathRoute2() throws Exception {
|
||||
LOG.info("Start route test 2");
|
||||
Route route = initTest2();
|
||||
RouteFiller filler = getFillerInstance(10000, 5, 0, market);
|
||||
RouteFiller filler = getFillerInstance(10000, 5, true, market);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(1000, route.getProfit(), 0.0001);
|
||||
@@ -152,7 +154,7 @@ public class RouteFillerTest extends Assert {
|
||||
public void testPathRoute3() throws Exception {
|
||||
LOG.info("Start route test 3");
|
||||
Route route = initTest3();
|
||||
RouteFiller filler = getFillerInstance(10000, 5, 0, market);
|
||||
RouteFiller filler = getFillerInstance(10000, 5, true, market);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(800, route.getProfit(), 0.0001);
|
||||
@@ -179,7 +181,7 @@ public class RouteFillerTest extends Assert {
|
||||
public void testPathRoute3byLands() throws Exception {
|
||||
LOG.info("Start route test 3 by lands");
|
||||
Route route = initTest3();
|
||||
RouteFiller filler = getFillerInstance(10000, 5, 1, market);
|
||||
RouteFiller filler = getFillerInstance(10000, 5, false, market);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(750, route.getProfit(), 0.0001);
|
||||
@@ -235,7 +237,7 @@ public class RouteFillerTest extends Assert {
|
||||
public void testPathRoute4() throws Exception {
|
||||
LOG.info("Start route test 4");
|
||||
Route route = initTest4();
|
||||
RouteFiller filler = getFillerInstance(10000, 5, 0, market);
|
||||
RouteFiller filler = getFillerInstance(10000, 5, true, market);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(1000, route.getProfit(), 0.0001);
|
||||
@@ -298,7 +300,7 @@ public class RouteFillerTest extends Assert {
|
||||
public void testPathRoute5() throws Exception {
|
||||
LOG.info("Start route test 5");
|
||||
Route route = initTest5();
|
||||
RouteFiller filler = getFillerInstance(500, 5, 0, market);
|
||||
RouteFiller filler = getFillerInstance(500, 5, true, market);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(620, route.getProfit(), 0.0001);
|
||||
@@ -325,7 +327,7 @@ public class RouteFillerTest extends Assert {
|
||||
public void testPathRoute5B() throws Exception {
|
||||
LOG.info("Start route test 5B");
|
||||
Route route = initTest5();
|
||||
RouteFiller filler = getFillerInstance(700, 7, 0, market);
|
||||
RouteFiller filler = getFillerInstance(700, 7, true, market);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(750, route.getProfit(), 0.0001);
|
||||
@@ -397,7 +399,7 @@ public class RouteFillerTest extends Assert {
|
||||
LOG.info("Start join route test");
|
||||
Route route = initTest6A();
|
||||
Route routeB = initTest6B();
|
||||
RouteFiller filler = getFillerInstance(500, 5, 0, market);
|
||||
RouteFiller filler = getFillerInstance(500, 5, true, market);
|
||||
filler.fill(route);
|
||||
filler.fill(routeB);
|
||||
|
||||
@@ -435,9 +437,9 @@ public class RouteFillerTest extends Assert {
|
||||
LOG.info("Start join route test");
|
||||
Route route = initTest6A();
|
||||
Route routeB = initTest6B();
|
||||
RouteFiller filler = getFillerInstance(500, 5, 0, market);
|
||||
RouteFiller filler = getFillerInstance(500, 5, true, market);
|
||||
filler.fill(route);
|
||||
filler = getFillerInstance(550, 5, 0, market);
|
||||
filler = getFillerInstance(550, 5, true, market);
|
||||
filler.fill(routeB);
|
||||
|
||||
route.join(routeB);
|
||||
|
||||
@@ -22,9 +22,9 @@ public class RouteSearcherTest extends Assert{
|
||||
private Place lhs3262;
|
||||
private Place morgor;
|
||||
private Place lhs3006;
|
||||
private Place bd47;
|
||||
private Place dnDraconis;
|
||||
private Place aulin;
|
||||
private Place iBootis;
|
||||
private Place cmDraco;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
@@ -34,9 +34,9 @@ public class RouteSearcherTest extends Assert{
|
||||
lhs3262 = world.get("LHS 3262");
|
||||
morgor = world.get("Morgor");
|
||||
lhs3006 = world.get("LHS 3006");
|
||||
bd47 = world.get("BD+47 2112");
|
||||
dnDraconis = world.get("DN Draconis");
|
||||
aulin = world.get("Aulin");
|
||||
iBootis = world.get("i Bootis");
|
||||
cmDraco = world.get("CM Draco");
|
||||
|
||||
MarketFilter filter = new MarketFilter();
|
||||
fWorld = new FilteredMarket(world, filter);
|
||||
@@ -52,15 +52,16 @@ public class RouteSearcherTest extends Assert{
|
||||
Vendor morgor_st = morgor.get().iterator().next();
|
||||
Vendor lhs3006_st = lhs3006.get().iterator().next();
|
||||
Vendor aulin_st = aulin.get().iterator().next();
|
||||
Vendor cmDraco_st = cmDraco.get().iterator().next();
|
||||
Ship ship = new Ship();
|
||||
ship.setCargo(440); ship.setTank(15);
|
||||
ship.setEngine(5, 'A'); ship.setMass(466);
|
||||
Profile profile = new Profile(ship);
|
||||
profile.setBalance(6000000); profile.setJumps(6);
|
||||
profile.setRoutesCount(100);
|
||||
profile.setRoutesCount(100); profile.setLands(3);
|
||||
Scorer scorer = new Scorer(fWorld, profile);
|
||||
|
||||
LOG.info("Start test routes");
|
||||
LOG.info("Start test routes, 3 lands");
|
||||
RouteSearcher searcher = new RouteSearcher(scorer);
|
||||
|
||||
Route route = new Route(new RouteEntry(ithaca_st, false, 3.3789702637348586d, 0));
|
||||
@@ -73,9 +74,9 @@ public class RouteSearcherTest extends Assert{
|
||||
RouteFiller filler = new RouteFiller(scorer);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(route.getProfit(), 981200, 0);
|
||||
assertEquals(route.getLands(), 2);
|
||||
assertEquals(route.getDistance(), 72.42, 0.01);
|
||||
assertEquals(981200, route.getProfit(), 0);
|
||||
assertEquals(2, route.getLands());
|
||||
assertEquals(72.42, route.getDistance(), 0.01);
|
||||
|
||||
List<Route> apaths = searcher.getRoutes(ithaca_st, ithaca_st, fWorld.getMarkets(true).collect(Collectors.toList()));
|
||||
/* List<Route> apaths = searcher.getRoutes(ithaca_st, ithaca_st, Arrays.asList(ithaca_st, lhs3262_st,
|
||||
@@ -85,5 +86,29 @@ public class RouteSearcherTest extends Assert{
|
||||
Route actual = apaths.stream().findFirst().get();
|
||||
assertEquals("Routes is different", route, actual);
|
||||
|
||||
LOG.info("Start test routes, 4 lands");
|
||||
profile.setLands(4);
|
||||
route = new Route(new RouteEntry(ithaca_st, false, 3.3789702637348586d, 0));
|
||||
route.add(new RouteEntry(morgor.asTransit(), false, 4.137765020523591d, 0));
|
||||
route.add(new RouteEntry(lhs3006.asTransit(), false, 4.0674474942172765d, 0));
|
||||
route.add(new RouteEntry(lhs3262_st, true, 0.644029909978323d, 0));
|
||||
route.add(new RouteEntry(dnDraconis.asTransit(), false, 4.437544442558194d, 0));
|
||||
route.add(new RouteEntry(cmDraco_st, false, 4.385307711185104d, 0));
|
||||
route.add(new RouteEntry(dnDraconis.asTransit(), false, 0.6279317619086441d, 0));
|
||||
route.add(new RouteEntry(lhs3262_st, true, 4.149937831634785d, 0));
|
||||
route.add(new RouteEntry(lhs3006.asTransit(), false, 4.1292528548103d, 0));
|
||||
route.add(new RouteEntry(morgor.asTransit(), false, 3.3050364899848566, 0));
|
||||
route.add(new RouteEntry(ithaca_st, false, 0, 0));
|
||||
filler = new RouteFiller(scorer);
|
||||
filler.fill(route);
|
||||
|
||||
assertEquals(1971200, route.getProfit(), 0);
|
||||
assertEquals(4, route.getLands());
|
||||
assertEquals(109.51, route.getDistance(), 0.01);
|
||||
|
||||
apaths = searcher.getRoutes(ithaca_st, ithaca_st, fWorld.getMarkets(true).collect(Collectors.toList()));
|
||||
actual = apaths.stream().findFirst().get();
|
||||
assertEquals("Routes is different", route, actual);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,13 +36,6 @@ public class ScorerTest extends Assert {
|
||||
profile.setBalance(1000000);
|
||||
Scorer scorer = new Scorer(fWorld, profile);
|
||||
|
||||
double transitScore = scorer.getTransitScore(4);
|
||||
double transitScore2 = scorer.getTransitScore(6);
|
||||
double transitScore3 = scorer.getTransitScore(2);
|
||||
|
||||
assertTrue(transitScore > transitScore2);
|
||||
assertTrue(transitScore3 > transitScore);
|
||||
|
||||
double score = scorer.getScore(scorer.getAvgDistance(), 0, 1, 1, 4);
|
||||
double score1 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()/2, 1, 1, 4);
|
||||
double score2 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*10, 1, 1, 4);
|
||||
@@ -84,9 +77,9 @@ public class ScorerTest extends Assert {
|
||||
assertTrue(score1 > score2);
|
||||
assertTrue(score2 > score3);
|
||||
|
||||
score1 = scorer.getScore(scorer.getAvgDistance()/2, scorer.getAvgProfit(), 1, 1, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance()*2, scorer.getAvgProfit()*2, 1, 1, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance()*2, scorer.getAvgProfit()*4, 1, 1, 4);
|
||||
score1 = scorer.getScore(700, scorer.getAvgProfit(), 1, 1, 4);
|
||||
score2 = scorer.getScore(2800, scorer.getAvgProfit()*1.2, 1, 1, 4);
|
||||
score3 = scorer.getScore(2800, scorer.getAvgProfit()*1.5, 1, 1, 4);
|
||||
assertTrue(score1 > score2);
|
||||
assertTrue(score3 > score1);
|
||||
|
||||
@@ -96,26 +89,16 @@ public class ScorerTest extends Assert {
|
||||
assertTrue(score2 > score1);
|
||||
assertTrue(score3 > score2);
|
||||
|
||||
transitScore = scorer.getTransitScore(4);
|
||||
score = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit(), 1, 1, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()/2, 1, 1, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*10, 1, 1, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), 0, 1, 1, 4);
|
||||
assertTrue(transitScore > score);
|
||||
assertTrue(transitScore > score1);
|
||||
assertTrue(transitScore < score2);
|
||||
assertTrue(transitScore > score3);
|
||||
|
||||
score = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit(), 4, 2, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*1.2, 6, 2, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit(), 6, 2, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*1.4, 6, 2, 4);
|
||||
score = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit(), 2, 2, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*1.2, 8, 2, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit(), 8, 2, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*1.4, 8, 2, 4);
|
||||
assertTrue(score > score1);
|
||||
assertTrue(score > score2);
|
||||
assertTrue(score < score3);
|
||||
|
||||
score = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit(), 4, 2, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*1.9, 4, 4, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*1.8, 4, 4, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit(), 4, 4, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), scorer.getAvgProfit()*2.1, 4, 4, 4);
|
||||
assertTrue(score >= score1);
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package ru.trader.core;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import ru.trader.TestUtil;
|
||||
import ru.trader.analysis.*;
|
||||
import ru.trader.store.simple.Store;
|
||||
import java.io.InputStream;
|
||||
@@ -26,7 +24,7 @@ public class MarketAnalyzerTest2 extends Assert {
|
||||
ship.setEngine(5, 'A'); ship.setMass(466);
|
||||
Profile profile = new Profile(ship);
|
||||
profile.setBalance(6000000); profile.setJumps(6);
|
||||
profile.setRoutesCount(100);
|
||||
profile.setRoutesCount(100); profile.setLands(3);
|
||||
MarketAnalyzer analyzer = new MarketAnalyzer(fWorld, profile);
|
||||
Vendor ithaca = market.get("Ithaca").get().iterator().next();
|
||||
Vendor morgor = market.get("Morgor").asTransit();
|
||||
@@ -72,34 +70,19 @@ public class MarketAnalyzerTest2 extends Assert {
|
||||
Place lhs21 = market.get("LHS 21");
|
||||
Place bonde = market.get("Bonde");
|
||||
Place suiXing = market.get("Sui Xing");
|
||||
// LHS 21 (Resonatic Separator to Sui Xing) -> Bonde -> Sui Xing (Palladium to LHS 21) -> Bonde -> LHS 21
|
||||
// Profit: 199056, distance: 28.72, lands: 2
|
||||
|
||||
Collection<Route> paths = analyzer.getRoutes(lhs21, lhs21);
|
||||
Optional<Route> path = paths.stream().findFirst();
|
||||
assertTrue(path.isPresent());
|
||||
Route actual = path.get();
|
||||
assertEquals(114816, actual.getProfit(), 0.00001);
|
||||
assertEquals(8.16, actual.getDistance(), 0.01);
|
||||
assertEquals(2, actual.getLands());
|
||||
|
||||
Place aPlace = actual.get(0).getVendor().getPlace();
|
||||
assertEquals(lhs21, aPlace);
|
||||
aPlace = actual.get(1).getVendor().getPlace();
|
||||
assertEquals(bonde, aPlace);
|
||||
|
||||
// If distance to station has small mult
|
||||
// LHS 21 (Resonatic Separator to Sui Xing) -> Bonde -> Sui Xing (Palladium to LHS 21) -> Bonde -> LHS 21
|
||||
// Profit: 199056, distance: 28.72, lands: 2
|
||||
|
||||
profile.setDistanceMult(0.1);
|
||||
paths = analyzer.getRoutes(lhs21, lhs21);
|
||||
path = paths.stream().findFirst();
|
||||
assertTrue(path.isPresent());
|
||||
actual = path.get();
|
||||
|
||||
assertEquals(199056, actual.getProfit(), 0.00001);
|
||||
assertEquals(28.72, actual.getDistance(), 0.01);
|
||||
assertEquals(2, actual.getLands());
|
||||
|
||||
aPlace = actual.get(0).getVendor().getPlace();
|
||||
Place aPlace = actual.get(0).getVendor().getPlace();
|
||||
assertEquals(lhs21, aPlace);
|
||||
aPlace = actual.get(2).getVendor().getPlace();
|
||||
assertEquals(suiXing, aPlace);
|
||||
|
||||
Reference in New Issue
Block a user