Bitburner: Automation for Hacknet Nodes

Full Automation for Hacknet nodes that is looking for the most profitable upgrade and choosing it.

How it works

Algorithm is looking for the most profitable ratio.

Ratio = Production growth divided by Upgrade Cost
Production growth = Production after upgrade divided by Current production

I recommend you to pass bigger loop iteration time (e.g. 100 000) or leave the default to let hacknet nodes collect more money so that they can compare more upgrades instead of constantly upgrading the cheapest one.

Usage

Step-by-step

  1. Open the terminal
  2. Type “nano hacknet-bot.ns” to create a file
  3. Clear the file and paste the code below there
  4. Save the file
  5. Go back to the terminal
  6. Type “run hacknet-bot.ns” to run a script

You can define a loop frequency time by passing an additional script argument
e.g. “run hacknet-bot.ns 10000”

Default loop freq. is 60 000 ms = 1 min.

You can also copy the code from https://www.paste.org/121034.

Code

/** @param {NS} ns **/
export const main = async ns => {
	// helpers
	const getMoney = () => ns.getPlayer().money;
	const getProduction = (level, ram, cores) => (level * 1.5) * Math.pow(1.035, ram - 1) * ((cores + 5) / 6);
 
	// loop interval passed as a script parameter, default interval is 60 000ms
	const interval = ns.args[0] || 60000;
 
	// main loop
	while (true) {
		// loop through all hacknet nodes
		for (var index = 0; index < await ns.hacknet.numNodes(); index++) { // your current money const money = getMoney(); // your production multiplier from installed augmentations const prodMultiplier = await ns.getHacknetMultipliers().production; // get current node stats const nodeStats = await ns.hacknet.getNodeStats(index); const curRam = nodeStats.ram; const curLevel = nodeStats.level; const curCores = nodeStats.cores; const curProd = nodeStats.production; // get costs of upgrades const ramUpgradeCost = await ns.hacknet.getRamUpgradeCost(index); const levelUpgradeCost = await ns.hacknet.getLevelUpgradeCost(index); const coreUpgradeCost = await ns.hacknet.getCoreUpgradeCost(index); // check upgrades profitability and if you have enough money // UPGRADE RATIO = production growth after upgrade / current production const prodGrowthAfterLevelUpgrade = (getProduction(curLevel + 1, curRam, curCores) * prodMultiplier) - curProd; const levelUpgradeRatio = money >= await levelUpgradeCost 
				? prodGrowthAfterLevelUpgrade / await levelUpgradeCost
				: 0;
 
			const prodGrowthAfterRamUpgrade = (getProduction(curLevel, curRam * 2, curCores) * prodMultiplier) - curProd;
			const ramUpgradeRatio = money >= await ramUpgradeCost
				? prodGrowthAfterRamUpgrade / await ramUpgradeCost
				: 0;
 
			const prodGrowthAfterCoresUpgrade = (getProduction(curLevel, curRam, curCores + 1) * prodMultiplier) - curProd;
			const coresUpgradeRatio = money >= await coreUpgradeCost 
				? prodGrowthAfterCoresUpgrade / await coreUpgradeCost
				: 0;
 
			// check if you have enough money for any upgrade
			const ratios = [levelUpgradeRatio, ramUpgradeRatio, coresUpgradeRatio];
			if (ratios.every(ratio => ratio === 0)) {
				continue;
			}
 
			// find the most profitability upgrade
			const mostProfitUpgrade = Math.max(...ratios);
			const mostProfitUpgradeIndex = ratios.findIndex(ratio => ratio === mostProfitUpgrade);
 
			// execute the most profitability upgrade
			switch (mostProfitUpgradeIndex) {
				case 0:
					await ns.hacknet.upgradeLevel(index, 1);
					break;	
				case 1:
					await ns.hacknet.upgradeRam(index, 1);
					break;	
				case 2:
					await ns.hacknet.upgradeCore(index, 1);
					break;
				default:
					continue;
			}
		}
 
		// check if you can buy new node machine
		if (getMoney() > await ns.hacknet.getPurchaseNodeCost()) {
			await ns.hacknet.purchaseNode();
		}
		
		// sleep to prevent crash because of infinite loop
		await ns.sleep(interval);
	}
}

By syw1

More Guides:

Be the first to comment

Leave a Reply

Your email address will not be published.


*