当前位置:  开发笔记 > 编程语言 > 正文

R - 具有约束的数据帧的组合

如何解决《R-具有约束的数据帧的组合》经验,为你挑选了1个好方法。

我正在尝试制作幻想足球的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人阵容的总薪水不能超过100,000,000

2)一支球队最多只能有四名球员.例如来自'CHE'(切尔西)的四名球员.

3)每个11位玩家阵容中有多少玩家可以从每个位置获得限制.可以有:

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

我希望每个符合上述约束的11名球员组合都能被退回.顺序并不重要(例如1,2,3被认为与2,1,3相同且不应重复)并且玩家可以出现在多个阵容中.

我已经做了很多研究并玩了一下,但似乎无法随心所欲.我是R的新手.我不希望有人为我指出这一点,但如果有人能指出像我这样的新手正确的方向,那将非常感激.

谢谢.



1> CAFEBABE..:

这可以使用库L​​PSolve作为线性整数程序来解决.这种问题可以很好地解决 - 与之前编写的相反 - 因为典型的解决方案的数量远小于域大小.

您可以为每个玩家添加一个零变量,无论该玩家是否在团队中.

可以使用安装包

 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)

我没有添加Team Constraint,因为它不会提供任何额外的见解....

**EDIT2**如果您更改数据集,这可能会派上用场 .L lpsolve binary找到所有可能的解决方案


@Jaap:作者明确写道:我不希望有人为我指出这个问题,因此我只给出了指示.
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有