Archived
0

compute route score as time/profit

This commit is contained in:
iMoHax
2015-07-20 17:10:46 +03:00
parent 982759f206
commit 5893c99b71
7 changed files with 210 additions and 146 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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);