ompr:solve_model表达式中有错误吗?

时间:2019-06-11 08:43:51

标签: r optimization

我正在使用ompr优化某些时间表。

library(ompr)
library(ompr.roi)
library(tidyverse)
library(ROI)
library(ROI.plugin.glpk)
library(ROI.plugin.symphony)

library(readxl)
library(reshape2)

personen <- c("A","B","C")
geräte <- c("a","b","c")
wochentage <- c("Montag","Dienstag","Mittwoch")

# Definition von den skills (wer (A-C) kann welches Geräte (a-c) bedienen)
skill <- matrix(c(1,1,3,2,0,1,3,0,1), nrow=3)

# Definition von anwesenheit (wer ist wann anwesend)
anwesenheit <- matrix(c(1,1,1,1,1,1,1,0,1),nrow=3)

colnames(skill) <- geräte
rownames(skill) <- personen
colnames(anwesenheit) <- wochentage
rownames(anwesenheit) <- personen

# Modell
m <- MIPModel() %>%
  add_variable(e[p,g,w], p=1:length(personen), w=1:length(wochentage), g=1:length(geräte), type = "binary") %>% # Einsatzvariable, wer macht wann was, dann=1 , sonst 0 wird nicht eingesetzt
  add_constraint(sum_expr(e[p,g,w],p=1:length(personen))<=1, g=1:length(geräte), w=1:length(wochentage)) %>% # An jedem Wochentag darf auf einem Geräte nur eine Person eingeteilt sein
  add_constraint(sum_expr(e[p,g,w],g=1:length(geräte))<=1, p=1:length(personen), w=1:length(wochentage)) %>% # An jedem Wochentag darf eine Person nur auf einem Gerät eingeteilt sein
  set_objective(sum_expr(e[p,g,w]*skill[p,g]*anwesenheit[p,w], p=1:length(personen), w=1:length(wochentage), g=1:length(geräte)), sense="max") %>% # Offensichtlich?
  solve_model(with_ROI(solver="glpk"))

由于错误,无法求解模型。它说:

名称(对象)<-nm中的错误:   “名称”属性[5]的长度必须与矢量[1]的长度相同

必须是一个普遍的错误,我们应该能够在不了解模型的情况下找到它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我知道这很旧,但是我想我会回答,因为它仍然开放。我的约束之一也遇到了同样的错误,但是我认为您的问题出在您的客观表达中。看来ompr希望变量系数在与变量相乘之前先相乘。我运行了您列出的代码,并遇到了相同的错误,但是当我在set_objective调用的skill[p,g]*anwesenheit[p,w]部分周围设置括号时,如下所示,并且该模型得以运行并解决了问题。

set_objective(sum_expr(e[p,g,w]*(skill[p,g]*anwesenheit[p,w]), p=1:length(personen), w=1:length(wochentage), g=1:length(geräte)), sense="max") %>% # Offensichtlich?