Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用背包变量的最佳MLB阵容_Javascript_Multidimensional Array_Knapsack Problem - Fatal编程技术网

Javascript 使用背包变量的最佳MLB阵容

Javascript 使用背包变量的最佳MLB阵容,javascript,multidimensional-array,knapsack-problem,Javascript,Multidimensional Array,Knapsack Problem,我正在写一个程序,以找到最好的可能的MLB阵容使用背包解决方案。为此,我传入球员数据,该数据包含球员计算值和工资。就背包问题而言,薪水将是我的“砝码” 我的问题不是选择球员,而是选择最佳阵容。我正在选择一名投手、一名中锋、一垒手、二垒手、三垒手、短停和三名外野手。我可以成功地做到这一切。我希望我的“体重”是36000,但我目前只选择了一个总体重为21000的阵容 这是我的背包密码: CalculateLineUp.prototype.findOptimalLineUp = function(da

我正在写一个程序,以找到最好的可能的MLB阵容使用背包解决方案。为此,我传入球员数据,该数据包含球员计算值和工资。就背包问题而言,薪水将是我的“砝码”

我的问题不是选择球员,而是选择最佳阵容。我正在选择一名投手、一名中锋、一垒手、二垒手、三垒手、短停和三名外野手。我可以成功地做到这一切。我希望我的“体重”是36000,但我目前只选择了一个总体重为21000的阵容

这是我的背包密码:

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,并且我希望矩阵的末尾根据数据的排序方式保持最低的权重。这似乎是解决方案的路径,所以我将接受您的答案。谢谢