我有一个优化问题,提出了一些问题。
当我运行以下代码时,我得到了一个最佳解决方案。
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个独特的,非重复的玩家,同时遵循其他约束条件?
答案 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)
玩家矩阵与独特玩家具有相同的行数,并跟踪确保不会多次选择任何唯一玩家。