improve and refactor scheduling logic.
[?]
Apr 20, 2020, 4:02 PM
4ACCU75NFJ4ZD5CMHBBYCFLBWL2XQH4RS65FTR4JDJPBHTABYJZACDependencies
- [2]
NQ22FUSWadd more options to `main.js`. update `README.md`. - [3]
BZ6FC2BTadd `cp.js`. - [4]
3TYF4BJStarget only hackable servers. replace servers continually. - [5]
6MBUKAG6remove unneeded functions and comments. update readme. - [6]
EYKBOK3Ooptimised the scheduling logic by ensuring that cycles start and finish at minimum security of target. - [7]
2LU5Y77Ofixed optimum percentage to steal calculator. - [8]
2BKHJI2Sinit - [9]
CJBGAILAadd optional `--target` parameter for `main.js`. update `README.md`. - [10]
VHWFHMNW2nd attempt to fix percentage to steal - [11]
VMXI7PS4added action cap. improved scoring system. fixed parts of security and cash predictors. made lshw loopable. - [12]
HHZNTFCTremove `-t` flag for `main.js` which conflicted with the same flag for the `run` command.
Change contents
- replacement in lib/lib.js at line 702
const string_job_decide = function(ns, string_server_target, float_server_target_security, float_server_target_cash) {const string_job_decider_prepare = function(ns, string_server_target, float_server_target_security, float_server_target_cash) {if (float_server_target_security > ns.getServerMinSecurityLevel(string_server_target)) {return "weaken";}if (float_server_target_cash < ns.getServerMaxMoney(string_server_target)) {return "grow";}return "";};const string_job_decider = function(ns, string_server_target, float_server_target_security, float_server_target_cash) { - edit in lib/lib.js at line 768[3.7945]→[3.1576:1787](∅→∅),[3.1853]→[3.1853:3730](∅→∅),[3.3730]→[3.2874:2996](∅→∅),[3.2996]→[3.3849:5277](∅→∅),[3.3849]→[3.3849:5277](∅→∅)
};// weakens the target server. should be finished running before running main scheduleconst array_make_schedule_weaken = function(ns, integer_job_cap, float_padding_seconds, string_server_target_argument) {const object_scripts = object_get_constants(ns).object_scripts;const array_servers_rooted_sorted_by_ram = array_get_servers_rooted_sorted_by_ram(ns);let string_server_target = string_server_target_argument;if (string_server_target_argument === null) {string_server_target = string_get_server_rooted_hackable_with_score_biggest(ns);}const float_server_target_security_minimum = ns.getServerMinSecurityLevel(string_server_target);const float_time_weaken = float_get_time_weaken(ns, string_server_target, ns.getServerSecurityLevel(string_server_target));let float_server_target_security_current = ns.getServerSecurityLevel(string_server_target);let array_schedule_weaken = [];let integer_array_schedule_weaken_length = 0;// assumes weaken takes longestlet integer_time_job_finishes_seconds = float_time_weaken;// iterate through servers in reverse to use servers with the biggest rams firstfor (let integer_indices_0 = array_servers_rooted_sorted_by_ram.length - 1; integer_indices_0 >= 0; --integer_indices_0) {if (float_server_target_security_current <= float_server_target_security_minimum ||integer_array_schedule_weaken_length >= integer_job_cap) {break;}const string_server_used = array_servers_rooted_sorted_by_ram[integer_indices_0];let float_server_used_ram_free_current = float_get_server_ram_free(ns, string_server_used);while (float_server_target_security_current > float_server_target_security_minimum &&float_server_used_ram_free_current > 0 &&integer_array_schedule_weaken_length < integer_job_cap) {let schedule_item = {string_job: "weaken",string_server_used: string_server_used,string_server_target: string_server_target,float_server_target_security_before: float_server_target_security_current};if (!boolean_can_server_run_script_threads(ns, float_server_used_ram_free_current, object_scripts.weaken.ram, 1)) {// ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ramfloat_server_used_ram_free_current = 0;break;}const integer_threads_weaken = integer_get_threads_weaken(ns, float_server_used_ram_free_current, string_server_target, float_server_target_security_current);float_server_used_ram_free_current -= integer_threads_weaken * object_scripts.weaken.ram;const float_server_target_security_uncorrected = float_server_target_security_current - float_get_security_decrease_from_weaken(ns, integer_threads_weaken);if (float_server_target_security_uncorrected < float_server_target_security_minimum) {float_server_target_security_current = float_server_target_security_minimum;}else {float_server_target_security_current = float_server_target_security_uncorrected;}schedule_item.float_delay_seconds = integer_time_job_finishes_seconds - float_time_weaken + float_padding_seconds;integer_time_job_finishes_seconds += float_padding_seconds;schedule_item.integer_time_job_finishes_seconds = integer_time_job_finishes_seconds;schedule_item.integer_threads = integer_threads_weaken;array_schedule_weaken.push(schedule_item);++integer_array_schedule_weaken_length;break;}}return array_schedule_weaken; - replacement in lib/lib.js at line 770
// makes the actual weakening, growing and hacking scheduleconst array_make_schedule = function(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target_argument) {// makes a scheduleconst array_make_schedule = function(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target_argument, string_decider) { - edit in lib/lib.js at line 785
// tripwireslet boolean_end_loop_array_servers = false;let boolean_end_loop_server = false; - replacement in lib/lib.js at line 799
if (integer_array_schedule_length >= integer_job_cap) {if (integer_array_schedule_length >= integer_job_cap ||boolean_end_loop_array_servers) { - replacement in lib/lib.js at line 808
integer_array_schedule_length < integer_job_capinteger_array_schedule_length < integer_job_cap &&!boolean_end_loop_array_servers &&!boolean_end_loop_server - replacement in lib/lib.js at line 812
const string_job = string_job_decide(ns, string_server_target, float_server_target_security_current, float_server_target_cash_current);let schedule_item = {const string_job = string_decider(ns, string_server_target, float_server_target_security_current, float_server_target_cash_current);const schedule_item = { - edit in lib/lib.js at line 821
case "": {boolean_end_loop_array_servers = true;break;} - replacement in lib/lib.js at line 828
// ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ramfloat_server_used_ram_free_current = 0;// start using a server with more ramboolean_end_loop_server = true; - edit in lib/lib.js at line 844
schedule_item.float_server_target_security_current = float_server_target_security_current; - replacement in lib/lib.js at line 861
// ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ramfloat_server_used_ram_free_current = 0;// start using a server with more ramboolean_end_loop_server = true; - edit in lib/lib.js at line 881
schedule_item.float_server_target_security_current = float_server_target_security_current; - replacement in lib/lib.js at line 897
// ram of the currently used server isn't actually 0, we're just doing this to skip it and start using a server with more ramfloat_server_used_ram_free_current = 0;// start using a server with more ramboolean_end_loop_server = true; - edit in lib/lib.js at line 918
schedule_item.float_server_target_security_current = float_server_target_security_current; - replacement in lib/lib.js at line 940
if (boolean_have_not_seen_item_with_security_minimum === false) {if (!boolean_have_not_seen_item_with_security_minimum) { - replacement in lib/lib.js at line 944
if (object_job.float_server_target_security_before === float_server_target_security_minimum) {if (object_job.float_server_target_security_current === float_server_target_security_minimum) { - edit in lib/lib.js at line 946
array_schedule_edited.splice(integer_indices_1, 1); - edit in lib/lib.js at line 979
const void_schedule_runner = async function(ns, array_schedule) {for (let integer_indices_0 = 0; integer_indices_0 < array_schedule.length; ++integer_indices_0) {switch (array_schedule[integer_indices_0].string_job) {case "weaken": {await void_exec_script_weaken(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);break;}case "grow": {await void_exec_script_grow(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);break;}case "hack": {await void_exec_script_hack(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);break;}}}}; - replacement in lib/lib.js at line 998
// schedule runner. returns the the time it'll take to finish in milliseconds.export const void_schedule_runner = async function(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) {// returns the the time it'll take to finish in milliseconds.export const void_runner = async function(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) { - replacement in lib/lib.js at line 1013
// weaken target if necessary to reduce the time it takes to finish later jobsconst array_schedule_weaken = array_make_schedule_weaken(ns, integer_job_cap, float_padding_seconds, string_server_target);if (array_schedule_weaken.length >= 1) {for (let integer_indices_0 = 0; integer_indices_0 < array_schedule_weaken.length; ++integer_indices_0) {await void_exec_script_weaken(ns, array_schedule_weaken[integer_indices_0].string_server_used, array_schedule_weaken[integer_indices_0].string_server_target, array_schedule_weaken[integer_indices_0].integer_threads, array_schedule_weaken[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);// prepare the target if necessarywhile (true) {if (ns.getServerSecurityLevel(string_server_target) === ns.getServerMinSecurityLevel(string_server_target) &&ns.getServerMoneyAvailable(string_server_target) === ns.getServerMaxMoney(string_server_target)) { - replacement in lib/lib.js at line 1021[3.7155]→[3.7155:7311](∅→∅),[3.7311]→[3.3475:3621](∅→∅),[3.2824]→[3.3475:3621](∅→∅),[3.2260]→[3.3786731:3786831](∅→∅),[3.3621]→[3.3786731:3786831](∅→∅),[3.11279]→[3.3786731:3786831](∅→∅),[3.3786731]→[3.3786731:3786831](∅→∅),[3.3786831]→[3.3622:3682](∅→∅),[3.3682]→[3.3786894:3787879](∅→∅),[3.3786894]→[3.3786894:3787879](∅→∅)
await ns.sleep(array_schedule_weaken[array_schedule_weaken.length - 1].integer_time_job_finishes_seconds * 1000);}// make and run actual scheduleconst array_schedule = array_make_schedule(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target);for (let integer_indices_0 = 0; integer_indices_0 < array_schedule.length; ++integer_indices_0) {switch (array_schedule[integer_indices_0].string_job) {case "weaken": {await void_exec_script_weaken(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);break;}case "grow": {await void_exec_script_grow(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);break;}case "hack": {await void_exec_script_hack(ns, array_schedule[integer_indices_0].string_server_used, array_schedule[integer_indices_0].string_server_target, array_schedule[integer_indices_0].integer_threads, array_schedule[integer_indices_0].float_delay_seconds * 1000, integer_indices_0);break;}const array_schedule_prepare = array_make_schedule(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target, string_job_decider_prepare);if (array_schedule_prepare.length > 0) {await void_schedule_runner(ns, array_schedule_prepare);await ns.sleep(array_schedule_prepare[array_schedule_prepare.length - 1].integer_time_job_finishes_seconds * 1000); - edit in lib/lib.js at line 1027
// make and run actual hacking scheduleconst array_schedule = array_make_schedule(ns, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target, string_job_decider);await void_schedule_runner(ns, array_schedule); - replacement in bin/main.js at line 5
void_schedule_runnervoid_runner - replacement in bin/main.js at line 79
integer_time_finishes = await void_schedule_runner(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) + Date.now();integer_time_finishes = await void_runner(ns, string_servers_bought_name, integer_job_cap, float_precision, float_steal_cap, float_padding_seconds, string_server_target) + Date.now(); - replacement in README.md at line 32
* SERVER = The server that should be targetted by the `weaken`, `grow` and `hack` functions. Should be a string. Defaults to choosing an optimal target using a scroing system based on the server's maximum cash, growth, required hacking level, and the player's current hacking level.* SERVER = The server that should be targetted by the `weaken`, `grow` and `hack` functions. Should be a string. Defaults to choosing an optimal target using a scoring system based on the server's maximum cash, growth, required hacking level, and the player's current hacking level. - replacement in README.md at line 57
* Runs the script with up to 4000 jobs, targetting "harakiri-sushi" and stealing up to 50% of it's cash per `hack` job, whilst the remaining variables are set to defaults.* Runs the script with up to 4000 jobs, targetting "harakiri-sushi" and stealing only up to 50% of it's cash per "hack.js" job that finishes executing, whilst the remaining variables are set to defaults. - replacement in README.md at line 73
* Kills all scripts named `grow.js` and `hack.js` on any servers that they are currently running on.* Kills all scripts named "grow.js" and "hack.js" on any servers that they are currently running on.