9つある委員会は、全て日勤です。解から、開催日を人手が割り出すのは手間です。また、ソフトエラーがあった場合、必ずしも、目的の人数が確保できている訳ではありませんので、最大確保できた日を報告することとします。また、確保できなかった場合、長日勤を含めてカウントするとどうなるかも報告しています。
このプロジェクトは、多人数かつタイトなプロジェクトで時間がかなりかかっています。
import sc3
import itertools
import ctypes
def 委員会制約():
MessageBox = ctypes.windll.user32.MessageBoxW
res=MessageBox(HWND, '委員会に長日を含めますか?(推奨)', '長日を含める選択', 3)
include_long=False
if res==6:
include_long=True
use_hard_constraint=False
res=MessageBox(HWND, '委員会制約をハード制約にしますか?(推奨)', '委員会制約をハード制約にする選択', 3)
if res==6:
use_hard_constraint=True
global_vars = globals()
print("グローバル変数一覧:")
for var_name, var_value in global_vars.items():
if '委員会' in var_name and isinstance(var_value,list):#委員会という名前を持つリストオブジェクトのみリストアップ
assign_comittee(var_name,var_value[0],include_long,use_hard_constraint)# ":", var_value)
def assign_comittee(name,vars_list,include_long,use_hard_constraint):
print(name,vars_list,include_long)
day_end=100
if name=='現任教育委員会' or name=='新任教育委員会':#10日までに開催委員会
day_end=制約開始日+10
day_list=[]
for day in 今月稼働日:
and_list=[]
for person in vars_list:
v=sc3.GetShiftVar(person,day,'日勤')
if include_long:
v2=sc3.GetShiftVar(person,day,'ロング日勤')
and_list.append(v2|v)
else:
and_list.append(v)
vx=sc3.And(and_list)
day_list.append(vx)
if day>day_end:
break
if use_hard_constraint:
sc3.AddHard(sc3.Or(day_list),name)
else :
sc3.AddSoft(sc3.Or(day_list),name,5)
def check_comittee_sub(name,vars_list,include_long=False):
#print(name,vars_list)
day_end=100
if name=='現任教育委員会' or name=='新任教育委員会':#10日までに開催委員会
day_end=制約開始日+10
day_list=[]
big_cnt_day=0
big_cnt=0
for day in 今月稼働日:
and_cnt=0
for person in vars_list:
if include_long:
v=shift_solution[person][day]=='日勤' or shift_solution[person][day]=='ロング日勤' or shift_solution[person][day]=='ロング日勤単発'
else:
v=shift_solution[person][day]=='日勤'
if v:
and_cnt+=1
if and_cnt>big_cnt:
big_cnt=and_cnt
big_cnt_day=day
if big_cnt==len(vars_list):
day_list.append(day)
if day>day_end:
break
success=True
if len(day_list)>=1:
if include_long:
print("長日を含めると")
print("successful ",name)
for day in day_list:
print(name,"委員会日は、",daydef[day],"参加者全員は",len(vars_list),"人です")
print("")
else:
if include_long:
print("長日を含めても")
print("unsuccessful ",name,len(vars_list),"人に対して",big_cnt,"人しかアサインされていません。",daydef[day])
success=False
if include_long:
print("")
return success
def check_comittee():
global_vars = globals()
print("グローバル変数一覧:")
for var_name, var_value in global_vars.items():
if '委員会' in var_name and isinstance(var_value,list):#list list
success=check_comittee_sub(var_name,var_value[0])# ":", var_value)
if not success:
check_comittee_sub(var_name,var_value[0],True)
def post_main():
check_comittee()
委員会制約()
ポスト処理後は、以下の表示となりました。
コンパイルの準備中
ソルバを呼び出し中です。
制約をコンパイル中です。
Python プロパティファイルの生成が終わりました。
グローバル変数一覧:
現任教育委員会 [5, 22, 28, 33, 46, 51, 56] False
新任教育委員会 [2, 29, 32, 54, 58, 62] False
リスク委員会 [3, 25, 31, 57, 64] False
感染委員会 [4, 24, 37, 55, 59, 66] False
業務委員会 [2, 21, 39, 52, 62, 65] False
倫理委員会 [3, 34, 41, 42, 49, 61] False
ケア委員会 [3, 23, 43, 48, 50, 53] False
教育企画委員会 [5, 6, 19, 30, 35, 45] False
記録委員会 [4, 26, 27, 38, 47, 60] False
Aチームリーダ会議 [6, 8, 9, 10] [12, 13, 14, 15, 16, 17, 18] 2
Bチームリーダ会議 [7, 11, 12, 13] [12, 13, 14, 15, 16, 17, 18] 2
今月休日8人以上 8 [5, 11, 12, 13, 18, 19, 25, 26, 32, 33] [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, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]
今月平日副看護師長会議日以外9人以上 9 [6, 7, 8, 9, 10, 14, 15, 16, 17, 20, 21, 22, 23, 27, 28, 29, 30, 31, 34, 35] [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, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]
今月副看護師長会議日9人以上 9 [24] [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, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]
Algorithm 1 Solving Process Started..
o 2887 16.728000(sec)
o 2738 16.861000(sec)
o 2677 17.144000(sec)
o 2593 17.609000(sec)
o 2534 17.730000(sec)
o 2509 17.818000(sec)
o 2440 17.914000(sec)
o 2418 18.003000(sec)
o 2363 18.090000(sec)
o 2318 18.174000(sec)
o 2282 18.281000(sec)
o 2265 18.373000(sec)
o 2219 18.473000(sec)
o 2150 18.576000(sec)
o 2022 18.726000(sec)
o 2003 18.808000(sec)
o 1948 18.896000(sec)
o 1890 18.983000(sec)
o 1883 19.061000(sec)
o 1843 19.139000(sec)
o 1789 19.299000(sec)
o 1733 19.433000(sec)
o 1670 19.525000(sec)
o 1642 19.630000(sec)
o 1587 19.798000(sec)
o 1573 19.878000(sec)
o 1497 20.035000(sec)
o 1432 20.116000(sec)
o 1340 20.400000(sec)
o 1332 20.482000(sec)
o 1315 20.592000(sec)
o 1278 20.767000(sec)
o 1194 20.913000(sec)
o 1172 20.993000(sec)
o 1112 21.085000(sec)
o 1104 21.164000(sec)
o 1094 21.243000(sec)
o 1073 21.326000(sec)
o 1024 21.616000(sec)
o 1006 21.699000(sec)
o 999 21.780000(sec)
o 972 21.869000(sec)
o 939 21.958000(sec)
o 927 22.037000(sec)
o 911 22.118000(sec)
o 897 22.208000(sec)
o 864 22.312000(sec)
o 857 22.393000(sec)
o 832 22.479000(sec)
o 825 22.575000(sec)
o 807 22.656000(sec)
o 784 22.761000(sec)
o 770 22.868000(sec)
o 764 22.948000(sec)
o 749 23.195000(sec)
o 708 23.274000(sec)
o 692 23.360000(sec)
o 684 23.445000(sec)
o 669 23.537000(sec)
o 646 23.637000(sec)
o 632 23.819000(sec)
o 611 23.956000(sec)
o 586 24.037000(sec)
o 571 24.119000(sec)
o 548 24.383000(sec)
o 521 24.496000(sec)
o 504 24.592000(sec)
o 497 24.870000(sec)
o 490 24.955000(sec)
o 468 25.050000(sec)
o 442 25.287000(sec)
o 438 25.372000(sec)
o 416 25.457000(sec)
o 407 25.539000(sec)
o 392 25.808000(sec)
o 376 25.903000(sec)
o 368 25.984000(sec)
o 353 26.120000(sec)
o 350 40.217000(sec)
o 338 40.329000(sec)
o 333 40.490000(sec)
o 329 40.598000(sec)
o 323 40.742000(sec)
o 308 40.834000(sec)
o 295 41.180000(sec)
o 291 41.284000(sec)
o 287 41.526000(sec)
o 280 41.625000(sec)
o 272 41.704000(sec)
o 267 55.882000(sec)
o 262 56.089000(sec)
o 257 56.176000(sec)
o 252 56.261000(sec)
o 247 56.582000(sec)
o 239 56.681000(sec)
o 231 56.787000(sec)
o 226 56.873000(sec)
o 221 56.964000(sec)
o 213 81.083000(sec)
o 212 105.596000(sec)
o 210 105.677000(sec)
o 206 105.769000(sec)
o 202 105.848000(sec)
o 198 106.304000(sec)
o 196 106.438000(sec)
o 194 106.518000(sec)
o 191 106.757000(sec)
o 190 106.837000(sec)
o 188 106.933000(sec)
o 186 107.012000(sec)
o 184 107.386000(sec)
o 183 107.742000(sec)
o 181 108.191000(sec)
o 178 108.484000(sec)
o 176 108.569000(sec)
o 174 109.120000(sec)
o 170 109.210000(sec)
o 168 109.290000(sec)
o 166 109.373000(sec)
o 164 109.656000(sec)
o 162 109.930000(sec)
o 160 110.008000(sec)
o 158 110.088000(sec)
o 156 110.167000(sec)
o 154 110.430000(sec)
o 149 110.526000(sec)
o 147 110.606000(sec)
o 145 110.687000(sec)
o 143 110.925000(sec)
o 141 111.321000(sec)
o 135 111.558000(sec)
o 134 111.643000(sec)
o 132 111.784000(sec)
o 130 111.864000(sec)
o 128 111.943000(sec)
o 126 112.346000(sec)
o 125 112.451000(sec)
o 123 112.530000(sec)
o 121 112.622000(sec)
o 120 137.179000(sec)
o 118 137.262000(sec)
o 115 137.376000(sec)
o 113 137.460000(sec)
o 112 137.970000(sec)
o 109 138.207000(sec)
o 108 138.288000(sec)
o 107 138.368000(sec)
o 106 138.965000(sec)
o 105 139.044000(sec)
o 104 139.125000(sec)
o 103 139.205000(sec)
o 101 139.556000(sec)
o 98 139.636000(sec)
o 97 140.223000(sec)
o 92 140.411000(sec)
o 91 140.494000(sec)
o 89 140.575000(sec)
o 88 140.654000(sec)
o 86 140.734000(sec)
o 85 140.819000(sec)
o 84 140.901000(sec)
o 82 141.306000(sec)
o 81 141.384000(sec)
o 80 141.465000(sec)
o 78 141.546000(sec)
o 77 141.707000(sec)
o 76 141.787000(sec)
o 74 141.900000(sec)
o 72 141.980000(sec)
o 70 142.111000(sec)
o 68 142.191000(sec)
o 67 142.270000(sec)
o 66 142.357000(sec)
o 65 142.514000(sec)
o 64 142.846000(sec)
o 62 142.926000(sec)
o 59 143.006000(sec)
o 58 143.085000(sec)
o 55 143.165000(sec)
o 54 143.245000(sec)
o 52 143.324000(sec)
o 50 143.405000(sec)
o 49 143.484000(sec)
o 48 143.896000(sec)
o 46 143.976000(sec)
o 43 144.054000(sec)
o 41 144.261000(sec)
o 40 144.341000(sec)
o 39 144.449000(sec)
o 37 144.586000(sec)
o 36 144.667000(sec)
o 35 144.748000(sec)
o 34 144.857000(sec)
o 33 147.963000(sec)
o 32 148.264000(sec)
o 31 148.850000(sec)
o 30 149.683000(sec)
o 29 152.470000(sec)
o 28 152.940000(sec)
o 27 155.131000(sec)
o 26 157.387000(sec)
o 25 157.683000(sec)
o 23 160.193000(sec)
o 22 160.365000(sec)
o 21 160.537000(sec)
o 20 160.705000(sec)
o 19 161.021000(sec)
o 18 163.325000(sec)
o 17 164.045000(sec)
o 16 170.757000(sec)
o 15 171.258000(sec)
o 14 173.438000(sec)
o 12 173.907000(sec)
o 10 175.485000(sec)
o 9 188.802000(sec)
o 8 191.120000(sec)
o 7 215.816000(sec)
o 6 220.261000(sec)
o 5 223.345000(sec)
Python プロパティファイルの生成が終わりました。
_____________________________________
| | | |
| Weight | Errors | Cost |
|___________|___________|_____________|
| | | |
| 7 | 0 | 0 |
| 6 | 0 | 0 |
| 5 | 0 | 0 |
| 3 | 0 | 0 |
| 2 | 2 | 4 |
| 1 | 1 | 1 |
|___________|___________|_____________|
| | |
| Total | 5 |
|_______________________|_____________|
*********UB=5(0) 267.77(cpu sec)
o 5(0)
解探索が終了しました。 270 (秒)
解が得られました。
ポスト処理を実行します。ソルバを呼び出し中です。
グローバル変数一覧:
successful 現任教育委員会
現任教育委員会 委員会日は、 2023-10-11 参加者全員は 7 人です
現任教育委員会 委員会日は、 2023-10-12 参加者全員は 7 人です
successful 新任教育委員会
新任教育委員会 委員会日は、 2023-10-02 参加者全員は 6 人です
新任教育委員会 委員会日は、 2023-10-03 参加者全員は 6 人です
新任教育委員会 委員会日は、 2023-10-04 参加者全員は 6 人です
新任教育委員会 委員会日は、 2023-10-05 参加者全員は 6 人です
新任教育委員会 委員会日は、 2023-10-06 参加者全員は 6 人です
新任教育委員会 委員会日は、 2023-10-10 参加者全員は 6 人です
新任教育委員会 委員会日は、 2023-10-11 参加者全員は 6 人です
新任教育委員会 委員会日は、 2023-10-12 参加者全員は 6 人です
successful リスク委員会
リスク委員会 委員会日は、 2023-10-30 参加者全員は 5 人です
リスク委員会 委員会日は、 2023-10-31 参加者全員は 5 人です
successful 感染委員会
感染委員会 委員会日は、 2023-10-02 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-03 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-04 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-05 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-06 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-10 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-11 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-12 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-13 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-16 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-17 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-18 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-19 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-20 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-23 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-24 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-25 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-26 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-27 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-30 参加者全員は 6 人です
感染委員会 委員会日は、 2023-10-31 参加者全員は 6 人です
successful 業務委員会
業務委員会 委員会日は、 2023-10-20 参加者全員は 6 人です
業務委員会 委員会日は、 2023-10-23 参加者全員は 6 人です
業務委員会 委員会日は、 2023-10-24 参加者全員は 6 人です
業務委員会 委員会日は、 2023-10-25 参加者全員は 6 人です
業務委員会 委員会日は、 2023-10-26 参加者全員は 6 人です
業務委員会 委員会日は、 2023-10-27 参加者全員は 6 人です
業務委員会 委員会日は、 2023-10-30 参加者全員は 6 人です
業務委員会 委員会日は、 2023-10-31 参加者全員は 6 人です
successful 倫理委員会
倫理委員会 委員会日は、 2023-10-31 参加者全員は 6 人です
successful ケア委員会
ケア委員会 委員会日は、 2023-10-23 参加者全員は 6 人です
ケア委員会 委員会日は、 2023-10-24 参加者全員は 6 人です
ケア委員会 委員会日は、 2023-10-25 参加者全員は 6 人です
ケア委員会 委員会日は、 2023-10-26 参加者全員は 6 人です
ケア委員会 委員会日は、 2023-10-27 参加者全員は 6 人です
ケア委員会 委員会日は、 2023-10-30 参加者全員は 6 人です
ケア委員会 委員会日は、 2023-10-31 参加者全員は 6 人です
successful 教育企画委員会
教育企画委員会 委員会日は、 2023-10-26 参加者全員は 6 人です
教育企画委員会 委員会日は、 2023-10-27 参加者全員は 6 人です
教育企画委員会 委員会日は、 2023-10-30 参加者全員は 6 人です
教育企画委員会 委員会日は、 2023-10-31 参加者全員は 6 人です
successful 記録委員会
記録委員会 委員会日は、 2023-10-05 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-06 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-10 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-11 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-12 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-13 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-16 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-17 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-18 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-19 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-20 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-23 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-24 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-25 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-26 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-27 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-30 参加者全員は 6 人です
記録委員会 委員会日は、 2023-10-31 参加者全員は 6 人です
Aチームリーダ会議 [6, 8, 9, 10] [12, 13, 14, 15, 16, 17, 18] 2
Aチームリーダ会議は確保できました。必要人数 2 人に対して 2 人確保しました。 2023-10-12
Bチームリーダ会議 [7, 11, 12, 13] [12, 13, 14, 15, 16, 17, 18] 2
Bチームリーダ会議は確保できました。必要人数 2 人に対して 2 人確保しました。 2023-10-10
ポスト処理を終了しました。 1 (秒)