我正在使用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]的长度相同
必须是一个普遍的错误,我们应该能够在不了解模型的情况下找到它。
感谢您的帮助!
答案 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?