2016-10-28 2 views
1

meine Füße in R nach der Verwendung von Excel für viele Jahre tauchen und habe eine Frage. Ich bin sehr beeindruckt davon, wie viel schneller R ist, es dauerte Excel über eine Stunde zu tun, 10.000 Simulationen zu tun und R hat 25.000 der gleichen Sim in 4 Minuten. Genial.Bedingte Einschränkungen in RGLPK-Bibliothek für R

Dies ist Fantasy Football verwandt, da ich versuche, einen Lineup Optimizer in R zu erstellen und die RGLPK-Bibliothek als eine gute Option zu finden. Es gibt viele andere Fragen zu SO, die mir geholfen haben, dahin zu kommen, wo ich heute bin, aber ich habe eine Straßensperre erreicht. Hier sind einige der anderen Themen.

Fantasy football linear programming in R with RGLPK

Rglpk - Fantasy Football Lineup Optimiser - Rbind of For Loop Output

Rglpk - Fantasy Football Lineup Optimiser - Forcing the Inclusion of a Player

Hier ist mein Lager Optimierer

#stock optimal linups solver 

name <- myData$Name 
pos <- myData$Pos 
pts <- myData$Projection 
cost <- myData$Salary 
team <- myData$Team 
opp <- myData$Opp 


num.players <- length(name) 

f <- pts 

var.types <- rep("B", num.players) 

A <- rbind(as.numeric(pos=="QB") 
      , as.numeric(pos=="RB") 
      , as.numeric(pos=="WR") 
      , as.numeric(pos=="TE") 
      , as.numeric(pos=="K") 
      , as.numeric(pos=="D") 
      ,cost) 

dir <- c("==" 
     ,"==" 
     ,"==" 
     ,"==" 
     ,"==" 
     ,"==" 
     ,"<=") 

b <- c(1 
     , 2 
     , 3 
     , 1 
     , 1 
     , 1 
     , 60000) 

library(Rglpk) 

sol <- Rglpk_solve_LP(obj = f 
         , mat = A 
         , dir = dir 
         , rhs = b 
         , types = var.types 
         , max=TRUE) 

myData[sol$solution == 1,] 
sprintf('Cost is:$%i', sum(cost[sol$solution > 0])) 
sprintf('Projected Points is: %f', sol$optimum) 

Hier ist ein Link auf die Daten Ich verwende.

https://www.dropbox.com/s/d5m8jjnq32f0cpe/Week6NFLProjections.csv?dl=0

Ich bin auch zu dem Punkt, wo ich kann die Codeschleife, indem das Ziel mehr Aufstellungen erstellen = zur vorherige Partitur - .01. Als Randnotiz wird dieser Prozess deutlich verlangsamt, wenn er weiterläuft (etwa in der Aufstellung # 50), ist das normal und gibt es einen effizienteren Weg, dies zu wiederholen?

Meine eigentliche Frage ist, wie kann ich einige umfangreichere Einschränkungen hinzufügen. In Fantasy Football ist es sinnvoll, Spieler aus dem gleichen Team zusammen zu "paaren", und ich kann mir nicht vorstellen, wie ich das in die Zwänge bringen würde.

Für ein einfaches Pairing-Beispiel, wie könnte ich eine Einschränkung hinzufügen, so dass meine "optimale Aufstellung" würde die D und K aus dem gleichen Team haben? Ich bin tatsächlich in der Lage gewesen, diese Frage zu umgehen, indem ich nur die D + K in der CSV-Datei kombiniere, aber interessiert bin, wie ich das in R codieren würde. Ein komplexeres Paarungsszenario wäre, meine QB und nur zu haben 1 der (3) WR/(1) TE sind im selben Team.

Eine andere wäre sicherzustellen, dass keiner der offensiven Spieler gegen meine eigene Verteidigung spielt.

Jede Hilfe würde sehr geschätzt werden. Ich kann nirgendwo eine Antwort finden.

+0

Ich denke, ich könnte einen Vektor für Teams erstellen ich.e 'code' teams <- myData $ Team' code' Aber wie kann ich das verwenden, um sicherzustellen, dass meine ausgewählte D = ausgewählt K – NxtWrldChamp

Antwort

0

Versuchen Sie, etwas Ähnliches zu tun, Sie müssen es nur an Ihre Situation anpassen. Ich habe das direkt von meinem eigenen Code übernommen, aber im Grunde genommen gebe ich die gewünschten Player ein und erstelle mit diesen einen eigenen Datenrahmen. Dann optimiere ich die übrig gebliebenen Positionen und rbind zusammen, um die endgültige Aufstellung zu erstellen. Diese Schleife durchläuft und gibt so viele Aufstellungen wie der Benutzer möchte.

Inclusions<-readline("Enter players to include into optimal lineups: ") 
Inclusions <- as.character(unlist(strsplit(Inclusions, ","))) 
Inclusions_table<-Data[ Data$Player.Name %in% Inclusions, ] 
Inclusions_no<-nrow(Inclusions_table) 
Data<-Data[ ! Data$Player.Name %in% Inclusions, ] 

Lineup_no<-readline("How many lineups to be generated?: ") 

num.players <- length(Data$Player.Name) 
obj<-Data$fpts 
var.types<-rep("B",num.players) 
subscore<-1000 

Lineups <- list() 
for(i in 1:Lineup_no) 
{ 
matrix <- rbind(as.numeric(Data$Position == "QB"), # num QB 
     as.numeric(Data$Position == "RB"), # num RB 
     as.numeric(Data$Position == "RB"), # num RB 
     as.numeric(Data$Position == "WR"), # num WR 
     as.numeric(Data$Position == "WR"), # num WR 
     as.numeric(Data$Position == "TE"), # num TE 
     as.numeric(Data$Position == "TE"), # num TE 
     as.numeric(Data$Position %in% c("RB", "WR", "TE")), # Num RB/WR/TE 
     as.numeric(Data$Position == "DEF"),# num DEF 
     Data$Salary,Data$fpts) 
direction <- c("==", 
    ">=", 
    "<=", 
    ">=", 
    "<=", 
    ">=", 
    "<=", 
    "==", 
    "==", 
    "<=","<") 
opt_var<-subscore-0.01   
rhs<-c(1-sum(Inclusions_table$Position=="QB"),max(0,2-sum(Inclusions_table$Position=="RB")),4-sum(Inclusions_table$Position=="RB"),max(0,2-sum(Inclusions_table$Position=="WR")),4-sum(Inclusions_table$Position=="WR"),max(0,1-sum(Inclusions_table$Position=="TE")),2-sum(Inclusions_table$Position=="TE"),7-sum(Inclusions_table$Position=="RB")-sum(Inclusions_table$Position=="WR")-sum(Inclusions_table$Position=="TE"),1-sum(Inclusions_table$Position=="DEF"),100000-sum(Inclusions_table$Salary),opt_var) 
sol <- Rglpk_solve_LP(obj = obj, mat = matrix, dir = direction, rhs = rhs, 
        types = var.types, max = TRUE) 
Lineup<-data.frame(Data[sol$solution==1,]) 
subscore<-sum(Lineup$fpts) 
Lineup<-rbind(Lineup,Inclusions_table) 
Lineup<-Lineup[order(Lineup$Position),] 
Salary<-sum(Lineup$Salary) 
Score<-sum(Lineup$fpts) 
print(Lineup) 
print(Salary) 
print(Score) 
Lineups[[i]]<-Lineup 
} 

Daten sind meine Daten gesetzt und sieht wie folgt aus als Referenz:

 Position    Player.Name  Team Opponent Salary PPG fpts Pos_Rank upper lower Off_Snaps Pct_Off 
1056  TE    A.J. Derby Patriots  Bills 5000 0 0.0000  82  0  0  NA <NA> 
462  RB   Aaron Ripkowski Packers Falcons 6000 1.8 1.3116  75 1.8852 0.01  22  25% 
78   QB   Aaron Rodgers Packers Falcons 19350 20.6 18.4292  1 19.9689 17.2  87 100% 
1466  WR   Adam Humphries Buccaneers Raiders 7650 8.1 9.4808  46 11.2125 7.5664  38  51% 
1808  WR   Albert Wilson  Chiefs  Colts 5000 4.3 5.6673  74 6.2438 4.78  11  21% 
1252  WR  Aldrick Robinson Falcons Packers 5000 3.8 2.9114  96 3.2836 2.0152  10  15% 
636  RB   Alex Collins Seahawks  Saints 6000 2.7 1.5992  69 2.1513 0.41   1  2% 

Hoffentlich können Sie dieses Beispiel ändern zu Ihnen passt.

+0

Danke, ich habe Ihre Fragen hier gefunden und viele davon bereits als verwendet eine Grundlage für das, was ich mache. Ich kann die Spieler sperren, aber ich frage mich eher, ob es eine Möglichkeit für mich gibt, dem Code zu sagen, dass er das beste Team ausspucken soll, wo sich DEF und K im selben Team befinden. Ich konnte jede DEF/K-Kombination durchlaufen, um die besten Teams zu sehen, war mir aber nicht sicher, ob es einen effizienteren Weg gab. – NxtWrldChamp

+0

Willst du die optimale Aufstellung für jedes Team mit der gleichen Verteidigung und Kicker? Oder wählst du selbst ein K und DEf und willst dann die optimale Aufstellung sehen? – Morts81

+0

Würde es vorziehen, zunächst keine manuelle Auswahl vorzunehmen. d. H. Frage Code, um mir die beste Aufstellung zu geben, wo die Verteidigung und K vom selben Team sind. – NxtWrldChamp