Javascript 使用背包变量的最佳MLB阵容
我正在写一个程序,以找到最好的可能的MLB阵容使用背包解决方案。为此,我传入球员数据,该数据包含球员计算值和工资。就背包问题而言,薪水将是我的“砝码” 我的问题不是选择球员,而是选择最佳阵容。我正在选择一名投手、一名中锋、一垒手、二垒手、三垒手、短停和三名外野手。我可以成功地做到这一切。我希望我的“体重”是36000,但我目前只选择了一个总体重为21000的阵容 这是我的背包密码:Javascript 使用背包变量的最佳MLB阵容,javascript,multidimensional-array,knapsack-problem,Javascript,Multidimensional Array,Knapsack Problem,我正在写一个程序,以找到最好的可能的MLB阵容使用背包解决方案。为此,我传入球员数据,该数据包含球员计算值和工资。就背包问题而言,薪水将是我的“砝码” 我的问题不是选择球员,而是选择最佳阵容。我正在选择一名投手、一名中锋、一垒手、二垒手、三垒手、短停和三名外野手。我可以成功地做到这一切。我希望我的“体重”是36000,但我目前只选择了一个总体重为21000的阵容 这是我的背包密码: CalculateLineUp.prototype.findOptimalLineUp = function(da
CalculateLineUp.prototype.findOptimalLineUp = function(data, capacity) {
var items = data.data;
var idxItem = 0,
idxCapSpace = 0,
idxPosition = 0,
oldMax = 0,
newMax = 0,
numItems = items.length,
weightMatrix = new Array(numItems+1),
keepMatrix = new Array(numItems+1),
positionArray = new Array("P", "C", "1B", "2B", "3B", "SS", "OF", "OF", "OF"),
solutionSet = [];
// Setup matrices
for(idxItem = 0; idxItem < numItems + 1; idxItem++){
weightMatrix[idxItem] = new Array(capacity+1);
keepMatrix[idxItem] = new Array(capacity+1);
}
// Build weightMatrix from [0][0] -> [numItems-1][capacity-1]
for (idxItem = 0; idxItem <= numItems; idxItem++){
for (idxCapSpace = 0; idxCapSpace <= capacity; idxCapSpace++){
// Fill top row and left column with zeros
if (idxItem === 0 || idxCapSpace === 0){
weightMatrix[idxItem][idxCapSpace] = 0;
}
// If item will fit, decide if there's greater value in keeping it,
// or leaving it
else if (items[idxItem-1]["Salary"] <= idxCapSpace){
newMax = items[idxItem-1]["Value"] + weightMatrix[idxItem-1][idxCapSpace-items[idxItem-1]["Salary"]];
oldMax = weightMatrix[idxItem-1][idxCapSpace];
// Update the matrices
if(newMax > oldMax ){
weightMatrix[idxItem][idxCapSpace] = newMax;
keepMatrix[idxItem][idxCapSpace] = 1;
}
else{
weightMatrix[idxItem][idxCapSpace] = oldMax;
keepMatrix[idxItem][idxCapSpace] = 0;
}
}
//Else, item can't fit; value and weight are the same as before
//else
//weightMatrix[idxItem][idxCapSpace] = weightMatrix[idxItem-1][idxCapSpace];
}
}
// Traverse through keepMatrix ([numItems][capacity] -> [1][?])
// to create solutionSet
idxCapSpace = capacity;
idxItem = numItems;
for(idxItem; idxItem < capacity; idxItem--){
if(keepMatrix[idxItem][idxCapSpace] === 1 && !this.filledAllPositions(items[idxItem - 1]["Position"])){
solutionSet.push(items[idxItem - 1]);
idxCapSpace = idxCapSpace - items[idxItem - 1]["Salary"];
}
}
return {"maxValue": weightMatrix[numItems][capacity], "set": solutionSet};
};
CalculateLineUp.prototype.findOptimalLineUp=函数(数据、容量){
var项目=数据。数据;
var idxItem=0,
idxCapSpace=0,
idxPosition=0,
oldMax=0,
newMax=0,
numItems=items.length,
权重矩阵=新数组(numItems+1),
keepMatrix=新阵列(numItems+1),
位置数组=新数组(“P”、“C”、“1B”、“2B”、“3B”、“SS”、“OF”、“OF”、“OF”),
溶液集=[];
//设置矩阵
对于(idxItem=0;idxItem[numItems-1][capacity-1]构建权重矩阵
对于(idxItem=0;idxItem[1][?])
//创建解决方案集的步骤
idxCapSpace=容量;
idxItem=numItems;
对于(idxItem;idxItem<容量;idxItem--){
if(keepMatrix[idxItem][idxCapSpace]==1&&!this.filledAllPositions(items[idxItem-1][“Position”])){
解决方案集推送(项[idxItem-1]);
idxCapSpace=idxCapSpace-items[idxItem-1][“工资”];
}
}
返回{“maxValue”:权重矩阵[numItems][capacity],“set”:solutionSet};
};
我是否犯了一个我根本看不到的明显错误,或者我的逻辑完全错了?您正在检查解决方案集,对吗?接受位置的逻辑不包括在背包逻辑中,这意味着solutionSet是背包解决方案顶部的过滤器。您确实找到了正确的背包解决方案,但因为在解决方案的顶部,您正在检查该位置是否已填充,一些项目已从解决方案集中删除(为同一位置战斗的项目),并且总重量减少 你能分享一些样本数据吗?还有可能是一把小提琴?谢谢,我会在几小时后回家检查,看看在过滤器之前设置的解决方案是否有更多的最优值。这是有意义的,因为我正在向后遍历keepMatrix,并且我希望矩阵的末尾根据数据的排序方式保持最低的权重。这似乎是解决方案的路径,所以我将接受您的答案。谢谢