workforce3.R


# 2023年版权,Gurobi优化狗万app足彩,LLC # #分配工人的变化;每个工人可能是也可能不是在#特别的一天。如果问题不能解决,放松模型#确定哪些约束不能满足,和多少#他们需要放松。库(矩阵)库(gurobi) #函数来显示结果printsolution < -函数(结果){如果(结果美元状态= = '最佳'){猫(最优目标是,结果美元objval,猫“\ n”)(“时间表:\ n”)(在1:nShifts){猫(‘\ t’,转变[s], ': ') (w 1: nWorkers){如果(结果美元x [varIdx (w s)] > 0.9)猫(工人[w], ' ')猫}}}}# (“\ n”)定义数据nShifts < 7 - 14 nWorkers <据nvar < - nShifts * nWorkers varIdx < -函数(w s) {s + (w1) * nShifts} <转变- c (‘Mon1’,‘Tue2’,‘Wed3’,‘Thu4’,‘Fri5’,‘Sat6’,‘Sun7’,‘Mon8’,‘Tue9’,‘Wed10’,‘Thu11’,‘Fri12’,‘Sat13’,‘Sun14’)工人< - c(“艾米”、“鲍勃”、“凯西”,“丹”,“Ed”,“弗雷德”,“顾”)支付< - c (10、12、10、8、8, 9, 11) 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)) #设置参数参数< -()参数列表美元日志文件< - workforce3。日志' #构建模型模型< -列表()模型美元modelname < -“workforce3”模型美元modelsense < -“min”#初始化任务决策变量:# x [w] [s] = = 1 #年代转移分配如果工人w。由于一个分配模型总是产生整数#解决方案,我们使用连续变量作为LP和解决。模型美元磅< - 0模型美元乌兰巴托< -代表(1,据nvar)模型美元obj < -代表(0,据nvar)模型美元varnames < -代表(”,据nvar) (w在1:nWorkers){(在1:nShifts){模型美元varnames [varIdx (w s)] = paste0(工人[w],“。”,转变[s])模型美元obj [varIdx (w s)] = [w]如果支付(可用性[[w]] [s] = = 0)模型美元乌兰巴托(varIdx (w s)] = 0}} #设置shift-requirements约束模型美元据nvar < - spMatrix (nShifts,我= c (mapp(代表,1:nShifts, nWorkers)), j = mapp (varIdx, 1: nWorkers,宾州(代表,1:nShifts, nWorkers)), x =代表(1,nShifts * nWorkers))模型美元<——代表(“=”,nShifts)模型美元rhs < - shiftRequirements模型美元gurobi_write constrnames < -转移#保存模型(模型,workforce3。lp ', params) #优化结果< - gurobi(模型、params = params) #显示结果(结果美元状态= = '最佳'){#代码可以进入这里如果你改变一些数据的…否则#这永远不会被执行。printsolution(结果);}else if(结果美元状态= =“不可行”){#使用gurobi_feasrelax找出哪些copnstraints应该放松#和多少问题的可行性。处罚< -列表()处罚美元磅< - Inf处罚美元乌兰巴托< - Inf处罚美元rhs < -代表(1,长度(模型美元rhs) feasrelax < - gurobi_feasrelax(模型中,0,假的,罚款,params = params) < - gurobi (feasrelax结果美元模型,params = params)如果(结果美元状态= = '最佳'){printsolution(结果)猫(“松弛值:\ n”) (j(据nvar + 1):长度(结果美元x)){如果(结果美元x [j] > 0.1)猫(‘\ t’, feasrelax美元模型美元varnames [j],结果美元x [j], ' \ n ')}}{猫(意想不到的状态,其他的结果美元状态,“现在\ nEnding \ n”)其他}rm(罚款,feasrelax)}{#来处理用户中断或其他问题猫(意想不到的状况,结果美元状态,“现在\ nEnding \ n”)} #腾出rm(模型、参数、可用性、转移、工人,工资,shiftRequirements,结果)