当前位置: 首页 > 知识库问答 >
问题:

使用背包变体的最优MLB阵容

张子墨
2023-03-14

我正在写一个程序,以找到最好的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};
};

我是在犯一个公然的错误,我只是没有看到,还是我的逻辑完全错误?

共有1个答案

袁良弼
2023-03-14

你在检查solutionSet对吗?接受位置的逻辑不包括在背包逻辑中,这意味着solutionSet是背包解决方案顶部的过滤器。您确实到达了正确的背包解决方案,但是因为在解决方案的顶部,您正在检查位置是否已经被填满,所以从solutionSet中删除了一些项目(争夺相同位置的项目),并且总重量减少了。

 类似资料:
  • 我正在开发一个程序来解决0/1背包问题的变体。 原始问题如下所述:https://en.wikipedia.org/wiki/Knapsack_problem.如果将来链接丢失,我会给你一个0/1背包问题的摘要(如果你熟悉它,跳过这一段):假设我们有项,每个项都有重量和值。我们想把物品放在一个袋子里,这个袋子支持最大重量,这样袋子里的总价值是最大的,而不会加重袋子的重量。项目不能有多个实例(即,我

  • 我试图解决一个优化问题,它非常类似于背包问题,但不能用动态规划来解决。我想解决的问题与这个问题非常相似:

  • 我正在为即将到来的测试复习,想知道是否有人能重述问题的b部分。这是从分发的复习表中得到的文本,但我不确定b部分到底在问什么。我更直截了当地猜测“生成一个不到0/1背包问题最优值1%的解”是什么意思。 b)[10pts]举了一个有两个对象的例子,说明对分数背包问题使用的相同的贪婪方法(略加修改,如果贪婪方法选择的最后一个对象不适合,则忽略它)得到的解不到0/1背包问题最优解的1%。

  • 我必须解决一个很像最大子数组问题的问题。我必须找到平均值大于k的最大子数组。我以为下面这招。我可以将大小为n的数组a[]转换为B[],其中B[I]=a[I]-K。所以现在平均值一定>0。但是平均值大于零并不意味着总和大于零?所以我可以直接应用Kadane的算法。我说的对吗?(总是在有1个正值的约束下)

  • 我应该如何尽可能有效地实现这个算法?贪婪的选择不起作用,所以我是否应该修改原始的动态编程解决方案来适应这个问题?如果是,怎么做? 如果有关系的话,我打算用Java写这个。

  • 我有一个场景,我需要一些帮助来制定问题,这样我才能正确地实施优化方法。我希望有人能给我一些指导,表面上看起来很简单,但我很难弄清楚如何正确编码变量、约束等。 情况是这样的: 需要将多个物品放入箱子/背包中 例: 每个项目有两个值的向量: 项目=[[7,6],[14,2],[27,23],[5,15]] 箱子/背包的向量,第一个值为物品第一个值可接受的上限。第二个值相同,但适用于箱子/背包中每个物品