具有多个输入变量的Excel解算器

时间:2014-01-09 15:25:14

标签: excel excel-vba solver vba

我有一张Excel表格,其中包含体育运动员名单,他们的位置,分配给这些球员的薪水以及预计的积分数。

我目前正在使用求解器创建最佳的体育运动员群体,并且可以通过某些位置限制并在预定义的工资帽内。

在我的具体示例中,不同的玩家位置是:PG,SG,SF,PF,C,G和F.注意G可以是PG或SG,而F可以是SF或PF。

此解算器目前正在运行,但在某些情况下,玩家可能有多个位置。因此,例如,玩家A可以用作SF或SG。

有没有办法在解算器功能中考虑到这一点,以便有问题的玩家可以在任何一个插槽中使用?

为了帮助解释,我将提供一些正在使用的数据的示例。以下是播放器列表的一小部分示例:

Position Player             Salary     Game                Points   Pos 1   Pos 2
PF/C    Kevin Love          $10,400     Pho@Min 09:30PM ET  53.17    PF      C
PG/SG   Stephen Curry       $10,000     GS@Bkn 07:30PM ET   47.50    PG      SG
SG/SF   James Harden        $9,500  LAL@Hou 08:00PM ET  41.13    SG      SF 
PF/C    LaMarcus Aldridge   $9,500  Orl@Por 10:00PM ET  45.22    PF      C
PF/C    Anthony Davis       $9,200  Was@NO 08:00PM ET   42.97    PF      C
PF/C    Blake Griffin       $9,000  Bos@LAC 10:30PM ET  42.66    PF      C
PG      John Wall           $8,900  Was@NO 08:00PM ET   42.09    PG
PF/C    Dwight Howard       $8,700  LAL@Hou 08:00PM ET  41.19    PF      C
SG/SF   Paul George         $8,600  Ind@Atl 07:30PM ET  40.06    SG      SF
PF      Paul Millsap        $8,400  Ind@Atl 07:30PM ET  37.96    PF
PF/C    Al Horford          $8,300  Ind@Atl 07:30PM ET  37.33    PF      C

为了解决G和F问题,我有一个列出了“选定”玩家的列表,该列表中每个都有最小值/最大值。所以在这个例子中我需要1个PG,1个SG和1个G.所以我有一个PG列,最小值为1,最大值为2,SG列的最小值为1,最大值为2,G值为G列,将PG / SG加在一起,最小值为3,最大值为3.然后,求解器条件的一部分是所有最小值/最大值必须匹配。

我已将第一列拆分为POS1和POS2以分隔两个可能的位置,但我无法弄清楚如何将两者都包含在求解器函数中。对于像Kevin Love这样的球员,我希望解算器考虑到他可以被置于PF,F或C位置。

以下是该表:

    PG  SG  SF  PF  C   G   F   Ttl
Min 1   1   1   1   1   3   3   8
Max 3   3   3   3   2   4   4   8
Cur 1   3   1   2   1   4   3   8

例如,Solver标准是:

Sum of Salary <= Salary Cap (50000)
PG Cur >= PG Min
Repeat for all Min
PG Cur <= PG Max
Repeat for all Max
Maximize Points

最后,这是一个解决方案的例子:

PG   Stephen Curry    $10,000     47.5
SG   James Harden     $9,500      41.13
SF   Paul George      $8,600      40.06
PF   Dwight Howard    $8,700      41.19
C    Blake Griffin    $9,000      42.66
G    John Wall        $8,900      42.09
F    Al Horford       $8,300      37.33
Total                 $63,000     292.5

每个玩家都适合他们的位置,因为他们的两个位置中的一个(POS1或POS2)符合标准。显然总数不合适,所以这不是一个可行的解决方案,但它只是一个例子。

希望我已经提供了足够的细节,但如果没有,请告诉我,我将很乐意进一步解释。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的问题仍然有点模糊,因为您的薪资上限为50,000美元,但您显示的是63,000美元的玩家。

假设:
  1.你需要5名玩家,因为那是玩家数量,以及让你的玩家名单低于$ 50,000的团队的唯一途径。这可能是幻想箍,你想要7或8,但解决方案应该仍然适用于8个选项更广泛的选项和更低的工资。   2.我还假设这里没有VBA,因为你没有提供任何VBA,或者至少没有一个需要调整。

我的解决方案(仍处于测试阶段)是将Pos1和Pos2的/(或等效的VBA)抛向位置编号的文本(即1 = PG,2 = SG等)。

接下来,=concatenate(Pos1, Pos2)使得PG为11,PG / SG为12等(在这种情况下,“G”也是11,这可能会给我的逻辑带来一个小故障)。 / p>

使用Min / Max / Cur值更改位置表如下所示:

Pos.    | PG | G  | PG/SG | SG | SG/SF | SF/PF | F  | PF | PF/C | C  
--------------------------------------------------------------------  
Pos1    | 1  | 1  | 1     | 2  | 2     | 3     | 3  | 4  | 4    | 5  
Pos2    | 1  | 2  | 2     | 2  | 3     | 4     | 4  | 4  | 5    | 5  
PosNbr  | 11 | 12 | 12    | 22 | 23    | 34    | 34 | 44 | 45   | 55  
--------------------------------------------------------------------  
Min     | 1  | 3  | 3     | 1  |       | 3     | 4  | 1  |      | 1  
Max     | 3  | 4  | 4     | 3  |       | 4     | 4  | 3  |      | 2  
Curr    | 1  | 1  | 1     | 0  | 0     | 0     | 0  | 0  | 3    | 0  

(值是我自己的。)