#staffdef staffdef=['川畑拓也','中田拓実','高橋真央','友安美琴','降矢悠司','横山加奈','渡邊夏希'] #daydef 制約開始日=5 制約終了日=34 表示開始日=0 daydef=['2017-05-27','2017-05-28','2017-05-29','2017-05-30','2017-05-31','2017-06-01','2017-06-02','2017-06-03','2017-06-04','2017-06-05','2017-06-06','2017-06-07','2017-06-08','2017-06-09','2017-06-10','2017-06-11','2017-06-12','2017-06-13','2017-06-14','2017-06-15','2017-06-16','2017-06-17','2017-06-18','2017-06-19','2017-06-20','2017-06-21','2017-06-22','2017-06-23','2017-06-24','2017-06-25','2017-06-26','2017-06-27','2017-06-28','2017-06-29','2017-06-30'] #shiftdef オンコール=0 代休=1 休み=2 半日代休=3 外来勤務=4 希半=5 希望休み=6 訪問看護=7 #staffcollection 全スタッフ=[0,1,2,3,4,5,6] 常勤=[0,1,2,3,4,5] パート=[6] 常時オンコールしない=[6] 月曜オンコールしない=[5] 火曜オンコールしない=[] 水曜オンコールしない=[] 木曜オンコールしない=[] 金曜オンコールしない=[] 訪看しない=[5,6] 水曜休み=[5] 木曜休み=[] 金曜休み=[] 土曜休み=[] 月曜休み=[] 火曜休み=[] オンコール可能=[0,1,2,3,4,5] 訪問看護可能=[0,1,2,3,4] 定期休みあり=[5] 定期休みなし=[0,1,2,3,4,6] #daycollection 今月=[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] 日=[1,8,15,22,29] 月=[2,9,16,23,30] 火=[3,10,17,24,31] 水=[4,11,18,25,32] 木=[5,12,19,26,33] 金=[6,13,20,27,34] 土=[0,7,14,21,28] 全日=[0,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,31,32,33,34] 平日=[2,3,4,5,6,9,10,11,12,13,16,17,18,19,20,23,24,25,26,27,30,31,32,33,34] 週末=[1,8,15,22,29] 休日=[1,8,15,22,29] 稼働日=[0,2,3,4,5,6,7,9,10,11,12,13,14,16,17,18,19,20,21,23,24,25,26,27,28,30,31,32,33,34] 制約開始日一日前=[4] 制約開始日二日前=[3] 制約開始日三日前=[2] 制約開始日四日前=[1] 制約開始日五日前=[0] 制約開始日一日後=[6] 制約開始日二日後=[7] 制約開始日三日後=[8] 制約開始日四日後=[9] 制約開始日五日後=[10] 制約開始日六日後=[11] 第一週=[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] 制約開始日1日前から=[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] 制約開始日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] 制約開始日3日前から=[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] 制約開始日4日前から=[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,31,32,33,34] 制約開始日5日前から=[0,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,31,32,33,34] 制約開始日6日前から=[0,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,31,32,33,34] 制約終了日六日前=[28] 制約終了日五日前=[29] 制約終了日四日前=[30] 制約終了日三日前=[31] 制約終了日二日前=[32] 制約終了日一日前=[33] 金土日=[0,1,6,7,8,13,14,15,20,21,22,27,28,29,34] 金土日月=[0,1,2,6,7,8,9,13,14,15,16,20,21,22,23,27,28,29,30,34] 外来休診日=[1,8,15,22,29] 訪問休診日=[1,8,15,22,29] 訪問診療日=[0,2,3,4,5,6,7,9,10,11,12,13,14,16,17,18,19,20,21,23,24,25,26,27,28,30,31,32,33,34] 外来診療日=[0,2,3,4,5,6,7,9,10,11,12,13,14,16,17,18,19,20,21,23,24,25,26,27,28,30,31,32,33,34] 月火水土=[0,2,3,4,7,9,10,11,14,16,17,18,21,23,24,25,28,30,31,32] 木金=[5,6,12,13,19,20,26,27,33,34] 水土=[0,4,7,11,14,18,21,25,28,32] 訪問月火水土=[0,2,3,4,7,9,10,11,14,16,17,18,21,23,24,25,28,30,31,32] 訪問木金=[5,6,12,13,19,20,26,27,33,34] 水曜休み者の休み=[1,4,8,11,15,18,22,25,29,32] 木曜休み者の休み=[1,5,8,12,15,19,22,26,29,33] 水曜休み者の出勤日=[0,2,3,5,6,7,9,10,12,13,14,16,17,19,20,21,23,24,26,27,28,30,31,33,34] 木曜休み者の出勤日=[0,2,3,4,6,7,9,10,11,13,14,16,17,18,20,21,23,24,25,27,28,30,31,32,34] 水土訪問休診日=[0,1,4,7,8,11,14,15,18,21,22,25,28,29,32] #shiftcollection オンコール否=[1,2,3,4,5,6,7] #classcollection 全スタッフ属性=[全スタッフ] 勤務形態=[常勤,パート] オンコール=[常時オンコールしない,月曜オンコールしない,火曜オンコールしない,水曜オンコールしない,木曜オンコールしない,金曜オンコールしない] 訪看=[訪看しない] 休み=[水曜休み,木曜休み,金曜休み,土曜休み,月曜休み,火曜休み]上記ファイルは、インタープリタ起動時に、読み込み済みです。 Pythonで、プログラムするにしても、折角GUIで集合を定義済みなので、それを利用しない手はありません。
import sc3 for 人 in staffdef: sc3.print(人+'\n') for 人 in 全スタッフ: sc3.print(str(人)+'\n')
pythonインタープリタは、これに対して以下のように出力します。
コンパイルの準備中ソルバを呼び出し中です。 python propertyファイル生成を開始します。 python propertyファイル生成が終了しました。 川畑拓也 中田拓実 高橋真央 友安美琴 降矢悠司 横山加奈 渡邊夏希 0 1 2 3 4 5 6 充足解を書き込み中です。
次のソースでは、月曜オンコールしない人を選んで、制約開始日以降の月曜日になにか処理する場合の記述です。 このように、制約開始日基準で、記述すれば、毎月同じpythonソースで対応が可能です。 SC2と雰囲気が似ていますが、こちらは真性のpythonソースです。
import sc3 for 人 in 全スタッフ: #sc3.print(str(人)+'\n') #人は数字なので、str()で文字に変換しないとエラーになる if 人 in 月曜オンコールしない: sc3.print(staffdef[人]+'\n') for day in 全日: if day >=制約開始日 and day in 月: sc3.print(daydef[day]+'\n')
出力は、以下のようになります。propertyファイルと見比べるとプログラムの流れが理解できると思います。
コンパイルの準備中ソルバを呼び出し中です。 python propertyファイル生成を開始します。 python propertyファイル生成が終了しました。 横山加奈 2017-06-05 2017-06-12 2017-06-19 2017-06-26 充足解を書き込み中です。
このようにして、任意の人、任意のDay、任意のシフトにアクセスすることが出来ます。ところで、未だ制約は一行も 書いていません。上のプログラムは、制約ではなく、制約するための前段階、本丸である制約へ行くためのアクセス手段に過ぎません。 アクセスさえ出来れば、どんな言語を用いてもよいのですが、昨今の流行と実装の容易性を鑑み、Pythonインタープリタという 選択になりました。
0 件のコメント:
コメントを投稿