2019年5月10日金曜日

Pythonによるタスクの列挙

SC3では、次のようにして、タスクとシフトの列挙をすることが出来ます。
import sc3
#定義されているすべてのタスクの出力
for タスク名 in taskdef.keys():#taskdefは、辞書
 sc3.print(タスク名+'の工程担当能力のあるのは次の人達です。\n')
 for 人 in taskdef[タスク名]:
  sc3.print(staffdef[人]+'\n')
  
#定義されているすべてのシフトの出力
for シフト名 in shiftdef.keys():#shiftdefは、辞書
 sc3.print(シフト名+'がありえるのは次の人達です。\n')
 for 人 in shiftdef[シフト名]:
  sc3.print(staffdef[人]+'\n')
これは、次のpythonファイル  プロジェクト名_property.py(プロジェクトファイルフォルダーに出力) で定義されている為です。暗黙のうちにインポートされています。ファイルは、reference only用です。
公休=[0,1,2,3,4]
勤務1=[0,1,2,3,4]
勤務2=[0,1,2,3,4]
勤務3=[0,1,2,3,4]
勤務4=[0,1,2,3,4]
年休=[0,1,2,3,4]
統括作業長=[4]
作業長=[0,1,2,3,4]
...
#shiftdef
shiftdef={'公休':公休,'勤務1':勤務1,'勤務2':勤務2,'勤務3':勤務3,'勤務4':勤務4,'年休':年休}
#taskdef
taskdef={'統括作業長':統括作業長,'作業長':作業長,...

解のログです。

コンパイルの準備中ソルバを呼び出し中です。
統括作業長の工程担当能力のある人は次の人達です。
スタッフ5
作業長の工程担当能力のある人は次の人達です。
スタッフ1
スタッフ2
スタッフ3
スタッフ4
スタッフ5
...
NoTaskVarの工程担当能力のあるのは次の人達です。
スタッフ1
スタッフ2
スタッフ3
スタッフ4
スタッフ5
公休がありえるのは次の人達です。
スタッフ1
スタッフ2
スタッフ3
スタッフ4
スタッフ5
勤務1がありえるのは次の人達です。
スタッフ1
スタッフ2
スタッフ3
スタッフ4
スタッフ5

これで、任意のタスク変数、シフト変数をPython上で呼ぶことが出来るようになりました。 シフト変数は、リニアにアサインされているので、リニアに数字インデックスでアクセスできます。 それに対して、タスク変数は、Phaseに対して、Person毎に異なるインデックスになります。それ故、 タスク変数は、リニアにアクセスすることは出来ず、定義されたタスクだけにアクセスすることができます。 (Person毎に担当できる工程は変わり、しかもその工程は何十もあるので、リニアアクセスにするのは、メモリ的に 非効率です。) そのために、Dictionaryを用いてstringで、上のようにタスクを指定する必要があります。

0 件のコメント:

コメントを投稿