workforce5。R


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] == 0ub[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)