diff --git a/aicrowd.json b/aicrowd.json index c7c8e156dea73d2a09246fd32a0a379744a42011..fae008f5d9dde9ddfa218d3d2ae47573fe80e426 100644 --- a/aicrowd.json +++ b/aicrowd.json @@ -3,6 +3,6 @@ "grader_id": "aicrowd_flatland_challenge_2019", "authors": ["mugurelionut"], "description": "Flatland Challenge Agent - various techniques.", - "debug" : false + "debug" : true } diff --git a/r2sol-old.cc b/r2sol-old.cc index 7ae3f3484157a4116d89a1a57d527e4396e5a56b..20f210bdd70ac9a58926b6b22ed6ef3cee13afbe 100644 --- a/r2sol-old.cc +++ b/r2sol-old.cc @@ -893,36 +893,33 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere assert(0 <= t && t <= T); assert(can_reach[t][node][o] == can_reach_idx); if (ct1 != can_reach_with_t1[t][node][o]) continue; + if (/*best_node == target_node &&*/ t + dmin_aid[node][o] > TMIN) break; + if (t > T) continue; - if (best_node == target_node && t + dmin_aid[node][o] > TMIN) break; - if (t > TMIN || t > T) continue; - - if (t == T && (best_node < 0 || (best_node >= 0 && best_node != target_node && best_t1 < ct1))) { + /*if (t == T && (best_node < 0 || (best_node >= 0 && best_node != target_node && best_t1 < ct1))) { TMIN = t; best_node = node; best_o = o; best_t1 = ct1; - //assert(false); - } + }*/ // Case 1: Wait. - if (t + 1 < TMIN && CanEnterCell(aid, t + 1, node, node, covered_by, is_covered, is_covered_idx, tmp_path) && + if (t + 1 <= TMIN && t + 1 <= T && CanEnterCell(aid, t + 1, node, node, covered_by, is_covered, is_covered_idx, tmp_path) && (can_reach[t + 1][node][o] != can_reach_idx || can_reach_with_t1[t + 1][node][o] < ct1) && (agent_aid.inside_poz || t > ct1)) { - can_reach[t + 1][node][o] = can_reach_idx; - can_reach_with_t1[t + 1][node][o] = ct1; - auto& new_prev = prev[t + 1][node][o]; - new_prev.t = t; - new_prev.node = node; - new_prev.o = o; - new_prev.type = WAITED; - const int est_tmin = t + 1 + dmin_aid[node][o]; - if ((t + 1 <= T && best_node != target_node) || est_tmin <= TMIN) InsertIntoHeap(h, hsize, t + 1, node, o, ct1, est_tmin); - } - - if (t + cturns > TMIN) continue; + can_reach[t + 1][node][o] = can_reach_idx; + can_reach_with_t1[t + 1][node][o] = ct1; + auto& new_prev = prev[t + 1][node][o]; + new_prev.t = t; + new_prev.node = node; + new_prev.o = o; + new_prev.type = WAITED; + const int est_tmin = t + 1 + dmin_aid[node][o]; + if (best_node != target_node || est_tmin <= TMIN) InsertIntoHeap(h, hsize, t + 1, node, o, ct1, est_tmin); + } const int tarrive_node2 = t + cturns; + if (tarrive_node2 > TMIN || tarrive_node2 > T) continue; if (!IsFreeTimeWindow(aid, t + 1, tarrive_node2 - 1, node, covered_by, is_covered, is_covered_idx, tmp_path)) continue; // Case 2: Move. @@ -942,7 +939,7 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere new_prev.o = o; new_prev.type = STARTED_MOVING; const int est_tmin = tarrive_node2 + dmin_aid[node2][onext]; - if ((tarrive_node2 <= T && best_node != target_node) || est_tmin <= TMIN) InsertIntoHeap(h, hsize, tarrive_node2, node2, onext, ct1, est_tmin); + if (best_node != target_node || est_tmin <= TMIN) InsertIntoHeap(h, hsize, tarrive_node2, node2, onext, ct1, est_tmin); } else { can_reach[tarrive_node2][node2][onext] = can_reach_idx; can_reach_with_t1[tarrive_node2][node2][onext] = ct1; diff --git a/r2sol.cc b/r2sol.cc index 20f210bdd70ac9a58926b6b22ed6ef3cee13afbe..9a08fde60fee5a7e030aa12ee7f4a10a8d4caffb 100644 --- a/r2sol.cc +++ b/r2sol.cc @@ -31,7 +31,7 @@ using namespace std; #define NMAX 201 #define MAXNODES 3000 #define TMAX 2567 -#define MAX_NUM_THREADS 1//4 +#define MAX_NUM_THREADS 1//3//4 #define MAX_CTURNS 5 #define INF 1000000000 #define ZERO 0.000001 @@ -232,8 +232,10 @@ void RepopulateVisitingOrders() { } } -int covered_by[MAX_NUM_THREADS][TMAX][MAXNODES], is_covered[MAX_NUM_THREADS][TMAX][MAXNODES], is_covered_idx[MAX_NUM_THREADS], can_reach_idx[MAX_NUM_THREADS], can_reach[MAX_NUM_THREADS][TMAX][MAXNODES][4], can_reach_with_t1[MAX_NUM_THREADS][TMAX][MAXNODES][4]; -int tmax_at_poz_node[MAX_NUM_THREADS][NMAX]; +short int covered_by[MAX_NUM_THREADS][TMAX][MAXNODES]; +int is_covered[MAX_NUM_THREADS][TMAX][MAXNODES], is_covered_idx[MAX_NUM_THREADS], can_reach_idx[MAX_NUM_THREADS], can_reach[MAX_NUM_THREADS][TMAX][MAXNODES][4]; +short int can_reach_with_t1[MAX_NUM_THREADS][TMAX][MAXNODES][4]; +short int tmax_at_poz_node[MAX_NUM_THREADS][NMAX]; void CheckAgent(int aid) { auto& agent_aid = agent[aid]; @@ -536,17 +538,19 @@ void ComputeShortestPaths() { } Xor128 xor128[MAX_NUM_THREADS]; -int perm[MAX_NUM_THREADS][NMAX]; +short int perm[MAX_NUM_THREADS][NMAX]; char pused[MAX_NUM_THREADS][NMAX]; +#define MAX_HEAP_SIZE 100000 + struct HeapElement { - int t, node, t1, est_tmin; + short int t, node, t1, est_tmin; char o; bool IsSmaller(const HeapElement& other) const { return est_tmin < other.est_tmin || (est_tmin == other.est_tmin && t1 > other.t1); } -} heap[MAX_NUM_THREADS][TMAX * MAXNODES * 4]; +} heap[MAX_NUM_THREADS][/*TMAX * MAXNODES * 4*/MAX_HEAP_SIZE]; int heap_size[MAX_NUM_THREADS]; @@ -604,6 +608,7 @@ inline void PushDown(HeapElement h[], int& hsize, int poz) { } inline void InsertIntoHeap(HeapElement h[], int& hsize, int t, int node, int o, int t1, int est_tmin) { + assert(hsize< MAX_HEAP_SIZE); auto& new_element = h[++hsize]; new_element.t = t; new_element.node = node; @@ -628,7 +633,7 @@ struct Path tmp_path[MAX_NUM_THREADS][NMAX], tmp_path2[MAX_NUM_THREADS][NMAX]; mutex m; struct PrevState { - int node, t; + short int node, t; char o; HowIGotHere type; } prev[MAX_NUM_THREADS][TMAX][MAXNODES][4]; @@ -692,7 +697,7 @@ void RecomputeCheckpoints() { } } -bool CanEnterCell(int aid, int t, int from, int to, const int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, const Path tmp_path[]) { +bool CanEnterCell(int aid, int t, int from, int to, const short int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, const Path tmp_path[]) { assert(t > TINIT); assert(0 <= to && to < nnodes); const auto& agent_aid = agent[aid]; @@ -736,21 +741,21 @@ bool CanEnterCell(int aid, int t, int from, int to, const int covered_by[][MAXNO return true; } -inline bool IsFreeTimeWindow(int aid, int t1, int t2, int node, const int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, const Path tmp_path[]) { +inline bool IsFreeTimeWindow(int aid, int t1, int t2, int node, const short int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, const Path tmp_path[]) { for (int t = t1; t <= t2; ++t) if (!CanEnterCell(aid, t, node, node, covered_by, is_covered, is_covered_idx, tmp_path)) return false; return true; } int tend_ongoing_move[NMAX]; -bool OverlapsOngoingMove(int t1, int t2, int node, const int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, const Path tmp_path[], int tmax_at_poz_node[]) { +bool OverlapsOngoingMove(int t1, int t2, int node, const short int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, const Path tmp_path[], short int tmax_at_poz_node[]) { if (!USE_SPACING_TO_AVOID_DEADLOCKS) return false; - if (t1 < tend_ongoing_move[node]) return true; - //if (t2 <= tend_ongoing_move[node]) return true; + //***if (t1 < tend_ongoing_move[node]) return true; + if (t2 <= tend_ongoing_move[node]) return true; - const int min_tstart = t2;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? t2 : t1; - //const int min_tstart = t1;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? t2 : t1; + //***const int min_tstart = t2;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? t2 : t1; + const int min_tstart = t1;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? t2 : t1; const int aid_t1 = is_covered[t1][node] == is_covered_idx ? covered_by[t1][node] : -1; @@ -803,7 +808,7 @@ bool OverlapsOngoingMove(int t1, int t2, int node, const int covered_by[][MAXNOD return false; } -bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, int can_reach[][MAXNODES][4], int& can_reach_idx, int can_reach_with_t1[][MAXNODES][4], HeapElement h[], int& hsize, PrevState prev[][MAXNODES][4], Path tmp_path[], Path* tmp_path2, int tmax_at_poz_node[]) { +bool FindBestPath(int aid, const short int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, int can_reach[][MAXNODES][4], int& can_reach_idx, short int can_reach_with_t1[][MAXNODES][4], HeapElement h[], int& hsize, PrevState prev[][MAXNODES][4], Path tmp_path[], Path* tmp_path2, short int tmax_at_poz_node[]) { const auto& agent_aid = agent[aid]; auto& tmp_path_aid = tmp_path[aid]; @@ -886,22 +891,15 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere int TMIN = T + 1, best_o = -1, best_node = -1, best_t1 = -1; if (tmp_path_aid.tmax < TINIT || tmp_path_aid.p[tmp_path_aid.tmax].node == agent_aid.target_node) TMIN = tmp_path_aid.tmax; - + while (hsize >= 1) { int t, node, o, ct1; ExtractMinFromHeap(h, hsize, t, node, o, ct1); assert(0 <= t && t <= T); assert(can_reach[t][node][o] == can_reach_idx); if (ct1 != can_reach_with_t1[t][node][o]) continue; - if (/*best_node == target_node &&*/ t + dmin_aid[node][o] > TMIN) break; - if (t > T) continue; - - /*if (t == T && (best_node < 0 || (best_node >= 0 && best_node != target_node && best_t1 < ct1))) { - TMIN = t; - best_node = node; - best_o = o; - best_t1 = ct1; - }*/ + const auto& curr_dmin_aid = dmin_aid[node][o]; + if (t + curr_dmin_aid > TMIN) break; // Case 1: Wait. if (t + 1 <= TMIN && t + 1 <= T && CanEnterCell(aid, t + 1, node, node, covered_by, is_covered, is_covered_idx, tmp_path) && @@ -1047,7 +1045,7 @@ int rerun; vector<pair<int, int>> shpaths_sorted; -void CoverPath(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { +void CoverPath(int aid, const Path& path, short int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { const auto& agent_aid = agent[aid]; for (int t = TINIT; t <= path.tmax; ++t) { const auto& path_elem = path.p[t]; @@ -1059,7 +1057,7 @@ void CoverPath(int aid, const Path& path, int covered_by[][MAXNODES], int is_cov } } -void UncoverPath(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { +void UncoverPath(int aid, const Path& path, short int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { const auto& agent_aid = agent[aid]; for (int t = TINIT; t <= path.tmax; ++t) { const auto& path_elem = path.p[t]; @@ -1070,7 +1068,7 @@ void UncoverPath(int aid, const Path& path, int covered_by[][MAXNODES], int is_c } } -void CoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { +void CoverPath1(int aid, const Path& path, short int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { const auto& agent_aid = agent[aid]; if (!agent_aid.inside_poz) return; for (int t = TINIT; t <= T; ++t) { @@ -1080,7 +1078,7 @@ void CoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_co } } -void UncoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { +void UncoverPath1(int aid, const Path& path, short int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { const auto& agent_aid = agent[aid]; if (!agent_aid.inside_poz) return; for (int t = TINIT; t <= T; ++t) { @@ -1089,7 +1087,7 @@ void UncoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_ } } -bool RunConsistencyChecks(Path path[], const int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, bool crash_on_error = true) { +bool RunConsistencyChecks(Path path[], const short int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, bool crash_on_error = true) { for (int aid = 0; aid < N; ++aid) { const auto& agent_aid = agent[aid]; if (agent_aid.status == DONE_REMOVED) continue; @@ -2335,8 +2333,8 @@ void GetMoves(const char* testid, bool replay_mode = false) { ReinitDataStructures(); ComputeShortestPaths(); } - SCORE_EXPONENT1 = 2.0;//2.0; - SCORE_EXPONENT2 = 4.0;//3.0; + SCORE_EXPONENT1 = 2.0; + SCORE_EXPONENT2 = 4.0; DBG(2, "testid=%s TINIT=%d: resc=%d nda=%d npl=%d\n", testid, TINIT, reschedule, num_done_agents, num_planned); if (reschedule) { if (TINIT >= MIN_TINIT_FOR_SAVE_DATA_FOR_REPLAY) SaveDataForReplay(testid); diff --git a/r2sol.exe b/r2sol.exe deleted file mode 100755 index 2cfca4c12a2f7749ec74179eef1cf436a5521965..0000000000000000000000000000000000000000 Binary files a/r2sol.exe and /dev/null differ diff --git a/run.sh b/run.sh index adcbcbb8d195c84e80246eb43a107c21edd8c6a8..e9b6c3a351dd3828d1ff9df3f2f2910f5bc00825 100755 --- a/run.sh +++ b/run.sh @@ -6,8 +6,8 @@ python setup.py build_ext cp -f build/lib.linux-x86_64-3.7/_r2sol.cpython-37m-x86_64-linux-gnu.so ./_r2sol.so rm -f -r build -python run.py -#python run_local.py +#python run.py +python run_local.py rm -f -r __pycache__ rm -f _r2sol.so diff --git a/run_local.py b/run_local.py index 7bea0246b30c3ba83a7a2b8218f0190edbf601d8..c784b2e4b6f2fe4ac50f1895e85901973779d0eb 100644 --- a/run_local.py +++ b/run_local.py @@ -26,7 +26,7 @@ def GetTestParams(tid): def ShouldRunTest(tid): #return tid >= 22 - #return tid >= 1 + #return tid >= 6 return True DEFAULT_SPEED_RATIO_MAP = {1.: 0.25, diff --git a/scores.txt b/scores.txt index 93e592743fcd99193b5b91a8a3e2255834b095c2..6e50c96b02f58c3212414c157fae247213768756 100644 --- a/scores.txt +++ b/scores.txt @@ -1,71 +1,54 @@ -0 107 79.2592592593 -52253.3333333783 79.2592592593 0.7407407407 -1 98 70.0000000000 -43813.6666666879 74.6296296296 -0.3439153439 -2 57 47.1074380165 -46015.0833333573 65.4555657586 1.9745798534 -3 80 100.0000000000 -12641.1666666695 74.0916743189 1.4809348900 -4 97 62.5806451613 -94266.6666665390 71.7894684874 0.9266833959 -5 120 91.6030534351 -49427.9166666963 75.0917326454 0.2633303108 -6 134 77.4566473988 -69347.5833333812 75.4295776101 0.3082880781 -7 77 56.6176470588 -47386.2500000265 73.0780862912 -0.9251008728 -8 78 65.0000000000 -43703.3333333540 72.1805211478 -1.7482378129 -9 66 43.1372549020 -77183.6666666561 69.2761945232 -1.3773356002 -10 86 51.1904761905 -93239.4999999266 67.6320383111 -0.9815605023 -11 94 90.3846153846 -17857.5833333366 69.5280864006 -0.8196355887 -12 65 59.0909090909 -50743.5833333633 68.7252266075 -0.8265167672 -13 121 76.1006289308 -54317.4166667216 69.2520410592 -0.4979380763 -14 73 59.3495934959 -70854.1666666939 68.5918778883 -1.0609481666 -15 78 41.0526315789 -144834.5833332693 66.8706749940 -1.1920073272 -16 39 34.8214285714 -84546.9166666405 64.9854252044 -1.5420573164 -17 90 62.5000000000 -60058.3333333910 64.8473460264 -1.6107084531 -18 86 46.7391304348 -65792.9166667310 63.8942820479 -1.3543096100 -19 70 87.5000000000 -29605.7499999869 65.0745679455 -1.5990941295 -20 117 89.3129770992 -41680.7500000037 66.2287779052 -1.5229467900 -21 86 71.6666666667 -47557.5000000121 66.4759546671 -1.5673582996 -22 59 53.1531531532 -60402.3333333834 65.8967024273 -1.4600426822 -23 140 85.8895705521 -60829.0000000624 66.7297385992 -1.2202709651 -24 78 97.5000000000 -22534.4166666619 67.9605490552 -1.1214601265 -25 73 38.6243386243 -110503.9999998534 66.8322332694 -1.1597271261 -26 100 100.0000000000 -30430.6666666492 68.0606690743 -0.9686261214 -27 114 79.7202797203 -47854.1666666946 68.4770837402 -0.7592071566 -28 157 84.4086021505 -80125.0833333066 69.0264464440 -0.7701058345 -29 115 77.1812080537 -42055.4166666740 69.2982718310 -0.7668070047 -30 65 46.4285714286 -74360.7500000019 68.5605395599 -0.6959883455 -31 73 45.6250000000 -105455.8333332199 67.8438039487 -0.6547074597 -32 94 79.6610169492 -29424.5833333177 68.2019013123 -0.6862289081 -33 108 78.2608695652 -52800.6666667034 68.4977533198 -0.7299843238 -34 94 57.3170731707 -82580.5833332968 68.1783053155 -0.5523332038 -35 55 28.9473684211 -111816.4999998949 67.0885570685 -0.6100900300 -36 80 100.0000000000 -13770.9166666695 67.9780555261 -0.5936011102 -37 115 69.6969696970 -61363.2500000610 68.0232901095 -0.6098779550 -38 111 57.5129533679 -81642.9999999582 67.7537942956 -0.5410980367 -39 45 37.1900826446 -78943.8333333228 66.9897015043 -0.7548433130 -40 88 72.1311475410 -44856.1666666890 67.1151026272 -0.7564245037 -41 98 59.7560975610 -71466.9166666873 66.9398882209 -0.7238963942 -42 137 90.7284768212 -70315.1666667072 67.4931112116 -0.7070615943 -43 73 60.8333333333 -60773.0833333870 67.3417526234 -0.8803859520 -44 103 85.8333333333 -53733.9166667133 67.7526766392 -0.9534144123 -45 106 67.5159235669 -48753.3333333658 67.7475298333 -0.7942222131 -46 100 100.0000000000 -28320.2499999840 68.4337526028 -0.7773238682 -47 64 44.7552447552 -73679.7500000149 67.9404503560 -0.6882857981 -48 112 60.2150537634 -90551.3333332425 67.7827892010 -0.6413227568 -49 101 77.6923076923 -37641.6666666650 67.9809795708 -0.5977270709 -50 87 46.7741935484 -105831.9999998672 67.5651602371 -0.5754650811 -51 160 97.5609756098 -58274.7500000625 68.1420028404 -0.5292202085 -52 109 68.9873417722 -64424.4166667400 68.1579526315 -0.4356428508 -53 104 79.3893129771 -48585.2500000365 68.3659407861 -0.3710302959 -54 83 66.9354838710 -57931.6666667261 68.3399324785 -0.3202960208 -55 90 57.6923076923 -84169.8333332827 68.1497963216 -0.2573420167 -56 41 51.2500000000 -37359.4166666658 67.8533086669 -0.0554588234 -57 113 63.1284916201 -86557.7499999206 67.7718463040 -0.0448705814 -58 46 46.0000000000 -60018.7500000442 67.4028319599 0.0067373946 -59 49 43.3628318584 -69878.8333333615 67.0021652915 -0.0818704705 -60 80 100.0000000000 -13421.6666666696 67.5431134015 -0.0805283317 -61 50 62.5000000000 -44936.7500000187 67.4617728628 0.0215769640 -62 63 58.8785046729 -31723.6666666487 67.3255305105 -0.0084347160 -63 51 31.8750000000 -120561.6666665172 66.7716159713 0.0014627014 -64 95 95.0000000000 -36285.5833333243 67.2058988025 -0.0447136479 -65 115 63.1868131868 -82509.1666666177 67.1450035659 -0.0440361683 -66 115 65.3409090909 -93240.4999998991 67.1180767827 -0.0942608660 -67 126 100.0000000000 -31547.9166666512 67.6016344771 -0.0812033416 -68 66 64.7058823529 -55811.0833333807 67.5596670550 -0.0658178996 -69 107 77.5362318841 -70951.0833333741 67.7021894097 -0.0338217432 -70 88 75.2136752137 -31255.4999999870 67.8079849844 -0.0694595013 +0 102 75.5555555556 -51384.6666667085 75.5555555556 -3.7037037037 +1 101 72.1428571429 -44279.0833333557 73.8492063492 -0.7804232804 +2 62 51.2396694215 -45595.1666666892 66.3126940400 0.8571282814 +3 80 100.0000000000 -12318.5833333360 74.7345205300 0.6428462110 +4 97 62.5806451613 -94641.2499998699 72.3037454562 0.5142769688 +5 126 96.1832061069 -49405.1666666975 76.2836555647 1.1919229193 +6 139 80.3468208092 -68151.1666667239 76.8641077425 1.4345301323 +7 81 59.5588235294 -49230.0833333614 74.7009472158 1.6228609246 +8 82 68.3333333333 -42990.5833333507 73.9934345622 1.8129134145 +9 61 39.8692810458 -81413.9166666491 70.5810192106 1.3048246874 +10 88 52.3809523810 -89825.7499999358 68.9264676806 1.2944293695 +11 94 90.3846153846 -18878.1666666677 70.7146466559 1.1865602554 +12 66 60.0000000000 -50541.7500000279 69.8904430670 1.1652164595 +13 126 79.2452830189 -51728.7500000456 70.5586459207 1.3066048615 +14 82 66.6666666667 -62608.2500000501 70.2991806371 1.7073027488 +15 75 39.4736842105 -149457.8333333194 68.3725871105 1.5019121165 +16 52 46.4285714286 -74806.8333333342 67.0817626586 2.0963374542 +17 92 63.8888888889 -59564.4166667197 66.9043807825 2.0570347561 +18 83 45.1086956522 -69024.5000000381 65.7572394598 1.8629574120 +19 71 88.7500000000 -29238.3333333200 66.9068774869 1.8323095414 +20 119 90.8396946565 -42166.5833333397 68.0465354473 1.8177575421 +21 87 72.5000000000 -49046.5000000158 68.2489656543 1.7730109872 +22 58 52.2522522523 -62205.1666667190 67.5534563759 1.6567539486 +23 137 84.0490797546 -60176.1666667275 68.2407740167 1.5110354175 +24 77 96.2500000000 -24370.4166666586 69.3611430560 1.4005940008 +25 74 39.1534391534 -107857.1666665281 68.1993082905 1.3670750211 +26 99 99.0000000000 -29221.1666666502 69.3400746501 1.2794055759 +27 118 82.5174825175 -46693.9166666926 69.8106963597 1.3336126195 +28 161 86.5591397849 -78452.5833333157 70.3882288916 1.3617824476 +29 119 79.8657718121 -40604.8333333353 70.7041469889 1.4058751580 +30 69 49.2857142857 -73988.6666666694 70.0132298050 1.4526902450 +31 73 45.6250000000 -99882.2499998835 69.2510976236 1.4072936749 +32 98 83.0508474576 -30137.6666666502 69.6692718610 1.4673705486 +33 101 73.1884057971 -53247.4166667075 69.7727758003 1.2750224805 +34 95 57.9268292683 -79776.4999999762 69.4343201851 1.2560148695 +35 61 32.1052631579 -109100.9999998965 68.3974019343 1.3088448658 +36 80 100.0000000000 -13493.2500000027 69.2515262064 1.2734706803 +37 120 72.7272727273 -57431.4166667199 69.3429932201 1.3197031105 +38 110 56.9948186528 -83643.8333332821 69.0263733594 1.2725790637 +39 56 46.2809917355 -73298.2500000089 68.4577388188 1.4680373144 +40 91 74.5901639344 -43542.5833333524 68.6073101631 1.4922075359 +41 113 68.9024390244 -66333.2500000611 68.6143370407 1.6744488198 +42 140 92.7152317881 -64370.5833334068 69.1748229651 1.6817117535 +43 85 70.8333333333 -54558.1666667066 69.2125163825 1.8707637591 +44 102 85.0000000000 -53846.9166667108 69.5633493518 1.8106727126 +45 103 65.6050955414 -50596.2500000367 69.4773003559 1.7297705226 +46 99 99.0000000000 -28941.2499999832 70.1054429015 1.6716902988 +47 67 46.8531468531 -71856.8333333540 69.6210200672 1.6805697112 +48 116 62.3655913978 -88261.4166665949 69.4729500944 1.6901608933 +49 96 73.8461538462 -37788.4999999978 69.5604141694 1.5794345986 +50 76 40.8602150538 -103273.2499998744 68.9976651671 1.4325049301 +51 159 96.9512195122 -61544.9166667373 69.5352335199 1.3932306795 +52 116 73.4177215190 -60106.3333333990 69.6084880105 1.4505353789 +53 107 81.6793893130 -45915.8333333617 69.8320232198 1.4660824337 diff --git a/tmp-scores.txt b/tmp-scores.txt index 8c327cec8a541f704b025470e27b65486d5378ac..0e4c8a289416e998025ba7222c05c5a80ede1d63 100644 --- a/tmp-scores.txt +++ b/tmp-scores.txt @@ -1,23 +1,2 @@ -0 102 75.5555555556 -51384.6666667085 75.5555555556 -3.7037037037 -1 101 72.1428571429 -44279.0833333557 73.8492063492 -0.7804232804 -2 62 51.2396694215 -45595.1666666892 66.3126940400 0.8571282814 -3 80 100.0000000000 -12318.5833333360 74.7345205300 0.6428462110 -4 97 62.5806451613 -94641.2499998699 72.3037454562 0.5142769688 -5 126 96.1832061069 -49405.1666666975 76.2836555647 1.1919229193 -6 139 80.3468208092 -68151.1666667239 76.8641077425 1.4345301323 -7 81 59.5588235294 -49230.0833333614 74.7009472158 1.6228609246 -8 82 68.3333333333 -42990.5833333507 73.9934345622 1.8129134145 -9 61 39.8692810458 -81413.9166666491 70.5810192106 1.3048246874 -10 88 52.3809523810 -89825.7499999358 68.9264676806 1.2944293695 -11 94 90.3846153846 -18878.1666666677 70.7146466559 1.1865602554 -12 66 60.0000000000 -50541.7500000279 69.8904430670 1.1652164595 -13 126 79.2452830189 -51728.7500000456 70.5586459207 1.3066048615 -14 82 66.6666666667 -62608.2500000501 70.2991806371 1.7073027488 -15 75 39.4736842105 -149457.8333333194 68.3725871105 1.5019121165 -16 52 46.4285714286 -74806.8333333342 67.0817626586 2.0963374542 -17 92 63.8888888889 -59564.4166667197 66.9043807825 2.0570347561 -18 83 45.1086956522 -69024.5000000381 65.7572394598 1.8629574120 -19 71 88.7500000000 -29238.3333333200 66.9068774869 1.8323095414 -20 119 90.8396946565 -42166.5833333397 68.0465354473 1.8177575421 -21 87 72.5000000000 -49046.5000000158 68.2489656543 1.7730109872 -22 58 52.2522522523 -62205.1666667190 67.5534563759 1.6567539486 +0 105 77.7777777778 -54551.6666667190 3 2.2222222222 2.2222222222 +1 106 75.7142857143 -42933.5833333511 5 3.5714285714 2.8968253968