2

针对以下情况,我一直在研究 AMPL 中的护士调度问题:

总数 护士=20

总数 of shits = 3 #morning,day,night

规划地平线 7 天:比方说 MTWRF 萨苏

除了以下限制:

  1. 最大编号 一周工作日数:5
  2. 连续 4 次夜班后的休息日。
  3. 不允许连续上夜班和早班。
  4. 每班需要 7 名护士。
  5. 一名护士每天只能轮班工作,即早、晚、日

成本情景:

Morning shift: $12
Day shift: $13
Night shift : $15

目标功能是根据护士的喜好最小化操作成本。

谁能给我一个关于如何制定这个问题的想法?

4

2 回答 2

1
set nurse; #no. of full time employees working in the facility
set days;  #planning horizon 
set shift; #no. of shift in a day
set S; #shift correseponding to the outsourced nurses
set D;#day corresponding to the outsourced nurses
set N;#


# ith nurse working on day j

# j starts from Monday (j=1), Tuesday( j=2), Wednesday (j=3), Thursday(j=4), Friday(j=5), Saturday(j=6), Sunday(j=7)
#s be the shift as morning, day and night  



param availability{i in nurse, j in days};
param costpershift{i in nurse, j in days, s in shift};
param outcost{n in N, l in D, m in S};

var nurseavailability{i in nurse,j in days,s in shift} binary; # = 1 if nurse i is available on jth day working on sth shift, 0 otherwise
var outsourced{n in N, l in D, m in S} integer;


#Objective function

minimize Cost: sum{i in nurse, j in days, s in shift} costpershift[i,j,s]*nurseavailability[i,j,s]+ sum{ n in N, l in D, m in S}outcost[n,l,m]*outsourced[n,l,m];


#constraints

#maximum no. of shifts per day

subject to maximum_shifts_perday {i in nurse,j in days}:
 sum{s in shift} nurseavailability[i,j,s]*availability[i,j] <= 1;

#maximum no. of working says a week

subject to maximum_days_of_work {i in nurse}:  
sum{j in days,s in shift} availability[i,j]*nurseavailability[i,j,s]<=5; #maximum working days irrespective of shifts

# rest days after night shifts

subject to rest_days_after_night_shift{i in nurse}:  
sum{j in days} availability[i,j]*nurseavailability[i,j,3]<=4;


#demand per shift

subject to supply{j in days, s in shift, l in D, m in S}: 
sum{i in nurse} availability[i,j]*nurseavailability[i,j,s] + sum{n in N} outsourced[n,l,m]=7;


#outsourcing only works well when there is more variability in supply.
#increasing the staff no. would be effective for reducing the cost variability in demand.
#considering a budget of $16,000 per week
#outsourcing constraints: a maximum of 20 nurses can be outsourced per shift
# no. of fulltime employees=30
#demand is 7 nurses per shift
#the average variability 
#all nurses are paid equally @ $12 per hour.
#cost of an outsourced shift is $144.
#cost of morning shift is $96.
#cost of day shift is $104.
#cost of night shift is $120.

data;                                                                                                                                                                                                                                                                                                                                                                           


#set nurse ordered:=    nurse1  nurse2  nurse3  nurse4  nurse5  nurse6  nurse7  nurse8  
#nurse9 nurse10 nurse11 nurse12 nurse13 nurse14 nurse15 nurse16 nurse17 
#nurse18    nurse19 nurse20;

set nurse:= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30;

#set days ordered:= Monday Tuesday  Wednesday Thursday Friday Saturday Sunday;

set days:= 1 2 3 4 5 6 7;                                                                                                                                                                                                                                                                                                                                           

#set shift ordered:=    Morning Day Night;

set shift:= 1 2 3;  

set D:= 1 2 3 4 5 6 7; #outsourced days
set S:=1 2 3; #outshit 
set N := 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20;




   param outcost

   [*,*,1]:
                         1     2   3   4   5   6   7:=

                      1  144  144 144 144 144 144 144
                      2  144  144 144 144 144 144 144
                      3  144  144 144 144 144 144 144
                      4  144  144 144 144 144 144 144
                      5  144  144 144 144 144 144 144
                      6  144  144 144 144 144 144 144
                      7  144  144 144 144 144 144 144
                      8  144  144 144 144 144 144 144
                      9  144  144 144 144 144 144 144
                     10  144  144 144 144 144 144 144
                     11  144  144 144 144 144 144 144
                     12  144  144 144 144 144 144 144
                     13  144  144 144 144 144 144 144
                     14  144  144 144 144 144 144 144
                     15  144  144 144 144 144 144 144
                     16  144  144 144 144 144 144 144
                     17  144  144 144 144 144 144 144
                     18  144  144 144 144 144 144 144
                     19  144  144 144 144 144 144 144
                     20  144  144 144 144 144 144 144


    [*,*,2]:
                            1     2   3   4   5   6   7:=

                      1  144  144 144 144 144 144 144
                      2  144  144 144 144 144 144 144
                      3  144  144 144 144 144 144 144
                      4  144  144 144 144 144 144 144
                      5  144  144 144 144 144 144 144
                      6  144  144 144 144 144 144 144
                      7  144  144 144 144 144 144 144
                      8  144  144 144 144 144 144 144
                      9  144  144 144 144 144 144 144
                     10  144  144 144 144 144 144 144
                     11  144  144 144 144 144 144 144
                     12  144  144 144 144 144 144 144
                     13  144  144 144 144 144 144 144
                     14  144  144 144 144 144 144 144
                     15  144  144 144 144 144 144 144
                     16  144  144 144 144 144 144 144
                     17  144  144 144 144 144 144 144
                     18  144  144 144 144 144 144 144
                     19  144  144 144 144 144 144 144
                     20  144  144 144 144 144 144 144

     [*,*,3]:

                          1     2   3   4   5   6   7:=

                      1  144  144 144 144 144 144 144
                      2  144  144 144 144 144 144 144
                      3  144  144 144 144 144 144 144
                      4  144  144 144 144 144 144 144
                      5  144  144 144 144 144 144 144
                      6  144  144 144 144 144 144 144
                      7  144  144 144 144 144 144 144
                      8  144  144 144 144 144 144 144
                      9  144  144 144 144 144 144 144
                     10  144  144 144 144 144 144 144
                     11  144  144 144 144 144 144 144
                     12  144  144 144 144 144 144 144
                     13  144  144 144 144 144 144 144
                     14  144  144 144 144 144 144 144
                     15  144  144 144 144 144 144 144
                     16  144  144 144 144 144 144 144
                     17  144  144 144 144 144 144 144
                     18  144  144 144 144 144 144 144
                     19  144  144 144 144 144 144 144
                     20  144  144 144 144 144 144 144;






   param availability:                                                                                                                                                                                                                                                                                                                                                                      
            1          2        3           4          5        6         7 :=  

    1       0          0        0           0          0        0         0                                                                                                                                                                                                                                                                                                                                 
    2       1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                 
    3       1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                 
    4       1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    5       1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    6       1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    7       1          0        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    8       1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    9       1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    10      1          1        1           1          1        1         1 
    11      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    12      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    13      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    14      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    15      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    16      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    17      0          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    18      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    19      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    20      1          1        1           1          1        1         1
    21      1          1        1           1          1        1         1 
    22      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    23      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    24      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    25      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    26      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    27      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    28      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    29      1          1        1           1          1        1         1                                                                                                                                                                                                                                                                                                                                     
    30      1          1        1           1          1        1         1;                                                                                                                                                                                                                                                                                                                                    




param costpershift:= 


[*,*,1]:     1          2        3           4         5        6          7 := 


    1       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    2       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    3       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    4       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    5       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    6       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    7       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    8       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    9       96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    10      96         96       96          96         96       96        96    
    11      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    12      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    13      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    14      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    15      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    16      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    17      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    18      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    19      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    20      96         96       96          96         96       96        96
    21      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    22      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    23      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    24      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    25      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    26      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    27      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    28      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    29      96         96       96          96         96       96        96                                                                                                                                                                                                                                                                                                                                        
    30      96         96       96          96         96       96        96





  [*,*,2] : 1          2        3           4          5        6         7 :=      


    1       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    2       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    3       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    4       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    5       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    6       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    7       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    8       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    9       104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    10      104        104      104         104        104      104       104   
    11      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    12      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    13      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    14      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    15      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    16      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    17      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    18      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    19      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    20      104        104      104         104        104      104       104
    21      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    22      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    23      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    24      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    25      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    26      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    27      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    28      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    29      104        104      104         104        104      104       104                                                                                                                                                                                                                                                                                                                                       
    30      104        104      104         104        104      104       104



  [*,*,3] :  1         2         3          4          5        6         7 :=  


    1       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    2       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    3       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    4       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    5       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    6       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    7       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    8       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    9       120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    10      120        120      120         120        120      120       120   
    11      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    12      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    13      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    14      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    15      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    16      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    17      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    18      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    19      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    20      120        120      120         120        120      120       120
    21      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    22      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    23      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    24      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    25      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    26      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    27      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    28      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    29      120        120      120         120        120      120       120                                                                                                                                                                                                                                                                                                                                       
    30      120        120      120         120        120      120       120;                                                                                                                                                                                                                                                      
于 2015-12-21T18:20:09.333 回答
1

因此,起初您的问题定义中有一些不寻常的事情:

  1. 这不是一个真正的优化问题,因为您的目标函数根据定义是固定的(每个班次有 7 名护士,每个班次的每个护士都有相同的价格)
  2. 在您的问题中,您定义了每班 7 名护士,最多 5 个工作日。所以你需要 7 名护士在 7 天三班倒。这等于 147 名护士/班次。但是,在五个工作日的上限和每天只有一个班次的情况下,您只有 20 名护士在 5 个班次上,这等于 100 名护士/班次。

我已经在 Mathprog 中构建了问题,但代码应该或多或少等于 AMPL。我从护士、日班和轮班的三组开始。

set shifts := {1,2,3};
set days := {1,2,3,4,5,6,7};
set nurses := {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

shedule 被定义为一组二进制变量:

var schedule{nurses, days, shifts}, binary;

简单目标包含本周所有护士/班次的总和以及相关价格:

minimize cost: sum{i in nurses, j in days}(schedule[i,j,1]*c_morning+schedule[i,j,2]*c_day+schedule[i,j,3]*c_night);

对于您的第一个约束,可以将每位护士的所有轮班总和限制为五个,因为每天只有一个轮班:

s.t. working_days{n in nurses}:
sum{i in days, j in shifts}(schedule[n,i,j]) <= 5;

休息日是问题中最难的部分。为简单起见,我创建了另一个仅包含天数的集合,其中一名护士可以连续完成四个夜班。您还可以使用原始天数来制定约束并排除前四天。

set nigth_days := {5,6,7};
    s.t. rest{n in nurses,i in nigth_days}:
    (schedule[n,i-4,3]+schedule[n,i-3,3]+schedule[n,i-2,3]+schedule[n,i-1,3]+sum{j in shifts}(schedule[n,i,j])) <= 4;

由于夜班后没有早班,我使用了与其他日子相同的尝试。第七天被排除在外,因为没有第八天我们可以找早班。

    set yester_days := {1,2,3,4,5,6};
s.t. night_morning{i in yester_days, n in nurses}:
(schedule[n,i,3]+schedule[n,i+1,1]) <= 1;

应该满足每班四名护士的需求(我减少了人数,因为超过 4 名护士是不可行的,因为 5 班的限制)

s.t. demand_shift{i in days, j in shifts}:
sum{n in nurses}(schedule[n,i,j]) = 4;

第五个限制条件是将每天的班次限制为最多一班。

s.t. one_shift{n in nurses, i in days}:
sum{ j in shifts}(schedule[n,i,j]) <= 1;
于 2015-12-08T21:22:46.073 回答