我遇到特定问题的问题。我必须安排5名员工工作超过14天。每个员工只能工作14天中的9天,每天必须安排3名员工。关键部分是每个员工在某一天工作都会受到特定的惩罚。因此,如果他们不能在那一天工作,如果他们可以工作并且不介意它的罚款为零,最后如果他们可以但不想将其罚款为5则罚款10。
每个员工每天都有一个惩罚值矩阵。我正试图找到一种方法来写出我的约束。
我想到了具有矩阵A(惩罚矩阵)和矩阵B(调度矩阵)和矩阵C,其中C(i,j)= A(i,j)* B(i,j)。如果A(i,j)等于0(员工不工作),则给定此设置,则不会考虑惩罚,反之亦然。
那么我可以说是我的约束:
A(1,1)+ A(1,m)+ A(1,n)< = 9
和
A(1,1)+ A(m,1)+ A(n,1)= 3
我最小化:C(1,1)+ C(m,m)+ C(n,n)
我这样看待它的问题是试图在优化算法中使用它。单纯形算法应该能够解决任何LP问题,但它可能是最慢的。我被卡住了,我现在肯定我正在以错误的方式看待这个问题。如果有人能给我一双新鲜的眼睛,并可能解释为什么我以错误的方式看待这个,我会很感激。
答案 0 :(得分:0)
我认为你犯了一个模型错误,使你的问题比你需要的更困难。
为什么你使用惩罚功能建模“能干,愿意”,“能干但不愿意”和“无法”?您是否只想最小化员工被分配了员工能够但不愿意工作的时间段的次数? (当然,没有分配任何他们无法工作的员工位置?)
如果您像上面提到的那样修改问题,可以将其建模为直接的最小成本流问题。您有一组员工节点和一组时隙节点。如果员工能够在该时段工作,则将员工连接到容量为1的边缘的时间段。如果员工愿意工作则给它成本为0,如果员工不愿意工作,则成本为1。添加源和接收器;对于每个具有容量9(可以工作的天数)和零成本的员工,源应该具有优势,而每个时隙应该具有容量为3且零成本的接收器的边缘。
从头开始编写最低成本的流量求解器是相对简单的。
如果你想禁止两个或两个以上不情愿的员工配备时间段,我认为你很难将问题建模为一个整数程序。 GLPK是一个自由的线性和整数程序求解器。它不是最先进的技术,但它在很多问题上确实很有效。我怀疑它在解决像你这样的小规模实例时会遇到麻烦。