Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
R-具有约束的数据帧的组合_R - Fatal编程技术网

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

R-具有约束的数据帧的组合,r,R,我正在尝试为幻想足球制作一个R脚本(正确的英国足球,而不是手蛋:-),在这里我可以在csv中输入一个球员列表,它将吐出每11名球员的组合,满足各种限制 以下是我的示例数据帧: df <- read.csv("Filename.csv", header = TRUE) > print(df) Name Positon Team Salary 1 Eric Dier

我正在尝试为幻想足球制作一个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
df打印(df)
姓名职位团队薪酬
1埃里克·迪尔D总计9300000
2 Erik Pieters D STO 9200000
3基督教徒福斯D雷9100000
4 Héctor Bellerín D ARS 9000000
5 Charlie Daniels D BOU 9000000
6 Ben Davies D总计8900000
7费德里科·费尔南德斯德斯瓦8800000
每默特萨克8800000德国马克8英镑
9阿尔贝托·莫雷诺里夫8700000
10 Chris Smalling D MUN 8700000
11谢默斯·科尔曼D伊夫8700000
1月12日Vertonghen D总计8700000
13罗梅鲁·卢卡库F EVE 12700000
14哈里·凯恩F总计12500000
15最大等级F BOU 11900000
16 Alexis Sánchez F ARS 11300000
17杰米·瓦迪F雷11200000
18西奥·沃尔科特F ARS 10700000
19 Olivier Giroud F ARS 10700000
20 Wilfried Bony F MCI 10000000
21克里斯托弗·诺德费尔德G SWA 7000000
22乔·哈特G MCI 6800000
23杰克·罗斯G WBA 6600000
24阿斯米尔·贝戈维奇G车6600000
25梅苏特奥西里马尔斯1560000
26 Riyad Mahrez M LEI 15200000
27罗斯·巴克利M伊夫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名球员的总工资不得超过100000000

2) 一个队最多只能有四名队员。例如,“切”(切尔西)的四名球员

3) 每个11人阵容中每个位置可以有多少人是有限制的。可以有:

1个G(守门员),3-4个D(后卫),3-5米(中场),1-3个F(前锋)

我希望所有符合上述限制的11人组合都能被退回。顺序并不重要(例如,1,2,3被认为与2,1,3相同,不应重复),一名球员可以出现在多个阵容中

我做了不少研究,到处玩,但似乎没什么进展。我是R的新手。我不希望有人能帮我解决这个问题,但如果有人能为我这样的新手指出正确的方向,我将不胜感激


谢谢。

这可以使用LPSolve库作为线性整数规划来解决。 这类问题是可以很好地解决的——与以前所写的相反——因为解决方案的数量通常比域大小小得多

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

该软件包可以使用

 install.packages("lpSolve")
 install.packages("lpSolveAPI")
文件可在以下网址找到:

参与者的第一约束和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)
库(lpSolve)

df解决这个问题的一种蛮力方法(它也可以很好地并行化,并保证你所有可能的组合)是计算所有11个玩家的排列,然后逐步过滤出不符合你限制的组合

为了让这样的程序适合你的计算机内存,给每个玩家一个唯一的整数ID,并创建ID向量作为团队集合。然后,当您实现过滤器时,您的函数可以在单个数据帧中通过该ID引用播放器信息

假设
df
是包含所有玩家数据的数据帧

df$id <- 1:nrow(df)

df$id您为每个约束尝试了什么?代码在哪里?我不知道你的csv文件中有多少玩家,但希望你能意识到,不管顺序如何,从31件事情中选择所有可能的11件,可以让你测试84672315种组合。这里没有简单的出路。您必须根据您的规范构建构建团队的算法,我认为任何库在这里都没有特别的帮助。@kliron:作者描述的问题是一个经典的约束满足问题。这些问题在人工智能中很常见。答案的第一部分假设问题是使用butte force技术解决的。第二部分指向正确的方向。事实上,可以使用任何CSP解算器来解决这些问题,CSP解算器可以进行某种巧妙的解决方案构造。幸运的是,有很多算法和库。第一:基于搜索的算法,我不会在R中实现/期望。第二种算法将问题转化为优化问题,基本上是一组线性方程。请参阅下面我的评论。感谢LPSolve的提示,我不知道这个库。现在这个答案是正确的,它更多的是一个评论而不是一个答案。@Jaap:问题作者明确写道:我不希望有人帮我解决这个问题,因此我只给出了方向。现在好多了!(+1)谢谢你的回复,伙计。我没有使用LPSolve的经验,因此可能需要进行一些阅读
# This will take a long time or run out of memory!
# In my 2.8Gz laptop took 466 seconds just for your 31 players
teams <- combn(df$id, 11)