RGLPK约束问题

时间:2016-07-26 20:04:11

标签: r mathematical-optimization glpk

我有一个优化问题,提出了一些问题。

当我运行以下代码时,我得到了一个最佳解决方案。

from datetime import datetime
from time import sleep
print('The Time is shown below!')
while True:
    time = str(datetime.now())
    time = list(time)
    for i in range(10):
        time.pop(len(time)-1)
    time = ('').join(time)
    time = time.split()
    date = time[0]
    time = time[1]
    print('Time: '+time+', Date: '+date, end='\r')
    sleep(1)

但问题是数据框中的一些参与者是重复的,因为他们有多个职位。同一个玩家有2行,只有不同的位置列,但我只能使用每个玩家一次。所以我在。

中添加了以下约束
day = "Mon, 25 Jul 2016 16:03:53 +0000"
# Convert to an array
day = list(day)
# Remove first 5 characters
for i in range(5):
    day.pop(0)
day = ('').join(day)
print(day)

# You can use if statements to determine which day it is to decide how many characters to remove.
>>> "25 Jul 2016 16:03:53 +0000"

现在我无法获得可行的解决方案。关于我应该更改约束的任何建议,以便我可以始终拥有10个独特的,非重复的玩家,同时遵循其他约束条件?

1 个答案:

答案 0 :(得分:1)

问题是你的约束矩阵没有做你认为的那样。如果查看您编码的约束矩阵,您将看到底行包含的所有条目都等于DK数据框中唯一玩家的数量。当约束矩阵乘以解向量时,必须实现线性编程约束。解决方案向量中的单个1和矩阵乘法后的结果条目将是总唯一玩家的数量。因此,约束无法实现,也不会收敛。

这是一个可行的黑客攻击。它并不漂亮,但它完成了工作。

objective <- DK$DK.proj
playerMatrix <- lapply(unique(DK$player), function(name) as.numeric(DK$player==name))
playerMatrix <- t(matrix(unlist(playerMatrix), ncol=n_distinct(DK$player)))

objective.variable.types <- rep("B", length(DK$player))
constraint.matrix <- rbind(as.numeric(DK$pos == "SP"),
                           as.numeric(DK$pos == "C"),
                           as.numeric(DK$pos == "1B"),
                           as.numeric(DK$pos == "2B"),
                           as.numeric(DK$pos == "SS"),
                           as.numeric(DK$pos == "3B"),
                           as.numeric(DK$pos == "OF"),
                           DK$salary,
                           playerMatrix)
constraint.directions <- c(
  "==", # SP
  "==", # C
  "==", # 1B
  "==", # 2B
  "==", # SS
  "==", # 3B
  "==", # OF,
  "<=", # max salary
  rep("<=", nrow(playerMatrix))) # unique players

rhs <- c(
  2, # SP
  1, # C
  1, # 1B
  1, # 2B
  1, # SS
  1, # 3B
  3, # OF
  50000, # max salary
  rep(1, nrow(playerMatrix))) # unique players

  sol <- Rglpk_solve_LP(obj = objective, mat = constraint.matrix, 
           dir = constraint.directions, rhs = rhs,
           types = objective.variable.types, max = TRUE)

玩家矩阵与独特玩家具有相同的行数,并跟踪确保不会多次选择任何唯一玩家。