2017-10-14 4 views
1

J'utilise le package ompr avec r, et je ne peux pas comprendre comment changer la fonction d'objectif à mes besoins. Le premier modèle est en cours d'exécution, mais l'objectif n'est pas vraiment ce dont j'ai besoin.ompr objectif: minimiser la variance de rowsums

library(ompr) 
library(magrittr) 
library(ROI.plugin.glpk) 
library(ompr.roi) 

anz_schulen <- 50 
anz_sfkz <- 10 


# This model works 
model <- MIPModel() %>% 
add_variable(x[i, j], i = 1:anz_schulen, j = 1:anz_sfkz, type = "binary") %>% 
set_objective(sum_expr(x[i, j], i = 1:anz_schulen, j = 1:anz_sfkz), sense="max") %>% 
add_constraint(sum_expr(x[i, j], i = 1:anz_schulen) <= 7, j = 1:anz_sfkz) %>% 
add_constraint(sum_expr(x[i, j], i = 1:anz_schulen) >= 1, j = 1:anz_sfkz) %>% 
add_constraint(sum_expr(x[i, j], j = 1:anz_sfkz) <= 10, i = 1:anz_schulen) %>% 
add_constraint(sum_expr(x[i, j], j = 1:anz_sfkz) >= 1, i = 1:anz_schulen) 

erg <- solve_model(model, solver=with_ROI(solver = "glpk")) 

J'ai besoin de la variance des rangées de x minimisées. Quelqu'un qui sait comment faire ça?

model <- MIPModel() %>% 
add_variable(x[i, j], i = 1:anz_schulen, j = 1:anz_sfkz, type = "binary") %>% 
# I NEED SOMETHING LIKE: substitute(var(rowSums(x[i,j])) ... THIS IS NOT WORKING 
set_objective(substitute(var(rowSums(x[i,j]))), sense="min") %>% 
add_constraint(sum_expr(x[i, j], i = 1:anz_schulen) <= 7, j = 1:anz_sfkz) %>% 
add_constraint(sum_expr(x[i, j], i = 1:anz_schulen) >= 1, j = 1:anz_sfkz) %>% 
add_constraint(sum_expr(x[i, j], j = 1:anz_sfkz) <= 10, i = 1:anz_schulen) %>% 
add_constraint(sum_expr(x[i, j], j = 1:anz_sfkz) >= 1, i = 1:anz_schulen) 

Merci!

Répondre

0

La minimisation de la variance ne fonctionne pas dans ompr car elle ne peut traiter qu'avec des fonctions d'objectif linéaires. Vous pouvez essayer d'utiliser le package ROI avec une fonction d'objectif quadratique (et utiliser un solveur capable de gérer des fonctions d'objectif quadratiques).

Une autre option consiste à minimiser le absolute value de la somme linéaire des écarts par rapport à la moyenne, au lieu du carré. Je crois que tout cela peut être formulé comme égalités (in) linéaires. Mais je ne suis pas sûr si cela a du sens avec votre cas d'utilisation.