R - 数据框与约束的组合

标签 r

我正在尝试为梦幻足球制作一个 R 脚本(真正的英国足球,而不是手蛋 :-)),我可以在其中输入 csv 中的球员列表,它会吐出每 11 名球员的组合,这满足各种约束。

这是我的示例数据框:

df <- read.csv("Filename.csv",
               header = TRUE)
    > print(df)
                       Name Positon Team   Salary
    1             Eric Dier       D  TOT  9300000
    2          Erik Pieters       D  STO  9200000
    3       Christian Fuchs       D  LEI  9100000
    4       Héctor Bellerín       D  ARS  9000000
    5       Charlie Daniels       D  BOU  9000000
    6            Ben Davies       D  TOT  8900000
    7    Federico Fernández       D  SWA  8800000
    8       Per Mertesacker       D  ARS  8800000
    9        Alberto Moreno       D  LIV  8700000
    10       Chris Smalling       D  MUN  8700000
    11       Seamus Coleman       D  EVE  8700000
    12       Jan Vertonghen       D  TOT  8700000
    13        Romelu Lukaku       F  EVE 12700000
    14           Harry Kane       F  TOT 12500000
    15           Max Gradel       F  BOU 11900000
    16       Alexis Sánchez       F  ARS 11300000
    17          Jamie Vardy       F  LEI 11200000
    18         Theo Walcott       F  ARS 10700000
    19       Olivier Giroud       F  ARS 10700000
    20        Wilfried Bony       F  MCI 10000000
    21 Kristoffer Nordfeldt       G  SWA  7000000
    22             Joe Hart       G  MCI  6800000
    23            Jack Rose       G  WBA  6600000
    24        Asmir Begovic       G  CHE  6600000
    25           Mesut Özil       M  ARS 15600000
    26         Riyad Mahrez       M  LEI 15200000
    27         Ross Barkley       M  EVE 13300000
    28        Dimitri Payet       M  WHM 12800000
    29              Willian       M  CHE 12500000
    30      Bertrand Traore       M  CHE 12500000
    31      Kevin De Bruyne       M  MCI 12400000

约束条件如下:

1)每个11人阵容总薪水不能超过1亿

2) 一支队伍最多只能有四名选手。例如。来自“CHE”(切尔西)的四名球员。

3) 每个 11 人阵容中每个位置的球员数量是有限制的。可以有:

1 G(守门员)、3 到 4 D(后卫)、3 到 5 M(中场)、1 到 3 F(前锋)

我希望返回满足上述限制条件的所有 11 个玩家组合。顺序并不重要(例如,1、2、3 被认为与 2、1、3 相同,不应重复)并且一名球员可以出现在多个阵容中。

我已经做了相当多的研究并尝试了一下,但似乎无法解决这个问题。我是 R 的新手。我不希望有人为我解决这个问题,但如果有人能为像我这样的新手指出正确的方向,我将不胜感激。

谢谢。

最佳答案

这可以使用库 LPSolve 求解为线性整数规划。 这种问题很容易解决——与之前写的相反——因为解决方案的数量通常比域大小小得多。

您可以为每个球员添加一个零一变量,无论该球员是否在球队中。

可以使用安装包

 install.packages("lpSolve")
 install.packages("lpSolveAPI")

文档可在以下位置找到:https://cran.r-project.org/web/packages/lpSolve/lpSolve.pdf

玩家11的第一个约束和

薪水基本上是所有球员变量乘以薪水列等的总和....

要获得正确的解决方案,您需要在

中指定
lp.solve(all.bin=TRUE

所有涉及玩家的变量不是零就是一。

(我知道你在努力学习,这就是为什么我不提供完整的解决方案)

编辑 因为我可能因为没有提供完整的解决方案而被否决。有点难过,因为原作者明确写道他不希望有一个完整的解决方案

library(lpSolve)

df <- read.csv("/tmp/football.csv",header = TRUE,sep=";")

f.obj <- rep(1,nrow(df))

f.con <- 
  matrix(c(f.obj <- rep(1,nrow(df)),
    as.vector(df$Salary),
    (df$Positon=="G") *1.0,
    (df$Positon=="D") *1.0,
    (df$Positon=="D") *1.0,
    (df$Positon=="M") *1.0,
    (df$Positon=="M") *1.0,
    (df$Positon=="F") *1.0,
    (df$Positon=="F") *1.0),nrow=9,byrow= TRUE)

f.dir <- c("==", "<=","==",">=","<=",">=","<=",">=","<=")

f.rhs<- c(11, #number players
       100000000, #salary
       1 , #Goalkeeper
       3 , # def min
       4 , # def max
       3 , # mdef min
       5,  # mdef max
       1,  # for, min
       3  # wor, max
       )



solutions <-   lp ("max", f.obj, f.con, f.dir, f.rhs,all.bin=TRUE)

我没有添加团队约束,因为它不会在这里提供任何额外的见解....

** 编辑2 ** 如果您更改数据集,这可能会派上用场 R lpsolve binary find all possible solutions

关于R - 数据框与约束的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480151/

相关文章:

r - 函数 : return assigned argument instead of variable name

r - 用于构建链接到分析的 R 包的 Makefile

r - R中的parent.frame()和parent.env()有什么区别;它们在引用调用方面有何不同?

r - 从R中的目录列表创建文件列表

r - 依赖于使用插入符号进行预处理的单个袋装树模型的预测

r - 将表格导出到 csv-在列表中分隔表格- Shiny

r - 如何使 ggplot 图例水平添加对象(相对于垂直)

r - 如何在绘图上以相同的顺序关联聚类标签和树状图

r - 如何使用 dplyr 在多个变量上获得 pmax?

r - 如何使我的 R 脚本可执行?