lingo 职员时序安排模型 @wrap()函数

职员时序安排模型。 一项工作.周7天都需要有人(比如护士工作),每天(周一至周日)所需的最少职员数为20、16、13、16、19、14 和12,并要求每个职员一周连续工作5天。试求每周所需最少职员数,并给出安排。注意,这里考虑稳定后的情况。

model:
sets:
    days/1..7/:num,start;
endsets

data:
    num=20 16 13 16 19 14 12;
enddata
    min=@sum(days:start);!sum函数返回指定集成员里一个表达式的和;    
    @for(days(j):
        @sum(days(i)|i #le# 5:
            start(@wrap(j+i+2,7)))>=num(j));
end
        

对于@wrap函数许多书上的表达是:该函数返回j=index- k*limit。其中,k是一个整数,取适当值,保证j落在区间[1,limit]内。 该函数相当于index模limit 再加1。该函数在循环、多阶段计划编制中特别有用。

这里的取模再加1我理解的是并不是指在数值上加1,而是像循环一样加1,举个例子,上述代码 j 为2时,days(i)=1 2 3 4 5,  @wrap(j+i+2,7)返回的值为5,6,7,1,2;j 为3时@wrap(j+i+2,7)返回的值为6,7,1,2,3;就像这样。

 

@sum(days(i)|i #le# 5:
            start(@wrap(j+i+2,7)))>=num(j));
这一句应该就是这一天的护士人数,它是前面的四天一共留下的护士和新加入的护士人数之和。

 

posted @ 2019-06-20 17:00  阳光中的影子  阅读(1504)  评论(0)    收藏  举报