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