From 01422903688c153437cf6368a58fde42b3125efd Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 17 Oct 2009 15:25:42 +0100 Subject: [PATCH 1/1] routesearch: permit approxiation by disregarding trivial trades --- yarrg/rscommon.h | 2 +- yarrg/rsmain.c | 4 +++- yarrg/rsvalue.c | 36 ++++++++++++++++++++++++++---------- yarrg/web/query_routesearch | 1 + 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/yarrg/rscommon.h b/yarrg/rscommon.h index 66e36d9..216fec3 100644 --- a/yarrg/rscommon.h +++ b/yarrg/rscommon.h @@ -135,7 +135,7 @@ void search(int start_isle, int final_isle /* -1 means any */, extern double max_mass, max_volu, max_capi; extern double distance_loss_factor_per_league; -extern int max_dist; +extern int max_dist, min_trade_maxprofit; #define LOSS_FACTOR_PER_DELAY_SLOT (1-1e-8) diff --git a/yarrg/rsmain.c b/yarrg/rsmain.c index f99f866..2a172c9 100644 --- a/yarrg/rsmain.c +++ b/yarrg/rsmain.c @@ -7,7 +7,7 @@ int o_quiet= 0; double max_mass=-1, max_volu=-1, max_capi=-1; double distance_loss_factor_per_league; -int max_dist= -1; +int max_dist=-1, min_trade_maxprofit=0; FILE *debug_file; FILE *output; @@ -90,6 +90,8 @@ int main(int argc, const char **argv) { double loss_per_league= atof(*argv++); distance_loss_factor_per_league= 1.0 - loss_per_league; + min_trade_maxprofit= atoi(*argv++); + setup_sql(database); setup_value(); setup_search(); diff --git a/yarrg/rsvalue.c b/yarrg/rsvalue.c index 22b3d29..d3ffeeb 100644 --- a/yarrg/rsvalue.c +++ b/yarrg/rsvalue.c @@ -62,18 +62,22 @@ static void add_constraint(int row, double coefficient) { constraint_coeffs[nconstraint_rows]= coefficient; } -static void avail_c(const Trade *t, IslandTradeEnd **trades, - int price, const char *srcdst, - int islandid, sqlite3_stmt *ss_ite) { - /* find row number of trade availability constraint */ +static IslandTradeEnd *get_ite(const Trade *t, IslandTradeEnd **trades, + int price) { IslandTradeEnd *search; - + for (search= *trades; search; search=search->next) if (search->commodid==t->commodid && search->price==price) - goto found; + return search; abort(); - - found:; +} + +static void avail_c(const Trade *t, IslandTradeEnd *ite, + int price, const char *srcdst, + int islandid, sqlite3_stmt *ss_ite) { + /* find row number of trade availability constraint */ + IslandTradeEnd *search= ite; + if (search->generation != generation) { search->rownum= lpx_add_rows(lp, 1); lpx_set_row_bnds(lp, search->rownum, LPX_UP, 0, search->qty); @@ -255,10 +259,22 @@ double value_route(int nislands, const int *islands, int exclude_arbitrage) { debugf(" TRADE i%d#%d..i%d#%d c%d %d-%d ", si,s, di,d, t->commodid, t->src_price, t->dst_price); + IslandTradeEnd + *src_ite= get_ite(t, &itradeends[si].src, t->src_price), + *dst_ite= get_ite(t, &itradeends[di].dst, t->dst_price); + + int qty= src_ite->qty < dst_ite->qty ? src_ite->qty : dst_ite->qty; + int maxprofit= qty * (t->dst_price - t->src_price); + debugf("maxprofit=%d ",maxprofit); + if (maxprofit < min_trade_maxprofit) { + debugf("trivial\n"); + continue; + } + nconstraint_rows=0; - avail_c(t, &itradeends[si].src, t->src_price, "src", si,ss_ite_sell); - avail_c(t, &itradeends[di].dst, t->dst_price, "dst", di,ss_ite_buy); + avail_c(t, src_ite, t->src_price, "src", si,ss_ite_sell); + avail_c(t, dst_ite, t->dst_price, "dst", di,ss_ite_buy); int leg; for (leg=s; leg{LossPerLeaguePct} ? $routeparams->{LossPerLeaguePct}*0.01 : 1e-9; +push @rsargs, '0'; push @rsargs, 'search',$maxdist, $maxcountea,$maxcountea, 'any', @islandids; m/[^-.0-9a-zA-Z]/ and die "$_ $& ?" foreach @rsargs; -- 2.30.2