2019年4月25日木曜日

python集合ファイル

GUIで記述した集合をpythonソースにしたものです。ファイル名は、プロジェクト名+_property.pyで、プロジェクトファイルと同じフォルダに出力されます。

#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 件のコメント:

コメントを投稿