スケジューリングソルバ ScNurse

スケジューリングソルバ
ScNurse
Software
Development Kit
for Windows Forms
Technical View.
2016.Jul.22 菅原システムズ
評価開発環境
シリアライズ
Jsonファイル
(problem.json)
制約クラス
解ファイル
solution1.text ..
実行エンジン
GUI C#ソース
1.スケジュールナースVer2相当のGUIソー
ス(C# )が付いています。
2.制約クラスの使い方は、入力であるGUI
ソースと、出力であるproblem.jsonを見る
とよいでしょう。
3.ソースをコピペするとスケジュールナー
スが出来てしまいます。(3rdParty GUI モ
ジュールを除く)
開発環境
Jsonファイル
ScNurse
実行エンジンExe
C#スケジュール
ナース相当GUI
解ファイル
Visual Studio 2015
1.SDKには、ScNurse実行エンジン
(Exeファイル)と実行エンジンを
動かすためのGUI ソースが入って
います。(Visual Studio2015 C#)
2.制約ファイルは、Json形式で渡し
ます。
3.Jsonは、C#クラス(制約クラス)
をJson.NETでシリアライズしたも
のです。
probelm.json と solution1.txt
{
"SO": {
"name": "Shift Objects",
"members": [
{
"use": true,
"name": "ShiftDef",
"def_name": "オンコール",
"auto_schedule": true,
"color": "Yellow",
"label": "コ",
"another_labels": [
"",
""
],
"another_colors": [
"Gray",
"Gray"
],
SAT,7,36,2016,8
1日代休,オンコール,半日代
休,外来勤務,半日代休,訪問看
護,オンコール,外来勤務,訪問
看護,外来勤務,外来勤務,休み
,外来勤務,訪問看護,オンコ...
シリアライズクラス singleA
problem.json
singleA
ScNurse
solution1.txt,s
olution2.text...
クラスsingleAをJSON.Netでシリアライライズしたものが、
problem.json(UTF-8) となりScNurseにファイルとして渡されます。
ScNurseは、求解数分のファイルをsolution1.txt,solution2.txt...とし
て生成します。(UTF-8)
problem.json生成(solve_page.cs)
public bool make_problem()
{
{
string str_server = form1.serialize_all();//シリアライズ
if (str_server=="") return false;
StreamWriter sw;
string path = Application.StartupPath + "¥¥problem.json";
System.Text.Encoding enc = new System.Text.UTF8Encoding(false);//UTF8変換
sw = new StreamWriter(path, false, enc);//BOMなしでないとパースエラーになる
sw.Write(str_server);
sw.Close();
}
return true;
}
form1シリアライズ部
Newtonsoft.Json.JsonSerializerSettings get_json_setting()
{
Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings { Converters = { new
CustomDateTimeConverter() }, Formatting = Newtonsoft.Json.Formatting.Indented };//, TypeNameHandling =
Newtonsoft.Json.TypeNameHandling.All };
return settings;
}
public string serialize_all()
{
Newtonsoft.Json.JsonSerializerSettings settings = get_json_setting();
bool success=true;
try {
SingleA.set_projectname(most_recentfile);//プロジェクト名設定
SingleA.update_version();
success &=SingleA.eval_macro(rm);//マクロ評価
if (!success ) return "";
}
catch (Exception ex){
MessageBox.Show(ex.Message);
return "";
}
string Serialized = Newtonsoft.Json.JsonConvert.SerializeObject(SingleA, settings);//Json.NETのシリアライズ
return Serialized;
}
解読み込み部(solve_page.cs)
public string Read_Solution(int I)
{
string solution_filename = "";
solution_filename += Application.StartupPath;
solution_filename += "¥¥solution";
solution_filename += (I + 1).ToString();// solutions.get_nof_solutions().ToString();
solution_filename += ".txt";
try
{
TextFieldParser parser = new TextFieldParser(solution_filename,
System.Text.Encoding.GetEncoding("UTF-8"));
using (parser)
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(","); // 区切り文字はコンマ
.....
SingleA.get_schedules().label_conversion(Solution.members);//Shiftが同じでAnotherLabelが
予定入力で使われていたら予定入力に合わせる
Solution.save_as_history(SingleA);
SingleA.get_solutions().members.Add(Solution);//singleAインスタンスに解追加
singleAの役割
スケジュールナースⅡの場合、プロジェクトファイルと役割を兼ねて
いるので、ソルバへのシリアライズとしては、やや冗長な処理になっ
ています。ソルバと無関係な部分は、privateにしているので、そちら
は見る必要がありません。(private部はシリアライズされません。)
singleAは、ソースファイルsc_nurse.csで記述されています。Doxgen
を見るとファイル数も多いのですが、その殆どは、singleAにユーザ
記述を設定させるためのGUI処理です。solverの設定の仕方として
は、最終的に何がsinlgeAにセットされたかが問題ですので、
sc_nurse.cs上 singleAのメンバーセット方法を見れば十分かと思いま
す。
singleA 構造図
日
設定群
シフト
schedules
制約群
求解パラメータ
solving_
parameters
スタッフ
column_
constraints
date_objects
date_object
date_aggregates
date_aggregate_class
shift_objects
shift_object
shift_aggregates
shift_aggregate_class
group_properties
group_property
group_aggregates
group_aggregate
staff_properties
staff_property
column_constraints_group
column_constraint
row_
constraints
row_constraints_group
row_constraint
pair_
constraints
pair_constraints_group
pair_constraint
singleA 最低限設定が必要なオブジェクト群
date_objects
日
設定群
シフト
date_object
既定オブジェクト群
,days,target_year,target_month
shift_objects
shift_object
staff_properties
staff_property
スタッフ数、日数
schedules
制約群
求解パラメータ
solving_
parameters
スタッフ
その他は、インスタンスとしては
必要ですが、ブランクでも支障あ
りません。initialize部参照
solving_parametersクラス
求解パラメータ
public Dictionary<string, int> parameters =new Dictionary<string,int>();
public void initialize(singleA SingleA, System.Resources.ResourceManager rm)
{
parameters["NofCpus"]=1; //CPU数
parameters["N_of_solutions"]=1;//求解数
parameters["not_repeat_planned_errors"]=1;//予定エラーの再掲を防ぐ
parameters["BestEffots"]=1; //最小化有効
parameters["HardTimeout"]=30; //ハードタイムアウト(秒)
parameters["ErrorAnalysis"]=1; // エラー原因解析
parameters["SoftTimeout"]=10; // ソフトタイムアウト(秒)
parameters["BestEffotsTimeout"]=5;//default:5
parameters["UseExternalConstraint"]=0;//言語制約使用
}
ソフト制約設定 ソフト制約レベル1-7
public Dictionary<int, Dictionary<string, sw_int> > solving_map=new Dictionary<int,Dictionary<string,sw_int>>();
"column" ➡列
"row"
➡行
"planned" ➡予定
"ext"
➡外部
bool use = solving_map[level][s].use;
int per_errors = solving_map[level][s].value;
int total_allowerable_errors = solving_map[level][s].total_max_errors;
詳細仕様
・Doxygen生成文書・ソースコードをご参照ください。
・GUI各データグリッド(表)とsingleA内クラスは、ほぼ
一対一対応しています。
・スケジュールナースⅡチュートリアル・マニュアルも併
せてお読みください。
Visual Studioプロジェクト
ファイル群には、Visual Studio2015update3プ
ロジェクトファイル、実行ファイル、DLL等が含まれます。
これにより、ほぼスケジュールナースⅡGUIの開発環境が再
現できます。(C#デバッガが使えます。)これを出発点とし
て、貴社アプリインタフェースの開発が可能になります。
Visual Studio Project インストール
圧縮ファイルを次のフォルダに展開します。
ScNurseSDKを起動します。
ダブルクリック
schedule_nurse2 プロジェクト
下図のようになります。
起動の確認
起動の確認を行います。
ビルドの確認
WindowsFormsApplication1.exe
Exeファイルが次のフォルダに生成されたら成功です。
オンラインサポート
ご要望があればオンラインサポートが可能です。その日の午前
中にメールを頂ければ、その日中に対応可能です。SKYPE
で画面を共有しながらお話しが可能です。
評価期間
• 1か月です。1か月を過ぎると起動できなくなります。
• お申し出があった場合に3か月まで更新が出来ます
。ただし、2か月目以降は有償となります。
以上