workforce4。R


workforce4。R


# #版权2021,Gurobi优化狗万app足彩有限责任公司每个工人可能在特定的一天上班,也可能不上班。我们使用Pareto优化来求解模型:#首先,我们最小化松弛的线性和。然后,我们限制宽松长裤的总数,并最小化一个二次目标,该目标试图平衡员工的工作量。库(矩阵)库(gurobi) #定义数据nShifts < 7 - 14 nWorkers <据nvar < - (nShifts + 1) * (nWorkers + 1) + nWorkers + 1 varIdx < -函数(w s) {s + (w1) * nShifts} shiftSlackIdx < -函数(s) {s + nShifts * nWorkers} totShiftIdx < -函数(w) {w + nShifts * (nWorkers + 1)} avgShiftIdx < - ((nShifts + 1) * (nWorkers + 1) diffShiftIdx < -函数(w) {w+ avgShiftIdx} totalSlackIdx < - <据nvar变化- c(‘Mon1’,‘Tue2’,‘Wed3’,‘Thu4’,‘Fri5’,‘Sat6’,‘Sun7’,‘Mon8’,‘Tue9’,‘Wed10’,‘Thu11’,‘Fri12’,‘Sat13’,‘Sun14’)工人< - c(“艾米”、“鲍勃”、“凯西”,“丹”,“Ed”,“弗雷德”,“顾”)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 (1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,1)) #显示结果的函数<- Function (model, env) {result <- gurobi(model, env = env) if(result . 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() envlogfile <- 'workforce4.log' #构建模型模型<- list()模型Modelname <- 'workforce4'模型modelsense <- 'min' #初始化赋值决策变量:# x[w][s] == 1如果worker w被赋值给shift s。#这不再是一个纯粹的赋值模型,所以我们必须#使用二进制变量。模型vtype <- rep('C', nVars)模型lb <- rep(0, nVars)模型ub <- rep(1, nVars)模型obj <- rep(0, 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模型varnames[diffShiftIdx(w)] = paste0(' diffshift ',工人[w])模型ub[diffShiftIdx(w)] = Inf模型lb[diffShiftIdx(w)] = -Inf} #初始化平均位移变量模型ub[avgShiftIdx] = Inf模型varnames[avgShiftIdx] = 'AvgShift' #初始化总的松弛变量模型ub[totalSlackIdx] = Inf模型varnames[totalSlackIdx] = 'TotalSlack'模型obj[totalSlackIdx] = 1 #设置位移-需求约束模型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(模型#保存初始化模型gurobi_write(model,'workforce4. s . ')#优化结果<- solveandprint(model, env) if (result . env= 'OPTIMAL') stop(' stop now\n') #通过设置slack的上界和下界来约束它x (totalSlackIdx)模型lb[totalSlackIdx] = totalSlack模型乌兰巴托[totalSlackIdx] = totalSlack #链接平均数量的变化和差异与平均B < spMatrix(据nvar nWorkers + 1,我= c (1: nWorkers, 1: nWorkers, 1: nWorkers,代表(nWorkers + 1, nWorkers + 1)), j = c (totShiftIdx (1: nWorkers) diffShiftIdx (1: nWorkers),代表(avgShiftIdx nWorkers) totShiftIdx (1: nWorkers) avgShiftIdx), x = c(代表(1,nWorkers),(rep(-1,nWorkers), rep(-1,nWorkers), rep(1,nWorkers),-nWorkers))))< - rbind(模型A、B)模型rhs < - c(模型,代表(0,nWorkers + 1))模型< - c(模型意义上说,代表(“=”,nWorkers + 1))模型constrnames < - c(模型#目标:最小化从工作模型的#平均移位数差的平方和Obj <- 0模型Q <- spMatrix(nVars,nVars, i = c(diffShiftIdx(1:nWorkers)), j = c(diffShiftIdx(1:nWorkers)), x = rep(1,nWorkers)) #保存修改的模型gurobi_write(model,'workforce4b. ')。#优化结果<- solveandprint(model, env) if (result . env#清除空间rm(model, env, availability, shift, Workers, shiftrerequirement, result)