Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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_Optimization_Constraints_Linear Programming - Fatal编程技术网

在R中使用线性(或非线性?)约束优化值

在R中使用线性(或非线性?)约束优化值,r,optimization,constraints,linear-programming,R,Optimization,Constraints,Linear Programming,考虑到不同的限制条件,我正在努力挑选最好的梦幻足球队。我的目标是挑选那些能够最大化他们的积分总和的球员 制约因素包括: 1) 该团队必须包括: -1 QB -2苏格兰皇家银行 -2 WRs -1 TE 2) 球员的风险不得超过6 3) 球员的费用总和不得超过300英镑 我该怎么做?R中优化这些约束的最佳包/函数是什么?在给定这些约束的情况下,函数调用如何最大化投影点?仅供参考,我将搜索100-300名玩家 提前谢谢!以下是一个小示例数据集: name <- c("Aaron Rodgers

考虑到不同的限制条件,我正在努力挑选最好的梦幻足球队。我的目标是挑选那些能够最大化他们的积分总和的球员

制约因素包括:

1) 该团队必须包括:

-1 QB

-2苏格兰皇家银行

-2 WRs

-1 TE

2) 球员的风险不得超过6

3) 球员的费用总和不得超过300英镑

我该怎么做?R中优化这些约束的最佳包/函数是什么?在给定这些约束的情况下,函数调用如何最大化投影点?仅供参考,我将搜索100-300名玩家

提前谢谢!以下是一个小示例数据集:

name <- c("Aaron Rodgers","Tom Brady","Arian Foster","Ray Rice","LeSean McCoy","Calvin Johnson","Larry Fitzgerald","Wes Welker","Rob Gronkowski","Jimmy Graham")

pos <- c("QB","QB","RB","RB","RB","WR","WR","WR","TE","TE")

pts <- c(167, 136, 195, 174, 144, 135, 89, 81, 114, 111) 

risk <- c(2.9, 3.4, 0.7, 1.1, 3.5, 5.0, 6.7, 4.7, 3.7, 8.8) 

cost <- c(60, 47, 63, 62, 40, 60, 50, 35, 40, 40) 

mydata <- data.frame(name, pos, pts, risk, cost) 

name您的约束和目标是线性的,但您的变量是二进制的:是否应该挑选每个玩家。所以你的问题比线性规划(LP)更一般,它是一个混合整数规划(MIP)。在CRAN's上,查找他们的MIP部分

CPLEX是一个商业解决方案,您可能无法访问,但GLPK是免费的。如果我是你,我可能会选择高级界面

这将需要你把你的问题在矩阵形式,我建议你看看文件和例子


编辑:以下是一个实现:

# We are going to solve:
# maximize f'x subject to A*x <dir> b
# where:
#   x is the variable to solve for: a vector of 0 or 1:
#     1 when the player is selected, 0 otherwise,
#   f is your objective vector,
#   A is a matrix, b a vector, and <dir> a vector of "<=", "==", or ">=",
#   defining your linear constraints.

# number of variables
num.players <- length(name)
# objective:
f <- pts
# the variable are booleans
var.types <- rep("B", num.players)
# the constraints
A <- rbind(as.numeric(pos == "QB"), # num QB
           as.numeric(pos == "RB"), # num RB
           as.numeric(pos == "WR"), # num WR
           as.numeric(pos == "TE"), # num TE
           diag(risk),              # player's risk
           cost)                    # total cost

dir <- c("==",
         "==",
         "==",
         "==",
         rep("<=", num.players),
         "<=")

b <- c(1,
       2,
       2,
       1,
       rep(6, num.players),
       300)

library(Rglpk)
sol <- Rglpk_solve_LP(obj = f, mat = A, dir = dir, rhs = b,
                      types = var.types, max = TRUE)
sol
# $optimum
# [1] 836                      ### <- the optimal total points

# $solution
#  [1] 1 0 1 0 1 1 0 1 1 0     ### <- a `1` for the selected players

# $status
# [1] 0                        ### <- an optimal solution has been found

# your dream team
name[sol$solution == 1]
# [1] "Aaron Rodgers"  "Arian Foster"   "LeSean McCoy"
# [4] "Calvin Johnson" "Wes Welker"     "Rob Gronkowski
#我们将解决:
#根据A*x b最大化f'x
#其中:
#x是要求解的变量:0或1的向量:
#选择玩家时为1,否则为0,
#f是你的目标向量,
#A是矩阵,b是向量,向量为“=”,
#定义线性约束。
#变量数

num.players欢迎加入SO.:-)你已经试过什么了?这是一个有趣的问题,但这里的人会希望看到你已经尝试了第一次把东西组装起来。在代码行的开头有4个空格,将其格式化为一个代码块。您是否计划搜索所有玩家?你想搜索多少玩家?例如,只有2*3*3*2=36个团队。但是如果有100名球员,那么可能会有20*20*(30*29/2)*(30*29)/2=7590000支球队。西蒙和赛斯,大家好,谢谢。我可以使用Excel的solver函数进行优化,但我不熟悉如何在R中进行线性优化。我看到有很多不同的函数,但我不确定哪一个函数与我的问题类型最相关,我没有在R中编写优化函数的参数的经验。任何帮助都将不胜感激。顺便说一下,我正在搜索大约100-300名玩家。这似乎是一个很好的例子:@dadrivr不要忘记接受弗洛德尔的回答,如果它充分解决了你的问题。您可以通过检查响应旁边的勾号来完成此操作。这是一种小小的“奖励”被调查者花时间帮助你的方式。这真的很好,也很有帮助。唯一似乎缺少的是约束,即玩家的成本总和应小于300。目前,解决方案的成本是320美元。似乎已为约束正确设置了“dir”和“b”矩阵,但“A”矩阵的最后一行未正确设置。我试着把它改为:diag(cost),但没有成功。我们希望它只反映选定球员的总数。如何修改矩阵的最后一行来实现这一点?非常感谢,这看起来棒极了@dadrivr:对不起,它现在是固定的,
A
的最后一行需要是
cost
。最终成本是
sum(成本*sol$solution)
:298。