workforce5.R


# 2023年版权,Gurobi优化狗万app足彩,LLC # #分配工人的变化;每个工人可能是也可能不是在#特别的一天。我们使用多目标优化模型来解决。#最高优先级目标最小化的和休闲裤#(即。,发现变化的总数)。二级目标#最小化之间的差别#转变的最大和最小数量在所有工人工作。第二个优化是允许#降低第一个目标较小值的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 < - ((nShifts + 1) * (nWorkers + 1) maxShiftIdx < - (minShiftIdx + 1) 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 (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 < -函数(模型、参数){结果< - gurobi(模型、params = params)如果(结果美元状态= = '最佳'){猫(最优目标是,结果美元objval,猫“\ n”)(“时间表:\ n”)(在1:nShifts){猫(‘\ t’,转变[s], ': ') (w 1: nWorkers){如果(结果美元x [varIdx (w s)] > 0.9)猫(工人[w], ' ')}猫(“\ n”)}猫(工作量:\ n) (w在1:nWorkers){猫(‘\ t’,工人[w],“:”,结果美元x [totShiftIdx (w)], ' \ n ')其他}}{猫(优化完成状态,结果美元状态)}}#设置参数参数< -()参数列表美元日志文件< - workforce5。日志' #构建模型模型< -列表()模型美元modelname < -“workforce5”模型美元modelsense < -“min”#初始化任务决策变量:# x [w] [s] = = 1如果工人w分配转变。#这不再是一个纯粹的任务模型,所以我们必须使用二进制变量。模型美元vtype < -代表(“C”,据nvar)模型美元磅< -代表(0,据nvar)模型美元乌兰巴托< -代表(1,据nvar)模型美元varnames < -代表(”,据nvar) (w在1:nWorkers){(在1:nShifts){模型美元vtype [varIdx (w s)] =“B”模型美元varnames [varIdx (w s)] = paste0(工人[w],“。”,转变[s])如果(可用性[[w]] [s] = = 0)模型美元乌兰巴托(varIdx (w s)] = 0}} #初始化转变松弛变量(在1:nShifts){模型美元varnames [shiftSlackIdx (s)] = paste0 (“ShiftSlack”,转变[s])模型美元乌兰巴托(shiftSlackIdx (s)] =正}#初始化工人松弛和diff变量(w 1: nWorkers){模型美元varnames [totShiftIdx (w)] = paste0 (TotalShifts,工人[w])模型美元乌兰巴托(totShiftIdx (w)] =正}#初始化变量最小/最大转变模型美元乌兰巴托[minShiftIdx] =正模型美元varnames [minShiftIdx] =“MinShift”模型美元乌兰巴托[maxShiftIdx] =正模型美元varnames [maxShiftIdx] = ' MaxShift ' #总松弛变量初始化模型美元乌兰巴托[totalSlackIdx] =正模型美元varnames [totalSlackIdx] = ' TotalSlack ' #设置shift-requirements约束模型美元据nvar < - spMatrix (nShifts,我= c (c (mapp(代表,1:nShifts, nWorkers)), c (1: nShifts)), j = c (mapp (varIdx, 1: nWorkers,宾州(代表,1:nShifts, nWorkers)), shiftSlackIdx (1: nShifts)), x =代表(1,nShifts * (nWorkers + 1)))模型美元<——代表(“=”,nShifts)模型美元rhs < - shiftRequirements模型美元constrnames < -转移#集TotalSlack等于每个转变松弛的总和B < - spMatrix(1、据nvar i =代表(1,nShifts + 1), j = c (shiftSlackIdx (1: nShifts) totalSlackIdx), x = c(代表(1,nShifts), 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(模型美元constrnames sprintf (TotalShifts % s,工人[1:nWorkers])) #设置minShift / maxShift通用约束模型美元genconmin < -列表(列表(resvar = minShiftIdx var = c (totShiftIdx (1: nWorkers)), name = ' MinShift '))模型美元genconmax < -列表(列表(resvar = maxShiftIdx var = c (totShiftIdx (1: nWorkers)), name = ' MaxShift ')) #集的多目标模型美元multiobj < -列表(1:2)模型美元multiobj[[1]] < -列表()模型美元multiobj [[1]]美元objn < - c(代表(0,据nvar))模型美元multiobj [[1]]美元objn [totalSlackIdx] = 1模型美元multiobj [[1]]美元优先级< - 2模型美元multiobj [[1]]美元重量< - 1模型美元multiobj [[1]]美元abstol < - 2模型美元multiobj [[1]]美元reltol < - 0.1模型美元multiobj [[1]]美元名称< -“TotalSlack”模型美元multiobj [[1]]美元反对< - 0.0模型美元multiobj[[2]] < -列表()模型美元multiobj [[2]]美元objn < - c(代表(0,据nvar))模型美元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]]美元名称< -“公平”模型美元multiobj [[2]]美元反对< - 0.0 #保存初始模型gurobi_write (workforce5模型”。lp ', params) #优化结果< - solveandprint(模型、参数)如果(结果美元地位! = '最佳')停止(“现在停止\ n”) #腾出rm(模型、参数、可用性、转移工人,shiftRequirements,结果)