一般问题
General problems
下面是我开发的整个模型。我认为我的主要问题在于:
eq08: 应该只允许在所述手术的整个过程中安排一次手术。例如,如果手术 s 的持续时间为 7,并且安排在 t=4,在一天和一个房间,则不能在该天的 t=4、5、6、7、8、9、10 安排其他手术和房间。我认为等式不是这样做的。
eq21: 1号病房不能安排需要ag(数据中=1)的手术,但我认为它不是这样做的,而是没有在1号病房安排任何手术。
eq22:外科医生一次只能进行1次手术,但我认为不是那样做。
eq24:一些外科医生有预先分配的时间范围,其他外科医生无法使用它们,但是当我包含此约束时,它说输出文件太大。
谢谢你,贡萨洛
Sets s "Surgeries"
c "Surgeons"
d "days of the week" / monday, tuesday, wednesday, thursday, friday, saturday /
r "Operating Rooms" / 1 * 10 /
t "Timeslots, every timeslot represents 15 min" / 1*64 /
e "Surgical Spelciaties" / angyopraphy, plastic, maxilo, vascular , dermatology, neuro, general, orthopedic, urology, internal, gynecology, ophthalmology, cardiotoracic, cardiac, otolaryngology /
surg 'surgeData Header' / ds, agh, uciph /
;
Table surgData(s<,c<,e,surg) 'Surgery Data'
$onDelim
s,c,e,ds,agh,uciph
1,539662512,plastic,3,0,0
2,539662512,plastic,3,0,0
3,539662512,plastic,4,0,0
4,27840008,cardiac,18,1,1
5,61903721,general,8,1,0
6,13060008,vascular,28,1,1
7,58975712,neuro,6,1,0
8,126454322,orthopedic,11,1,0
9,772850351,orthopedic,9,1,0
10,772850351,orthopedic,6,1,0
11,999961932,orthopedic,7,1,0
12,999961932,orthopedic,8,1,0
13,999961932,orthopedic,12,1,0
14,32025401,otolaryngology,8,1,0
15,175707281,urology,7,1,0
16,175707281,urology,10,1,0
17,959053412,urology,5,1,0
18,959053412,urology,2,1,0
19,476072132,angyopraphy,4,0,0
20,6820005,angyopraphy,4,0,0
21,797391361,angyopraphy,5,0,0
22,797391361,angyopraphy,4,0,1
23,797391361,angyopraphy,3,0,1
24,6820005,angyopraphy,3,0,0
25,539662512,plastic,7,0,0
26,539662512,plastic,7,1,0
27,27740008,general,4,0,0
28,27740008,general,5,1,0
29,54140008,general,3,1,0
30,27740008,general,5,1,0
31,54140008,general,5,1,0
32,37964022,general,3,1,0
33,83940008,general,11,1,0
34,83940008,general,6,1,0
35,600739601,maxilo,5,1,0
36,4213405,maxilo,5,1,0
37,84213405,maxilo,5,1,0
38,84213405,maxilo,9,1,0
39,13060008,vascular,9,1,0
40,907897812,gynecology,11,1,0
41,54140008,internal,4,1,0
42,6030005,neuro,2,0,0
43,55837332,neuro,21,1,1
44,6030005,neuro,12,1,0
45,96440008,ophthalmology,2,0,0
46,96440008,ophthalmology,2,0,0
47,96440008,ophthalmology,2,1,0
48,96440008,ophthalmology,4,1,0
49,60551181,ophthalmology,1,0,0
50,911073202,ophthalmology,1,0,0
51,686633612,orthopedic, 9,0,0
52,6251005,orthopedic,7,1,0
53,502682702,orthopedic,5,1,0
54,502682702,orthopedic,4,1,0
55,63840008,orthopedic,7,1,0
56,502682702,orthopedic,7,1,0
57,63840008,orthopedic,5,1,0
58,489248032,orthopedic,4,1,0
59,63840008,orthopedic,9,1,1
60,6251005,orthopedic,11,0,0
61,770964121,otolaryngology,7,1,0
62,5670005,otolaryngology,10,1,0
63,70964121,otolaryngology,5,1,0
64,5670005,otolaryngology,8,1,0
65,9231005,urology,2,0,0
66,9231005,urology,6,1,1
67,9231005,urology,11,1,0
68,608075771,urology,5,1,0
69,749054931,urology,5,1,1
70,4820005,angyopraphy,4,0,1
71,4820005,angyopraphy,8,0,1
72,4820005,angyopraphy,9,0,1
73,27740008,general,6,0,0
74,27740008,general,4,1,0
75,54140008,general,7,1,0
76,27740008,general,18,1,0
77,54140008,general,3,1,0
78,27740008,general,9,1,0
79,987063311,general,9,1,0
80,987063311,general,4,1,0
81,987063311,general,4,1,0
82,987063311,general,6,1,0
83,13060008,vascular,5,1,0
84,13060008,vascular,11,1,1
85,81060008,dermatology,2,0,0
86,81060008,dermatology,2,0,0
87,81060008,dermatology,2,0,0
88,81060008,dermatology,2,0,0
89,81060008,dermatology,2,0,0
90,13060008,internal,11,1,0
91,24590008,neuro,13,1,0
92,6030005,neuro,15,1,0
93,96440008,ophthalmology,2,0,0
94,96440008,ophthalmology,2,0,0
95,96440008,ophthalmology,2,0,0
96,96440008,ophthalmology,2,0,0
97,96440008,ophthalmology,1,0,0
98,911073202,ophthalmology,7,1,0
99,96440008,ophthalmology,3,1,0
100,96440008,ophthalmology,2,1,0
$offDelim
;
Table Max_Timeslots(d,r) "maximum time each or can be open on each day"
1 2 3 4 5 6 7 8 9 10
monday 64 64 64 64 64 64 64 48 64 64
tuesday 64 64 64 64 64 64 64 48 64 64
wednesday 64 64 64 64 64 64 64 48 64 64
thursday 64 64 64 64 64 64 64 48 64 64
friday 64 64 64 64 64 64 64 48 64 64
saturday 32 32 32 32 32 32 32 32 32 32
;
Scalars laser "number of urology lasers available" / 2 /
orthopedic "number of orthopedic surgeries allowed at the same time" / 4 /
ucip "number of available beds in the UCIP on day d" / 7 /
TimeSlotDuration "one timeslot of 15 minutes" /1/;
Parameter time(t) "set to scalar" /
1 1,2 2,3 3,4 4,5 5, 6 6,7 7,8 8,9 9,10 10,11 11,12 12,13 13,14 14,15 15,16 16,17 17,18 18,19 19,20 20,21 21,22 22,23 23,24 24,25 25,26 26,27 27,28 28,29 29,30 30,31 31,32 32,33 33,34 34,35 35,36 36,37 37,38 38,39 39,40 41,42 42,43 43,44 44,45 45,46 46,47 47,48 48,49 49,50 50,51 51,52 52,53 53,54 54,55 55,56 56,57 57,58 58,59 59,60 60,61 61,62 62,63 63,64 64
/;
Parameter UrologyLimit(e) /urology 1/;
Parameter OrthopedicLimit(e) /orthopedic 1/;
Parameter SpecialtyRoom (r,e) / 1 .(ophthalmology) 1
2 .(neuro) 1
3 .(general) 1
4 .(general) 1
5 .(orthopedic) 1
6 .(orthopedic) 1
7 .(urology, gynecology) 1
8 .(angyopraphy, plastic, maxilo, vascular , dermatology, neuro, general, orthopedic, urology, internal, gynecology, ophthalmology, cardiotoracic, cardiac, otolaryngology) 1
9 .(otolaryngology) 1
10 .(angyopraphy, vascular, internal, cardiac, maxilo, plastic) 1/;
Parameter AGroom(r) /1 0,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 1,10 1/;
parameter SurgeonsSlots(c,d,r,t)
/
6030005 .(tuesday) .(2). (1*24) 1
70640008 .(thursday) .(4). (1*28) 1
9240005 .(tuesday) .(5). (1*32) 1
7150005 .(monday) .(6). (1*26) 1
9480005 .(monday) .(6). (40*64) 1
3670005 .(wednesday) .(7). (25*64) 1
70240008 .(wednesday) .(8). (40*64) 1
/;
Set couple(s,c,e) 'Sugery, surgeon, specialty';
option couple<surgData;
Variables
alpha_start(s,c,e,d,t,r) '1 if surgery s is scheduled to start by surgeon c in timeslot t, room r, day d, 0 otherwise'
obj1 'objective variable'
;
Binary variable alpha_start;
Free Variable obj1;
Equations
eq01 'the number of surgeries scheduled for the week is maximized (objective)'
eq03(s,c,e) 'ensure that all surgeries are scheduled at most once'
eq07(d,r) 'not allow to surpass the available time on each room on each day'
eq08(d,r) 'the surgery starting in a timeslot, room and day is scheduled at least for the number of timeslots correspondent to its duration'
eq09(s,c,e,d,t,r) 'not allow for overtime'
eq13(d) 'ICU capacity can’t be exceeded '
eq17(t) 'no surgery is scheduled in a way that exceeds the number of urology lasers'
eq20(t) 'max of 4 orthopedic surgeries at the same time'
eq21(s,c,e,d,t,r) 'no surgery requiring genereal anestheology in r=1'
eq22(s,c,e,d,t) 'each surgeon participates at most in one surgery at any point in time'
eq24(c,d,t,r) 'certain surgeons have a pre-assigned time frame and no other surgeon can use that time frame'
;
Alias(s,si);
Alias(d,di);
Alias(t,ti);
Alias(r,ri);
Alias(c,ci);
Alias(e,ei);
* Objective (test the equation bellow as well where certain specialties should be scheduled in certain rooms'
eq01.. obj1 =e= sum(couple(s,c,e), sum(di,sum(ti,sum(ri, alpha_start(couple, di,ti,ri)))));
*eq01.. obj1 =e= sum(si,sum(ci, sum(di,sum(ti,sum(ri, sum(ei, SpecialtyRoom(ri,ei)*alpha_start(si,ci,ei,di,ti,ri)))))));
* Ceneral Constraints
eq03(couple).. sum(di, sum(ti, sum(ri, alpha_start(couple,di,ti,ri)))) =l= 1;
eq07(d,r).. sum(couple(s,c,e), sum(ti, alpha_start(couple,d,ti,r)*surgData(couple,"ds"))) =l= Max_Timeslots(d,r);
*eq08(d,r).. sum(couple(s,c,e),sum(ti$[ord(ti) <= time(ti)+surgData(couple,"ds")-1],alpha_start(couple,d,ti,r))) =l= 1;
eq09(couple,d,t,r).. alpha_start(couple,d,t,r)*surgData(couple,"ds") =l= card(t)- time(t);
*Specialties/Equipment Constraints
eq13(d).. sum(couple(s,c,e),sum(ti, sum(ri, surgData(couple,"uciph")*alpha_start(couple,d,ti,ri)))) =l= ucip;
eq17(t).. sum(couple(s,c,e),sum(ri, sum(di, UrologyLimit(e)*alpha_start(couple,di,t,ri)))) =l= laser;
eq20(t).. sum(couple(s,c,e), sum(ri, sum(di, OrthopedicLimit(e)*alpha_start(couple,di,t,ri)))) =l= orthopedic;
eq21(couple,d,t,r).. alpha_start(couple,d,t,r)*surgData(couple,"agh") =l= AGroom(r);
eq22(couple,d,t).. sum(ri, alpha_start(couple,d,t,ri)) =l= 1;
*eq24(c,d,t,r)$(SurgeonsSlots(c,d,r,t)).. sum(si, alpha_start(si,c,d,t,r)) =l= SurgeonsSlots(c,d,r,t);
model ORScheduling / all /;
option limcol=0,limrow=0,solprint=off;
Solve ORScheduling using mip maximizing obj1;
Display obj1.l;
Display alpha_start.l;
我得到了一个不同的错误,但对我来说,看起来你真的想要 surgData
是一个 4 维符号。因此,如果我将 Table ...
行更改为
Table surgData(s<,c,e,surg) 'Surgery Data'
我觉得一切都很好。
下面是我开发的整个模型。我认为我的主要问题在于:
eq08: 应该只允许在所述手术的整个过程中安排一次手术。例如,如果手术 s 的持续时间为 7,并且安排在 t=4,在一天和一个房间,则不能在该天的 t=4、5、6、7、8、9、10 安排其他手术和房间。我认为等式不是这样做的。
eq21: 1号病房不能安排需要ag(数据中=1)的手术,但我认为它不是这样做的,而是没有在1号病房安排任何手术。
eq22:外科医生一次只能进行1次手术,但我认为不是那样做。
eq24:一些外科医生有预先分配的时间范围,其他外科医生无法使用它们,但是当我包含此约束时,它说输出文件太大。
谢谢你,贡萨洛
Sets s "Surgeries"
c "Surgeons"
d "days of the week" / monday, tuesday, wednesday, thursday, friday, saturday /
r "Operating Rooms" / 1 * 10 /
t "Timeslots, every timeslot represents 15 min" / 1*64 /
e "Surgical Spelciaties" / angyopraphy, plastic, maxilo, vascular , dermatology, neuro, general, orthopedic, urology, internal, gynecology, ophthalmology, cardiotoracic, cardiac, otolaryngology /
surg 'surgeData Header' / ds, agh, uciph /
;
Table surgData(s<,c<,e,surg) 'Surgery Data'
$onDelim
s,c,e,ds,agh,uciph
1,539662512,plastic,3,0,0
2,539662512,plastic,3,0,0
3,539662512,plastic,4,0,0
4,27840008,cardiac,18,1,1
5,61903721,general,8,1,0
6,13060008,vascular,28,1,1
7,58975712,neuro,6,1,0
8,126454322,orthopedic,11,1,0
9,772850351,orthopedic,9,1,0
10,772850351,orthopedic,6,1,0
11,999961932,orthopedic,7,1,0
12,999961932,orthopedic,8,1,0
13,999961932,orthopedic,12,1,0
14,32025401,otolaryngology,8,1,0
15,175707281,urology,7,1,0
16,175707281,urology,10,1,0
17,959053412,urology,5,1,0
18,959053412,urology,2,1,0
19,476072132,angyopraphy,4,0,0
20,6820005,angyopraphy,4,0,0
21,797391361,angyopraphy,5,0,0
22,797391361,angyopraphy,4,0,1
23,797391361,angyopraphy,3,0,1
24,6820005,angyopraphy,3,0,0
25,539662512,plastic,7,0,0
26,539662512,plastic,7,1,0
27,27740008,general,4,0,0
28,27740008,general,5,1,0
29,54140008,general,3,1,0
30,27740008,general,5,1,0
31,54140008,general,5,1,0
32,37964022,general,3,1,0
33,83940008,general,11,1,0
34,83940008,general,6,1,0
35,600739601,maxilo,5,1,0
36,4213405,maxilo,5,1,0
37,84213405,maxilo,5,1,0
38,84213405,maxilo,9,1,0
39,13060008,vascular,9,1,0
40,907897812,gynecology,11,1,0
41,54140008,internal,4,1,0
42,6030005,neuro,2,0,0
43,55837332,neuro,21,1,1
44,6030005,neuro,12,1,0
45,96440008,ophthalmology,2,0,0
46,96440008,ophthalmology,2,0,0
47,96440008,ophthalmology,2,1,0
48,96440008,ophthalmology,4,1,0
49,60551181,ophthalmology,1,0,0
50,911073202,ophthalmology,1,0,0
51,686633612,orthopedic, 9,0,0
52,6251005,orthopedic,7,1,0
53,502682702,orthopedic,5,1,0
54,502682702,orthopedic,4,1,0
55,63840008,orthopedic,7,1,0
56,502682702,orthopedic,7,1,0
57,63840008,orthopedic,5,1,0
58,489248032,orthopedic,4,1,0
59,63840008,orthopedic,9,1,1
60,6251005,orthopedic,11,0,0
61,770964121,otolaryngology,7,1,0
62,5670005,otolaryngology,10,1,0
63,70964121,otolaryngology,5,1,0
64,5670005,otolaryngology,8,1,0
65,9231005,urology,2,0,0
66,9231005,urology,6,1,1
67,9231005,urology,11,1,0
68,608075771,urology,5,1,0
69,749054931,urology,5,1,1
70,4820005,angyopraphy,4,0,1
71,4820005,angyopraphy,8,0,1
72,4820005,angyopraphy,9,0,1
73,27740008,general,6,0,0
74,27740008,general,4,1,0
75,54140008,general,7,1,0
76,27740008,general,18,1,0
77,54140008,general,3,1,0
78,27740008,general,9,1,0
79,987063311,general,9,1,0
80,987063311,general,4,1,0
81,987063311,general,4,1,0
82,987063311,general,6,1,0
83,13060008,vascular,5,1,0
84,13060008,vascular,11,1,1
85,81060008,dermatology,2,0,0
86,81060008,dermatology,2,0,0
87,81060008,dermatology,2,0,0
88,81060008,dermatology,2,0,0
89,81060008,dermatology,2,0,0
90,13060008,internal,11,1,0
91,24590008,neuro,13,1,0
92,6030005,neuro,15,1,0
93,96440008,ophthalmology,2,0,0
94,96440008,ophthalmology,2,0,0
95,96440008,ophthalmology,2,0,0
96,96440008,ophthalmology,2,0,0
97,96440008,ophthalmology,1,0,0
98,911073202,ophthalmology,7,1,0
99,96440008,ophthalmology,3,1,0
100,96440008,ophthalmology,2,1,0
$offDelim
;
Table Max_Timeslots(d,r) "maximum time each or can be open on each day"
1 2 3 4 5 6 7 8 9 10
monday 64 64 64 64 64 64 64 48 64 64
tuesday 64 64 64 64 64 64 64 48 64 64
wednesday 64 64 64 64 64 64 64 48 64 64
thursday 64 64 64 64 64 64 64 48 64 64
friday 64 64 64 64 64 64 64 48 64 64
saturday 32 32 32 32 32 32 32 32 32 32
;
Scalars laser "number of urology lasers available" / 2 /
orthopedic "number of orthopedic surgeries allowed at the same time" / 4 /
ucip "number of available beds in the UCIP on day d" / 7 /
TimeSlotDuration "one timeslot of 15 minutes" /1/;
Parameter time(t) "set to scalar" /
1 1,2 2,3 3,4 4,5 5, 6 6,7 7,8 8,9 9,10 10,11 11,12 12,13 13,14 14,15 15,16 16,17 17,18 18,19 19,20 20,21 21,22 22,23 23,24 24,25 25,26 26,27 27,28 28,29 29,30 30,31 31,32 32,33 33,34 34,35 35,36 36,37 37,38 38,39 39,40 41,42 42,43 43,44 44,45 45,46 46,47 47,48 48,49 49,50 50,51 51,52 52,53 53,54 54,55 55,56 56,57 57,58 58,59 59,60 60,61 61,62 62,63 63,64 64
/;
Parameter UrologyLimit(e) /urology 1/;
Parameter OrthopedicLimit(e) /orthopedic 1/;
Parameter SpecialtyRoom (r,e) / 1 .(ophthalmology) 1
2 .(neuro) 1
3 .(general) 1
4 .(general) 1
5 .(orthopedic) 1
6 .(orthopedic) 1
7 .(urology, gynecology) 1
8 .(angyopraphy, plastic, maxilo, vascular , dermatology, neuro, general, orthopedic, urology, internal, gynecology, ophthalmology, cardiotoracic, cardiac, otolaryngology) 1
9 .(otolaryngology) 1
10 .(angyopraphy, vascular, internal, cardiac, maxilo, plastic) 1/;
Parameter AGroom(r) /1 0,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 1,10 1/;
parameter SurgeonsSlots(c,d,r,t)
/
6030005 .(tuesday) .(2). (1*24) 1
70640008 .(thursday) .(4). (1*28) 1
9240005 .(tuesday) .(5). (1*32) 1
7150005 .(monday) .(6). (1*26) 1
9480005 .(monday) .(6). (40*64) 1
3670005 .(wednesday) .(7). (25*64) 1
70240008 .(wednesday) .(8). (40*64) 1
/;
Set couple(s,c,e) 'Sugery, surgeon, specialty';
option couple<surgData;
Variables
alpha_start(s,c,e,d,t,r) '1 if surgery s is scheduled to start by surgeon c in timeslot t, room r, day d, 0 otherwise'
obj1 'objective variable'
;
Binary variable alpha_start;
Free Variable obj1;
Equations
eq01 'the number of surgeries scheduled for the week is maximized (objective)'
eq03(s,c,e) 'ensure that all surgeries are scheduled at most once'
eq07(d,r) 'not allow to surpass the available time on each room on each day'
eq08(d,r) 'the surgery starting in a timeslot, room and day is scheduled at least for the number of timeslots correspondent to its duration'
eq09(s,c,e,d,t,r) 'not allow for overtime'
eq13(d) 'ICU capacity can’t be exceeded '
eq17(t) 'no surgery is scheduled in a way that exceeds the number of urology lasers'
eq20(t) 'max of 4 orthopedic surgeries at the same time'
eq21(s,c,e,d,t,r) 'no surgery requiring genereal anestheology in r=1'
eq22(s,c,e,d,t) 'each surgeon participates at most in one surgery at any point in time'
eq24(c,d,t,r) 'certain surgeons have a pre-assigned time frame and no other surgeon can use that time frame'
;
Alias(s,si);
Alias(d,di);
Alias(t,ti);
Alias(r,ri);
Alias(c,ci);
Alias(e,ei);
* Objective (test the equation bellow as well where certain specialties should be scheduled in certain rooms'
eq01.. obj1 =e= sum(couple(s,c,e), sum(di,sum(ti,sum(ri, alpha_start(couple, di,ti,ri)))));
*eq01.. obj1 =e= sum(si,sum(ci, sum(di,sum(ti,sum(ri, sum(ei, SpecialtyRoom(ri,ei)*alpha_start(si,ci,ei,di,ti,ri)))))));
* Ceneral Constraints
eq03(couple).. sum(di, sum(ti, sum(ri, alpha_start(couple,di,ti,ri)))) =l= 1;
eq07(d,r).. sum(couple(s,c,e), sum(ti, alpha_start(couple,d,ti,r)*surgData(couple,"ds"))) =l= Max_Timeslots(d,r);
*eq08(d,r).. sum(couple(s,c,e),sum(ti$[ord(ti) <= time(ti)+surgData(couple,"ds")-1],alpha_start(couple,d,ti,r))) =l= 1;
eq09(couple,d,t,r).. alpha_start(couple,d,t,r)*surgData(couple,"ds") =l= card(t)- time(t);
*Specialties/Equipment Constraints
eq13(d).. sum(couple(s,c,e),sum(ti, sum(ri, surgData(couple,"uciph")*alpha_start(couple,d,ti,ri)))) =l= ucip;
eq17(t).. sum(couple(s,c,e),sum(ri, sum(di, UrologyLimit(e)*alpha_start(couple,di,t,ri)))) =l= laser;
eq20(t).. sum(couple(s,c,e), sum(ri, sum(di, OrthopedicLimit(e)*alpha_start(couple,di,t,ri)))) =l= orthopedic;
eq21(couple,d,t,r).. alpha_start(couple,d,t,r)*surgData(couple,"agh") =l= AGroom(r);
eq22(couple,d,t).. sum(ri, alpha_start(couple,d,t,ri)) =l= 1;
*eq24(c,d,t,r)$(SurgeonsSlots(c,d,r,t)).. sum(si, alpha_start(si,c,d,t,r)) =l= SurgeonsSlots(c,d,r,t);
model ORScheduling / all /;
option limcol=0,limrow=0,solprint=off;
Solve ORScheduling using mip maximizing obj1;
Display obj1.l;
Display alpha_start.l;
我得到了一个不同的错误,但对我来说,看起来你真的想要 surgData
是一个 4 维符号。因此,如果我将 Table ...
行更改为
Table surgData(s<,c,e,surg) 'Surgery Data'
我觉得一切都很好。