implement orbital time check on search route
This commit is contained in:
@@ -4,6 +4,7 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import ru.trader.core.Offer;
|
||||
import ru.trader.core.Order;
|
||||
import ru.trader.core.STATION_TYPE;
|
||||
import ru.trader.core.Vendor;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -50,7 +50,7 @@ public class Scorer {
|
||||
maxProfit = statProfit.getMax() / profile.getShip().getCargo();
|
||||
|
||||
avgDistance = computeAvgDistance();
|
||||
maxScore = getScore(1, statProfit.getMax(), 0, 1, 0);
|
||||
maxScore = getScore(1, statProfit.getMax(), 0, 1, 0, 0);
|
||||
}
|
||||
|
||||
public Profile getProfile() {
|
||||
@@ -115,14 +115,16 @@ public class Scorer {
|
||||
if (prev == null) return 0;
|
||||
int lands = entry.isLand() ? 1 : 0;
|
||||
int jumps = prev.getVendor().getPlace().equals(entry.getVendor().getPlace()) ? 0 : 1;
|
||||
double time = getTime(entry.getVendor().getDistance(), jumps, lands);
|
||||
STATION_TYPE t = entry.getVendor().getType();
|
||||
int planetLands = t != null && t.isPlanetary() ? 1 : 0;
|
||||
double time = getTime(entry.getVendor().getDistance(), jumps, lands, planetLands);
|
||||
if (!prev.isLand()){
|
||||
time = time - profile.getTakeoffTime() + profile.getRechargeTime();
|
||||
}
|
||||
return Math.round(time);
|
||||
}
|
||||
|
||||
public long getTime(double distance, int jumps, int lands){
|
||||
public long getTime(double distance, int jumps, int lands, int planetLands){
|
||||
double time = profile.getTakeoffTime();
|
||||
if (jumps > 0){
|
||||
time += profile.getJumpTime() + (jumps-1) * (profile.getRechargeTime() + profile.getJumpTime());
|
||||
@@ -130,6 +132,9 @@ public class Scorer {
|
||||
if (profile.getLandingTime() > 0 & lands > 0){
|
||||
time += (lands-1)*(getTime(avgDistance) + profile.getLandingTime() + profile.getTakeoffTime()) + getTime(distance) + profile.getLandingTime();
|
||||
}
|
||||
if (profile.getOrbitalTime() > 0 & planetLands > 0){
|
||||
time += planetLands * profile.getOrbitalTime();
|
||||
}
|
||||
return Math.round(time);
|
||||
}
|
||||
|
||||
@@ -140,12 +145,14 @@ public class Scorer {
|
||||
}
|
||||
|
||||
public double getScore(Vendor vendor, double profit, int jumps, int lands, double fuel) {
|
||||
return getScore(vendor.getDistance(), profit, jumps, lands, fuel);
|
||||
STATION_TYPE t = vendor.getType();
|
||||
int planetLands = t != null && t.isPlanetary() ? 1 : 0;
|
||||
return getScore(vendor.getDistance(), profit, jumps, lands, planetLands, fuel);
|
||||
}
|
||||
|
||||
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);
|
||||
double score = getProfitByTonne(profit, fuel)/getTime(distance, jumps, lands);
|
||||
public double getScore(double distance, double profit, int jumps, int lands, int planetLands, double fuel){
|
||||
LOG.trace("Compute score distance={}, profit={}, jumps={}, lands={}, planetary lands = {}, fuel={}", distance, profit, jumps, lands, planetLands, fuel);
|
||||
double score = getProfitByTonne(profit, fuel)/getTime(distance, jumps, lands, planetLands);
|
||||
LOG.trace("score={}", score);
|
||||
return score;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import ru.trader.analysis.graph.*;
|
||||
import ru.trader.core.Order;
|
||||
import ru.trader.core.SERVICE_TYPE;
|
||||
import ru.trader.core.STATION_TYPE;
|
||||
import ru.trader.core.Vendor;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -206,6 +207,8 @@ public class VendorsCrawler extends Crawler<Vendor> {
|
||||
protected long computeTime(){
|
||||
int jumps = source.getEntry().getPlace().equals(target.getEntry().getPlace())? 0 : 1;
|
||||
int lands = 1;
|
||||
STATION_TYPE t = target.getEntry().getType();
|
||||
int planetLands = t != null && t.isPlanetary() ? 1 : 0;
|
||||
if (path != null){
|
||||
jumps = path.size();
|
||||
lands += path.getRefillCount();
|
||||
@@ -214,7 +217,7 @@ public class VendorsCrawler extends Crawler<Vendor> {
|
||||
} else {
|
||||
lands += isRefill() ? 1 :0;
|
||||
}
|
||||
return getScorer().getTime(target.getEntry().getDistance(), jumps, lands);
|
||||
return getScorer().getTime(target.getEntry().getDistance(), jumps, lands, planetLands);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,6 +19,7 @@ public class Profile {
|
||||
private double distanceTime;
|
||||
private double jumpTime;
|
||||
private double landingTime;
|
||||
private double orbitalTime;
|
||||
private double takeoffTime;
|
||||
private double rechargeTime;
|
||||
private double fuelPrice;
|
||||
@@ -33,6 +34,7 @@ public class Profile {
|
||||
distanceTime = 0.3;
|
||||
fuelPrice = 100;
|
||||
landingTime = 80;
|
||||
orbitalTime = 30;
|
||||
takeoffTime = 40;
|
||||
jumpTime = 32;
|
||||
rechargeTime = 12;
|
||||
@@ -50,6 +52,7 @@ public class Profile {
|
||||
this.distanceTime = profile.distanceTime;
|
||||
this.jumpTime = profile.jumpTime;
|
||||
this.landingTime = profile.landingTime;
|
||||
this.orbitalTime = profile.orbitalTime;
|
||||
this.takeoffTime = profile.takeoffTime;
|
||||
this.rechargeTime = profile.rechargeTime;
|
||||
this.fuelPrice = profile.fuelPrice;
|
||||
@@ -163,6 +166,14 @@ public class Profile {
|
||||
this.landingTime = landingTime;
|
||||
}
|
||||
|
||||
public double getOrbitalTime() {
|
||||
return orbitalTime;
|
||||
}
|
||||
|
||||
public void setOrbitalTime(double orbitalTime) {
|
||||
this.orbitalTime = orbitalTime;
|
||||
}
|
||||
|
||||
public double getTakeoffTime() {
|
||||
return takeoffTime;
|
||||
}
|
||||
@@ -222,6 +233,7 @@ public class Profile {
|
||||
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.setOrbitalTime(Double.valueOf(values.getProperty("profile.search.times.orbital", "30")));
|
||||
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")));
|
||||
@@ -241,6 +253,7 @@ public class Profile {
|
||||
values.setProperty("profile.search.fuel.price", String.valueOf(fuelPrice));
|
||||
values.setProperty("profile.search.times.distance", String.valueOf(distanceTime));
|
||||
values.setProperty("profile.search.times.landing", String.valueOf(landingTime));
|
||||
values.setProperty("profile.search.times.orbital", String.valueOf(orbitalTime));
|
||||
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));
|
||||
|
||||
@@ -38,10 +38,10 @@ public class ScorerTest extends Assert {
|
||||
|
||||
double avgProfit = scorer.getAvgProfit() * profile.getShip().getCargo();
|
||||
|
||||
double score = scorer.getScore(scorer.getAvgDistance(), 0, 1, 1, 4);
|
||||
double score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit/2, 1, 1, 4);
|
||||
double score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit*10, 1, 1, 4);
|
||||
double score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 4);
|
||||
double score = scorer.getScore(scorer.getAvgDistance(), 0, 1, 1, 0, 4);
|
||||
double score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit/2, 1, 1, 0, 4);
|
||||
double score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit*10, 1, 1, 0, 4);
|
||||
double score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 0, 4);
|
||||
|
||||
assertTrue(score < score1);
|
||||
assertTrue(score1 < score3);
|
||||
@@ -53,56 +53,56 @@ public class ScorerTest extends Assert {
|
||||
assertTrue(Math.abs(score2/score3) >= 10);
|
||||
|
||||
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 0, 1, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 2, 1, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 0, 1, 0, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 0, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 2, 1, 0, 4);
|
||||
assertTrue(score1 > score2);
|
||||
assertTrue(score2 > score3);
|
||||
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 2, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 3, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 0, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 2, 0, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 3, 0, 4);
|
||||
assertTrue(score1 > score2);
|
||||
assertTrue(score2 > score3);
|
||||
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 3);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 5);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 0, 3);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 0, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 0, 5);
|
||||
assertTrue(score1 > score2);
|
||||
assertTrue(score2 > score3);
|
||||
|
||||
score = scorer.getScore(0, avgProfit, 1, 1, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance()/2, avgProfit, 1, 1, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance()*2, avgProfit, 1, 1, 4);
|
||||
score = scorer.getScore(0, avgProfit, 1, 1, 0, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance()/2, avgProfit, 1, 1, 0, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 1, 1, 0, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance()*2, avgProfit, 1, 1, 0, 4);
|
||||
assertTrue(score > score1);
|
||||
assertTrue(score1 > score2);
|
||||
assertTrue(score2 > score3);
|
||||
|
||||
score1 = scorer.getScore(700, avgProfit, 1, 1, 4);
|
||||
score2 = scorer.getScore(2800, avgProfit*1.2, 1, 1, 4);
|
||||
score3 = scorer.getScore(2800, avgProfit*1.5, 1, 1, 4);
|
||||
score1 = scorer.getScore(700, avgProfit, 1, 1, 0, 4);
|
||||
score2 = scorer.getScore(2800, avgProfit*1.2, 1, 1, 0, 4);
|
||||
score3 = scorer.getScore(2800, avgProfit*1.5, 1, 1, 0, 4);
|
||||
assertTrue(score1 > score2);
|
||||
assertTrue(score3 > score1);
|
||||
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit/2, 0, 1, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit*2, 1, 1, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit*4, 0, 1, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit/2, 0, 1, 0, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit*2, 1, 1, 0, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit*4, 0, 1, 0, 4);
|
||||
assertTrue(score2 > score1);
|
||||
assertTrue(score3 > score2);
|
||||
|
||||
score = scorer.getScore(scorer.getAvgDistance(), avgProfit, 2, 2, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit*1.2, 8, 2, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 8, 2, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit*1.4, 8, 2, 4);
|
||||
score = scorer.getScore(scorer.getAvgDistance(), avgProfit, 2, 2, 0, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit*1.2, 8, 2, 0, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 8, 2, 0, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit*1.4, 8, 2, 0, 4);
|
||||
assertTrue(score > score1);
|
||||
assertTrue(score > score2);
|
||||
assertTrue(score < score3);
|
||||
|
||||
score = scorer.getScore(scorer.getAvgDistance(), avgProfit, 4, 2, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit*1.8, 4, 4, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 4, 4, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit*2.1, 4, 4, 4);
|
||||
score = scorer.getScore(scorer.getAvgDistance(), avgProfit, 4, 2, 0, 4);
|
||||
score1 = scorer.getScore(scorer.getAvgDistance(), avgProfit*1.8, 4, 4, 0, 4);
|
||||
score2 = scorer.getScore(scorer.getAvgDistance(), avgProfit, 4, 4, 0, 4);
|
||||
score3 = scorer.getScore(scorer.getAvgDistance(), avgProfit*2.1, 4, 4, 0, 4);
|
||||
assertTrue(score >= score1);
|
||||
assertTrue(score > score2);
|
||||
assertTrue(score < score3);
|
||||
|
||||
Reference in New Issue
Block a user