workforce5。R
# #版权2021,Gurobi优化狗万app足彩有限责任公司每个工人可能在特定的一天上班,也可能不上班。采用多目标优化方法求解模型。最高优先级的目标使宽松工作的总数最小化(即,未覆盖工作的总数量)。次要目标#使所有工人的最大和最小轮班数之间的差值最小化。第二个优化是允许#降低第一个目标较小值的10%和2库(矩阵)库(gurobi) #定义数据nShifts < - 14 nWorkers < - 8据nvar < - (nShifts + 1) * (nWorkers + 1) + 2 varIdx < -函数(w s) {s + (w1) * nShifts} shiftSlackIdx < -函数(s) {s + nShifts * nWorkers} totShiftIdx < -函数(w){w + nShifts *(nWorkers+1)} minShiftIdx <- ((nshift +1)*(nWorkers+1)) maxShiftIdx <- (minShiftIdx+1) totalSlackIdx <- nVars shift <- c('Mon1', 'Tue2', 'Wed3', 'Thu4', 'Fri5', 'Sat6', 'Sun7', 'Mon8', 'Tue9', 'Wed10', 'Thu11', 'Fri12', 'Sat13', 'Sun14')工人<- c(' Amy', 'Bob', 'Cathy', 'Dan', 'Ed', 'Fred', 'Gu', '“托比”)shiftRequirements < - c(3、2、4、4、5、6、5、2、2、3、4、6、7、5)可用性< -列表(c (0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1), c (1, - 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0), c (0, 0, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1), c (0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1), c (1, 1, 1, 1, - 1, 0, 1, 1, - 1, 0, 1, 0, 1, 1), c (1 1 1 0 0,1, 0, 1, 1, 0, 0, 1, 1, 1), c (0, 1, 1, - 1, 0, 1, 1, 0, 1, 1, - 1, 0, 1, 1), c(1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)) #函数来显示结果solveandprint < -函数(模型,env){结果< - gurobi(模型、env = env)如果(结果$status == 'OPTIMAL') {cat('最佳目标是',结果$if (result . n) for (s in 1:nShifts) {cat(' t', shift [s],':') for (w in 1:nWorkers) {if (result . n:nWorkers)$x [varIdx (w s)] > 0.9)猫(工人[w], ' ')}猫(“\ n”)}猫(工作量:\ n) (w在1:nWorkers){猫(‘\ t’,工人[w],“:”,结果$}} else {cat('优化完成与状态',结果$#设置环境env <- list() env$<- 'workforce5.log' #创建模型<- list()模型$Modelname <- 'workforce5'模型$modelsense <- 'min' #初始化赋值决策变量:# x[w][s] == 1如果worker w被赋值给shift s。#这不再是一个纯粹的赋值模型,所以我们必须#使用二进制变量。模型$vtype <- rep('C', nVars)模型$lb <- rep(0, nVars)模型$ub <- rep(1, nVars)模型$varnames <- rep(",nVars) for (w in 1:nWorkers) {for (s in 1: nshift) {model . var . name <- rep(",nVars) for (w in 1:nWorkers)$vtype[varIdx(w,s)] = 'B'模型$varnames[varIdx(w,s)] = paste0(Workers[w],'.', shift [s]) if (availability[[w]][s] == 0) model . if (availability[[w]][s] == 0$ub[varIdx(w,s)] = 0}} #为(s in 1:nShifts){模型初始化移位松弛变量$varnames[shiftSlackIdx(s)] = paste0('ShiftSlack', shift [s])模型$ub[shiftSlackIdx(s)] = Inf} #为(w in 1:nWorkers)初始化worker slack和diff变量$varnames[totShiftIdx(w)] = paste0(' totalshift ',工人[w])模型$ub[totShiftIdx(w)] = Inf} #初始化最小/最大移位变量模型$ub[minShiftIdx] = Inf模型$varnames[minShiftIdx] = 'MinShift'模型$ub[maxShiftIdx] = Inf模型$varnames[maxShiftIdx] = 'MaxShift' #初始化总的松弛变量模型$ub[totalSlackIdx] = Inf模型$varnames[totalSlackIdx] = 'TotalSlack' #设置位移-需求约束模型$A <- spMatrix(nshift,nVars, i = c(c(mapply(rep,1: nshift,nWorkers)), c(1: nshift)), j = c(mapply(varIdx,1:nWorkers, mapply(rep,1: nshift,nWorkers)), shiftSlackIdx(1: nshift)), x = rep(1, nshift * (nWorkers+1)))))模型$感知<- rep('=', nshift)模型$rhs <- shiftrerequirements模型$B <- spMatrix(1, nVars, i = rep(1, nshift +1), j = c(shiftSlackIdx(1: nshift),totalSlackIdx), x = c(rep(1, nshift),-1))模型的和$< - rbind(模型$A、B)模型$rhs < - c(模型$, 0)模型$< - c(模型$意义上说,' = ')模型$constrnames < - c(模型$constrnames, TotalSlack) #为每个工人总数变化B < - spMatrix(据nvar nWorkers,我= c (mapp(代表,1:nWorkers, nShifts), 1: nWorkers), j = c (mapp (varIdx c (mapp(代表,1:nWorkers, nShifts)), 1: nShifts), totShiftIdx (1: nWorkers)), x = c(代表(1,nShifts * nWorkers),代表(1,nWorkers)))模型$< - rbind(模型$A、B)模型$rhs < - c(模型$,代表(0,nWorkers))模型$< - c(模型$意义上说,代表(“=”,nWorkers))模型$constrnames < - c(模型$#设置minShift / maxShift通用约束模型$genconmin <- list(list(resvar = minShiftIdx, vars = c(totShiftIdx(1:nWorkers)), name = 'MinShift'))模型$genconmax <- list(list(resvar = maxShiftIdx, vars = c(totShiftIdx(1:nWorkers)), name = 'MaxShift')) #设置多目标模型$Multiobj <- list(1:2)模型$Multiobj [[1]] <- list()模型$multiobj [[1]]$objn <- c(rep(0,nVars))模型$multiobj [[1]]$objn[totalSlackIdx] = 1模型$multiobj [[1]]$优先级<- 2模型$multiobj [[1]]$重量<- 1模型$multiobj [[1]]$Abstol <- 2模型$multiobj [[1]]$Reltol <- 0.1型号$multiobj [[1]]$name <- 'TotalSlack'模型$multiobj [[1]]$Con <- 0.0模型$Multiobj [[2]] <- list()模型$multiobj [[2]]$objn <- c(rep(0,nVars))模型$multiobj [[2]]$objn[minShiftIdx] = -1模型$multiobj [[2]]$objn[maxShiftIdx] = 1模型$multiobj [[2]]$优先级<- 1的模型$multiobj [[2]]$重量<- 1模型$multiobj [[2]]$Abstol <- 0模型$multiobj [[2]]$Reltol <- 0模型$multiobj [[2]]$name <-“公平”模型$multiobj [[2]]$con <- 0.0 #保存初始化模型gurobi_write(model,'workforce5. conf . conf ')#优化结果<- solveandprint(model, env) if (result . env$#清除空间rm(model, env, availability, shift, Workers, shiftrerequirement, result)