Перевести с lpSolve на lpSolveAPI Package - PullRequest
0 голосов
/ 29 января 2020

Цель: Использовать текущий код lpSolve для создания нового кода с использованием пакета lpSolveAPI.

Фон: Я использовал lpSolve, чтобы найти оптимальный решение в целях создания составов спортивных состязаний по фэнтези-спорту, которые максимизируют прогнозируемые баллы (DK) игроков в команде по сравнению с максимально допустимой общей заработной платой (SALARY) - с несколькими другими ограничениями, чтобы соответствовать правилам конкурса. В нескольких случаях я обнаружил, что lpSolve не может найти наиболее оптимальное решение. По-видимому, он по какой-то неизвестной причине пропускает лучшее решение по пунктам / долларам и находит только n-е лучшее решение. К сожалению, у меня нет примера этого, поскольку у меня недавно были проблемы с моим архивным диском, и я потерял немало данных.

Мои исследования / вопросы: Я читал другие темы здесь у которых были подобные проблемы с lpSolve ( как здесь ). В этих случаях lpSolveAPI смог увидеть оптимальное решение, а lpSolve - нет. Не знакомый с lpSolveAPI, я ищу помощи от кого-то, знакомого с обоими пакетами, в преобразовании моего текущего кода, чтобы вместо этого воспользоваться преимуществами пакета lpSolveAPI и устранить надзор за lpSolve в будущем. Я пытался, но по какой-то причине я теряюсь в переводе.

Мой код lpSolve:

# count the number of unique teams and players
unique_teams = unique(slate_players$TEAM)
unique_players = unique(slate_players$PLAYERID)

# define the objective for the solver
obj = slate_players$DK

# create a constraint matrix for the solver
con = rbind(t(model.matrix(~ POS + 0, slate_players)), #Positions
            t(model.matrix(~ PLAYERID + 0, slate_players)), #DupPlayers
            t(model.matrix(~ TEAM + 0, slate_players)), #SameTeam
            rep(1,nrow(slate_players)), #TotPlayers
            slate_players$SALARY) #MaxSalary

# set the direction for each of the constraints
dir = c("==", #1B
        "==", #2B
        "==", #3B
        "==", #C
        "==", #OF
        "==", #SP
        "==", #SS
        rep('<=',length(unique_players)), #DupPlayers
        rep('<=',length(unique_teams)), #SameTeam
        "==", #TotPlayers
        "<=") #MaxSalary

# set the limits for the right-hand side of the constraints
rhs = c(1, #1B
        1, #2B
        1, #3B
        1, #C
        3, #OF
        2, #SP
        1, #SS
        rep(1,length(unique_players)), #DupPlayers
        rep(5,length(unique_teams)), #SameTeam
        10, #TotPlayers
        50000) #MaxSalary

# find the optimal solution using the solver
result = lp("max", obj, con, dir, rhs, all.bin = TRUE)

# create a data frame for the players in the optimal solution
solindex = which(result$solution==1)
optsolution = slate_players[solindex,]

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 08 марта 2020

Это должно быть просто:

library(lpSolveAPI)
ncons <- nrow(con)
nvars <- length(obj)
lprec <- make.lp(nrow=ncons, ncol=ncols)
set.objfn(lprec, obj)
set.type(lprec, 1:nvars, "binary") # all.bin=TRUE
for (i in 1:ncons) {
    set.row(lprec, row=i, xt=con[i,])
    set.constr.type(lprec, dir[i], constraints=i)
    set.rhs(lprec, b=rhs[i], constraints=i)
}
status <- solve(lprec)
if(status!=0) stop("no solution found, error code=", status)
sol <- get.variables(lprec)

Этот код не проверен, поскольку в вашем вопросе отсутствуют ссылки на данные и нет ожидаемого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...