workforce4.R


# 2023年版权,Gurobi优化狗万app足彩,LLC # #分配工人的变化;每个工人可能是也可能不是在#特别的一天。我们用帕累托优化解决模型:#第一,我们最小化线性的和休闲裤。然后,我们限制#休闲裤的总和,我们尽量减少二次目标#试图平衡工作负载的工人。库(矩阵)库(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)) #函数来显示结果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 ')其他}}{猫(优化完成状态,结果美元状态)}}#设置参数参数< -()参数列表美元日志文件< - workforce4。日志' #构建模型模型< -列表()模型美元modelname < -“workforce4”模型美元modelsense < -“min”#初始化任务决策变量:# x [w] [s] = = 1如果工人w分配转变。#这不再是一个纯粹的任务模型,所以我们必须使用二进制变量。模型美元vtype < -代表(“C”,据nvar)模型美元磅< -代表(0,据nvar)模型美元乌兰巴托< -代表(1,据nvar)模型美元obj < -代表(0,据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)] =正模型美元varnames [diffShiftIdx (w)] = paste0 (DiffShifts,工人[w])模型美元乌兰巴托(diffShiftIdx (w)] =正模型美元磅(diffShiftIdx (w)] =无穷}#初始化平均变化变量模型美元乌兰巴托[avgShiftIdx] =正模型美元varnames [avgShiftIdx] = ' AvgShift ' #总松弛变量初始化模型美元乌兰巴托[totalSlackIdx] =正模型美元varnames [totalSlackIdx] =“TotalSlack”模型美元obj [totalSlackIdx] = 1 #设置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])) #保存初始模型gurobi_write (workforce4模型”。lp ', params) #优化结果< - solveandprint(模型、参数)如果(结果美元地位! = '最佳')停止(“现在停止\ n”) #约束松弛通过设置其上界和下界totalSlack < -结果美元x (totalSlackIdx)模型美元磅(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),代表(1,nWorkers),代表(1,nWorkers),代表(1,nWorkers) -nWorkers))模型美元< - rbind(模型美元A、B)模型美元rhs < - c(模型美元,代表(0,nWorkers + 1))模型美元< - c(模型美元意义上说,代表(“=”,nWorkers + 1))模型美元constrnames < - c(模型美元constrnames sprintf (DiffShifts % s,工人[1:nWorkers]), AvgShift) #目标:最小化的平方的总和#平均数的差异转变工作模式美元obj < - 0模型美元据nvar Q < - spMatrix(据nvar,我= c (diffShiftIdx (1: nWorkers)), j = c (diffShiftIdx (1: nWorkers)), x =代表(1,nWorkers)) #保存修改模型gurobi_write (workforce4b模型”。lp ', params) #优化结果< - solveandprint(模型、参数)如果(结果美元地位! = '最佳')停止(“现在停止\ n”) #腾出rm(模型、参数、可用性、转移工人,shiftRequirements,结果)