changed knapsack from sort to select n
This commit is contained in:
parent
b1fdca555f
commit
f4fa31cc8f
@ -48,7 +48,7 @@
|
|||||||
<li>
|
<li>
|
||||||
<label for="equip-load-budget">Equip Load Budget</label>
|
<label for="equip-load-budget">Equip Load Budget</label>
|
||||||
<input style="max-width: 50px" class="stat" id="equip-load-budget" type="number" value=0
|
<input style="max-width: 50px" class="stat" id="equip-load-budget" type="number" value=0
|
||||||
name="equip-load" disabled>
|
name="equip-load" lang="en" disabled>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
@ -15,6 +15,7 @@ var helmets;
|
|||||||
var chestpieces;
|
var chestpieces;
|
||||||
var gauntlets;
|
var gauntlets;
|
||||||
var leggings;
|
var leggings;
|
||||||
|
var selection;
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
// populate filter selects
|
// populate filter selects
|
||||||
@ -26,7 +27,7 @@ async function init() {
|
|||||||
update(true);
|
update(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function update(resort) {
|
async function update(reselect) {
|
||||||
// clamp equip load values to reasonable values
|
// clamp equip load values to reasonable values
|
||||||
[...document.getElementsByName("equip-load")].forEach(el => el.value = Math.max(el.value, 0.0));
|
[...document.getElementsByName("equip-load")].forEach(el => el.value = Math.max(el.value, 0.0));
|
||||||
|
|
||||||
@ -41,21 +42,22 @@ async function update(resort) {
|
|||||||
.filter(item => !item.id.startsWith("no-"));
|
.filter(item => !item.id.startsWith("no-"));
|
||||||
});
|
});
|
||||||
|
|
||||||
// if sort order has changed, sort equipment again
|
// get budget and sorting order
|
||||||
if (resort) {
|
let budget = equipLoadBudget();
|
||||||
|
document.getElementById("equip-load-budget").value = budget.toFixed(1);
|
||||||
|
|
||||||
|
// if selection has changed, sort equipment again
|
||||||
|
if (reselect) {
|
||||||
// pre-sort and eliminate some equipment
|
// pre-sort and eliminate some equipment
|
||||||
helmets = eliminate(await HELMETS, sortBy, lockedItems);
|
helmets = eliminate(await HELMETS, sortBy, lockedItems);
|
||||||
chestpieces = eliminate(await CHESTPIECES, sortBy, lockedItems);
|
chestpieces = eliminate(await CHESTPIECES, sortBy, lockedItems);
|
||||||
gauntlets = eliminate(await GAUNTLETS, sortBy, lockedItems);
|
gauntlets = eliminate(await GAUNTLETS, sortBy, lockedItems);
|
||||||
leggings = eliminate(await LEGGINGS, sortBy, lockedItems);
|
leggings = eliminate(await LEGGINGS, sortBy, lockedItems);
|
||||||
|
selection = permutations(budget, lockedItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get budget and sorting order
|
|
||||||
let budget = equipLoadBudget();
|
|
||||||
document.getElementById("equip-load-budget").value = budget.toFixed(1);
|
|
||||||
|
|
||||||
// find best set under budget
|
// find best set under budget
|
||||||
let best = knapSack(budget, sortBy, lockedItems);
|
let best = knapSack(sortBy);
|
||||||
|
|
||||||
// show best sets under budget
|
// show best sets under budget
|
||||||
Array.from(document.getElementsByClassName("sort-result")).forEach(elem => elem.parentNode.removeChild(elem));
|
Array.from(document.getElementsByClassName("sort-result")).forEach(elem => elem.parentNode.removeChild(elem));
|
||||||
@ -86,8 +88,8 @@ function eliminate(list, sortBy, lockedItems) {
|
|||||||
return approved;
|
return approved;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function knapSack(budget, sortBy, lockedItems) {
|
function permutations(budget, lockedItems) {
|
||||||
let permutations = helmets.flatMap(h => {
|
return helmets.flatMap(h => {
|
||||||
return chestpieces.flatMap(c => {
|
return chestpieces.flatMap(c => {
|
||||||
return gauntlets.flatMap(g => {
|
return gauntlets.flatMap(g => {
|
||||||
return leggings
|
return leggings
|
||||||
@ -97,10 +99,15 @@ async function knapSack(budget, sortBy, lockedItems) {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
permutations.sort((a, b) => setFitness(b, sortBy) - setFitness(a, sortBy));
|
async function knapSack(sortBy) {
|
||||||
|
return selection.reduce((best, set) => {
|
||||||
return permutations.slice(0, 3);
|
best.push(set);
|
||||||
|
best.sort((a, b) => setFitness(b, sortBy) - setFitness(a, sortBy));
|
||||||
|
best.pop();
|
||||||
|
return best;
|
||||||
|
}, selection.slice(0, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
const average = (item) => item.defenses.reduce((total, n) => total + n, 0);
|
const average = (item) => item.defenses.reduce((total, n) => total + n, 0);
|
||||||
@ -112,7 +119,7 @@ const poise = (item) => item.poise;
|
|||||||
function fitness(item, sortBy) {
|
function fitness(item, sortBy) {
|
||||||
switch (sortBy) {
|
switch (sortBy) {
|
||||||
case "sort-average":
|
case "sort-average":
|
||||||
break;
|
return average(item);
|
||||||
case "sort-physical":
|
case "sort-physical":
|
||||||
return physical(item);
|
return physical(item);
|
||||||
case "sort-elemental":
|
case "sort-elemental":
|
||||||
@ -188,13 +195,6 @@ async function populateResults(templateId, destinationId, sets) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const RESISTANCE_NAMES = [
|
|
||||||
"immunity",
|
|
||||||
"robustness",
|
|
||||||
"focus",
|
|
||||||
"vitality",
|
|
||||||
]
|
|
||||||
|
|
||||||
function itemStatsToString(item) {
|
function itemStatsToString(item) {
|
||||||
let weight = item.weight.toFixed(1) + " wgt., ";
|
let weight = item.weight.toFixed(1) + " wgt., ";
|
||||||
let poise = item.poise + " poise, ";
|
let poise = item.poise + " poise, ";
|
||||||
@ -202,7 +202,7 @@ function itemStatsToString(item) {
|
|||||||
let elemental = item.defenses.slice(4, 8).reduce((total, defense) => total + defense, 0.0).toFixed(1) + " elem. ";
|
let elemental = item.defenses.slice(4, 8).reduce((total, defense) => total + defense, 0.0).toFixed(1) + " elem. ";
|
||||||
// let physical = item.defenses.slice(0, 4).reduce((total, defense, i) => total + defense.toFixed(1) + " " + DEFENSE_NAMES[i] + ", ", 0.0);
|
// let physical = item.defenses.slice(0, 4).reduce((total, defense, i) => total + defense.toFixed(1) + " " + DEFENSE_NAMES[i] + ", ", 0.0);
|
||||||
// let elemental = item.defenses.slice(4, 8).reduce((total, defense, i) => total + defense.toFixed(1) + " " + DEFENSE_NAMES[i + 4] + ", ", "");
|
// let elemental = item.defenses.slice(4, 8).reduce((total, defense, i) => total + defense.toFixed(1) + " " + DEFENSE_NAMES[i + 4] + ", ", "");
|
||||||
let resistances = item.resistances.reduce((total, res, i) => total + res + " " + RESISTANCE_NAMES[i] + ", ", "");
|
let resistances = item.resistances.reduce((total, res, i) => total + res + " " + ["immunity", "robustness", "focus", "vitality"][i] + ", ", "");
|
||||||
|
|
||||||
return weight + poise + physical + elemental + "<br>" + resistances;
|
return weight + poise + physical + elemental + "<br>" + resistances;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user