2014年4月25日金曜日

休日勤務の出勤回数を平等に

休日出勤の回数は、不平等感の強いもののひとつですが、これも制約を一つ追加すれば、解決可能です。

最初は制約なしでの結果です。休日出勤回数が3回から7回とばらついています。
7回の人から見ると、「なぜ私だけ..」 になってしまいます。

 そこで制約を追加します。kというのは、出勤勤務の集合で、
k=S | J | N
になっています。Sは、深、Jは準、Nは日勤です。休日のkの数を制限すれば、平等化が実現できます。

 下は、殆どなにも制約していないに等しいです。(最初の図を出力するために使用)
 4<=k<=6 にして制約しています。
 確かに休日出勤数は、4から6日の間に収まりました。(ちなみに5日以下の設定解がありませんでした。)
看護師スケジューリングソフト、スケジュールナースで求解時間は、3秒でした。

2014年4月18日金曜日

勤務表 人間とコンピュータの違い


 
実際にスケジュールナースをガイドしながらやってもらうと、絶対にできない制約(物理的に実現不能な制約)をコンピュータにやらせようとして「解がない!」、 バグではないか?と疑いの眼差しで眼を向けられることがあります。この制約で、前月もできているのだから、出来るはずだ、というのが妻の主張です。前月は、妻ではない別な看護師長が書いた勤務表です。それならばということで、前月の人間が作った勤務表を見ると、これが全然制約を守れていない訳です。勤務表を作ったときは、ルールがあるのだと思いますが、実際に作る段では、そのルールを守ることが出来なくて、部分的に捻じ曲げて(無視して)作っているのではないでしょうか? コンピュータに制約を入力すると、コンピュータは、勝手に捻じ曲げて緩めてはくれませんので、配置できない、解がない、エラーになってしまう訳です。

 大抵の場合、手入力した勤務表実績を入力しそれに対して解を求めると、(つまり初期入力で埋まった状態なので、解は一個以上、一個以下になるはずです。)解がありません と報告すると思います。 実はそれは看護師長さん自身が考えて手入力されたものは、伺ったルールからは、部分的に外れてしまっていることが多いのです。職場のルール、自分の中でのローカルルールをきちんと紙に書いてそれを一個のエラーもなく守る、というのはそれだけで、大変な事だという事でしょう。

コンピュータは、その意味で融通が利かないとも言えるかもしれません。でも、ちょっと立ち止まって、もっと良い制約はないか?と考えて欲しいのです。スケジュールナース的に言えば、勤務表づくりの大半は、制約設計です。

私は、コンピュータを使った勤務表の最大のアドバンテージは何かと、ずっと考えてきたのですが、最近になって、少し見えてきました。それは、複数の違った見方が出来る事です。紙と鉛筆で作れば、平均11時間かかってできる勤務表は1個です。 それが、スケジュールナースでは、ほぼ、看護師スタッフの入力時間だけで済みます。でもそれだけでは、例えば1/11にしかなりません。
例えば、今月は、リーダ養成のために、ここを少し空けてみたら、配置できるか?とか、この日の日勤を少し増やせないか?とか、その月に限っても色々試してみたいパターンが本当はあるのではないでしょうか?本当は、試して、良さそうだったらそっちを使いたいけれども、苦労して作った勤務表をもう一回やる気にはならない、というのが本当の所ではないでしょうか?少なくとも、その要求に対する能力をスケジュールナースは有しています。

11時間後のたった一個の勤務表と、いくつかの異なる見方をした勤務表候補。前者は選択の余地はありません。後者は、看護師長のどちらが理想に近いかという、評価して選ぶという所に大きな違いがあります。

しかし、いくつかの試したパターンの結果を評価できるのは、人間たる看護師長だけです。そのトレードオフのバランスを決めるのも人間たる看護師長だけです。コンピュータでは、そういう評価はできません。コンピュータは、制約に対して答えを出すことしかできません。


そのためには、何が必要か?制約をその場で書き換えて、すぐに答え出せるソフトの他に、制約をその場で書けるスキルが必要になります。現実の現場の勤務表を見ていると、実は、同じ制約の月の勤務表というのは、あまりなくて、なにかしら変更があるものです。フレームワークの勤務表はあったとして、少しの変更をその場で書けるスキルは、やはり必要だなと感じています。とりあえず、基本的なソフトの使い方は、Skypeによるサポートでなんとかなるとは思いますが、制約そのものを追加変更するスキルの向上は、難しいと感じています。なにかよい手立てはないでしょうか?


2014年4月17日木曜日

祝日の平準化

5月は、祝日が多いので、例えば、看護師スタッフのある人の祝日数が0で、ある人が3日祝日だったりすると、不公平ですね。看護師スタッフから文句が出てこないようにするために、看護師長は日夜奮闘されていると思いますが、鉛筆と紙と消しゴムでしこしこやるよりも、制約をひとつ追加しよう!、と言いたいです。

祝日のシフトをHとして、祝日一回以上に制約します。
 結果です。祝日が3回の看護師スタッフが2人いますね。
不公平だと感じる人がいるかもしれません。
 1人以上2人とすれば、
 祝日3回のスタッフはいなくなります。
看護師勤務表作成ソフト スケジュールナースで求解時間は4秒でした。

2014年4月16日水曜日

特許の審査請求

特許というのは、出願だけでは特許になりません。特許請求を行って、特許庁の審査官が審査をして特許性を認めて初めて特許として認められる訳ですね。スケジュールナースは、特許出願は済ですが、審査請求はしていませんでした。通常は、1年半位、様子見の期間があるのですが、要件を満たすと早期審査請求という技が使えます。そこで、今日、特許の審査請求手続きを行いました。出願もそうですが、審査請求も特許庁のオンラインで行います。オンラインは、出願ソフトというのが、特許庁からダウンロードできます。また、特許作成は、簡単願書作成というソフトがあり、作成上不備を指摘してくれたりします。簡単願書作成で作成した願書を出願ソフトで、特許庁にオンラインで送るのですが、これが面倒でした。住基ICカードで認証しながらやらないといけないのです。多分、出願ソフトと認証ソフトは連動しているのだと思いますが、認証ソフトがハングしたりして結構、問題が多かったです。ともあれ、なんとか提出しました。

提出物は、

オンライン
  1. 早期審査に関する事情説明書
  2. 出願審査請求書
オフライン(特許庁に郵送)
  1. 審査料金減免申請書
  2. 特許料減免申請書
  3. 非課税証明書

でした。

ー>上記オフラインは間違っていました。
特許料減免申請書は特許査定になってから申請してください。





2014年4月15日火曜日

会議の制約

副看護師長や主任との打ち合わせは、どのようにしていますか? この日にする、と決めてしまうよりも、スケジュールソフトに任せた方が良いと思います。なぜなら、解の探索空間の減少を最小に留める効果が期待できるからです。全てのスケジューリングソフトは、解を探索しますが、探索空間はできるだけ大きいほうが良い解を得られるチャンスが大きくなるのです。

まず、会議の要件について考えてみます。

会議の要件

  1. 会議資格者(スタッフプロパティで設定する。副看護師長等)だけが会議に参加する
  2. 会議は日勤時に行う
  3. 会議は、全会議資格者が揃ってはじめて開催可能
  4. 会議が長引く可能性があるので深夜入り(次の勤務が深夜)は入れない
  5. その月の会議回数は、複数回があり得る
次に、この条件を、コンピュータに解る言葉、制約に置き換えます。

  1. "会"というシフトを設ける。性質は日勤に準じる
  2. その月の会議回数はマクロ(今月の会議回数)で指定する
  3. 資格者はスタッフプロパティで設定
  4. 会議の後は深夜を禁止する
  5. 資格者は、今月の会議回数、過不足なく会議を行う
  6. "資格者が揃って"  ー>ペア強制を使う

という感じでプログラムしていきます。
”今月の会議数”というマクロを設定しています。(次月以降はここだけを変えればよい。)

会議というシフト変数を作ります。名前をC、ラベルを”会”としています。

会議に参加する人プロパティリンクを変更します。 (青色部)
 Day制約は、祝日でも、休診日でもない日にCを追加します。
会議のパターンを定義(青部)しています。

 日勤の定義をmとしています。m=N | C です。Nは、今までの日勤定義でしたが、
一般化した日勤をmとして、mに関する制約にしています。

 
 
今月の会議数を2に設定したときに得られた解です。
 
 どこまで確保可能かをやってみました。この例の場合11日まで可能でした。
12日に設定するとTimeout(20秒)で見つかりませんでした。

スケジューリングソフト スケジュールナースでこの求解に109秒かかりました。













2014年4月14日月曜日

年休消化の制約

5月は31日あり、かつ休みが多いので年休消化するには良い月です。そこで、年休消化する制約を考えてみましょう。スタッフがある程度取ってくれた方が後の月の勤務計画表の作成が楽という動機がブラックな制約ですが、最終的にはそれが皆の幸せにつながると信じてやる事にしましょう。

年休というのは、通常勤務希望として初期設定されますが、今回の年休消化は、他の制約を優先し満たして上で取得可能なら取得する という制約になります。つまり、通常の年休とは、性質の異なる年休です。通常の年休は、静的に決まっているのに対して、初期設定としては決まっていない動的に変わる年休、スケジュールする年休なので、シフトのラベルを変える必要があるということが分かります。

このスケジュールする年休のラベルを”す”と現すことにします。左がそのシフトの設定になります。制約内での名前を小文字のh、ラベルを”す”にします。休みに関係するグループxの仲間としてhも加えます。












下は

下は上の制約を入れる前の結果です。






今月の年休数というマクロを作成し1に設定して求解すると
問題なく求まります。この段階ではエラー0(ie.全看護師スタッフが年休を取得可能)なので、3秒で求まりました。
 
 
次に、今月の年休数を2に設定すると、下のような結果になりました。ご覧のように、全スタッフが年休を取得できている訳ではありません。その理由は、日勤者数にあります。スタッフに年休を与えるということは、その分日勤スタッフ数が減少します。際限なく年休を与えるができないのは、日勤者数制約が有るためです。この場合12人以上の制約を与えています。下のペインを見ると全日12人になっています。つまり、これ以上年休を与える余裕がないところまでスケジュールナースは頑張ったという事です。
(一番最初の日勤者数の違いを比較してみるとよく分かると思います。)
 
この制約をハード制約とすると「解がありません」になりますが、ソフト制約を指定することによって、エラー数を最小化するところまで自動的に求めてくれます。今回の求解時間は、看護師勤務表作成ソフトスケジュールナースで、79秒でした。

2014年4月10日木曜日

5月の連休の設定

5月の連休は、祝日と公休の扱いが暦通りではないのでその対処方法を記します。

3交代勤務者
5月3日祝
5月4日公
5月5日祝
5月6日祝

3交代勤務者でない人
5月3日公
5月4日公
5月5日祝
5月6日祝

夜勤が有る人とない人で祝日の設定が異なる場合がありますが次のようにするとよいでしょう。

まず、下のようにスケジュール開始日を5月1日にします。
 
 
次の曜日の定義を開きます。最初は下のようになっているはずです。
 
 
祝の定義を下のように変更しましょう。”祝”は、3交代用用のラベル流用します。
変更する部分は、
・祝の行 変更
・振り替え休日の行 クリア
・夜勤のない人の行 追加
です。




それから、夜勤のない人用の祝を定義します。”し”とすることにして、上のお達しの定義を入れます。”し”の属性は、ユーザ絶対月日 にします。(この属性の意味は、今月だけ意味を持つという意味です。来月になると忘れます。)

次にパターンの定義の行制約で夜勤なしの人は、最初次のようになっています。

この意味は、

もしも、祝だったら、H 勤務 (祝)
もしも、休診日だったら Y 勤務(公)
その他は、 N 勤務(日勤)

という定義になっています。今、夜勤のない人の祝日は、”し”と定義したので、
下のように直します。

以上で、定義完了です。
 


2014年4月7日月曜日

連続休みを2回以上、連続休み間隔は2週間程度で平準化 その4


上図の青色部分が今回書いた制約です。

肝心のパターンの部分は、
$O($A( $S(1,0,1,$P(1,xx)),$S(1,0,1,$P(3,xx))),$A( $S(1,0,1,$P(2,xx)),$S(1,0,1,$P(4,xx))))
となっていて、なにやら意味不明だと思いますが、分解すると
$Oは、ブール代数OR(または)の略で、
$A( $S(1,0,1,$P(1,xx)),$S(1,0,1,$P(3,xx)))
$A( $S(1,0,1,$P(2,xx)),$S(1,0,1,$P(4,xx)))
の2項のORを取るという意味です。$Aは、AND(かつ)の略です。

$S(min,max,type,指定期間中のパターン)で、パターンの加算を行って演算を演算を行うという意味になっています。$(1,0,1,..)は、指定期間中のパターンが1回以上であること、という意味になります。
従って、
$S(1,0,1,$P(1,xx))は、
1週間目に期間にパターンxx(連続休み)が一回以上であることを要求します。
同様に、
$S(1,0,1,$P(3,xx)))は、3週間目に、パターンxx(連続休み)が一回以上あることを要求します。

全体では、
1週間目に一回以上、かつ、3週間目に一回以上 または、
2週間目に一回以上、かつ、4週間目に一回以上
の連続休みがあること、
という制約になります。

面倒ですね。実際的には、青色の制約行をコピペすればよいだけですので、理解する必要はありません。

ちなみに各週の定義は、Version111から左のようにビルトイン(定義しなくても組み込み済み)
しています。





結果ですが、下図のようになっています。




 

必ずしも2週間間隔になっていないものが散見されます。上の制約は、約2週間の間隔の連続休みがあることを制約しているだけで、その他の休みについては、なんら制約がかかりません。つまり、約2週間間隔の休みが少なくとも一つ存在するという制約であって、2週間間隔以下の休みがない、という制約ではないことに注意してください。
 
この段階で、かなり厳しい制約だと思います。人間には無理でしょう。
(この問題を解ける看護師長さんはいらっしゃらないでしょう。)
 
ソフトの限界まで頑張ろうということで、さらにフリー休みが一回あるという制約を附加したのが、
次の結果です。

看護師勤務自動作成ソフト、スケジュールナースで、この求解に、なんと40秒近くかかっています。
(最近のデスクトップマシンで、この時間は、かなり長い(難しい)問題だと思います。)
 実際的には、この職場条件で、看護師の勤務希望を入れ込むと、恐らくエラーが0(すなわち、フリー休み一回以上、かつ約2週間隔に平準化した連続休みが2回以上という制約を看護師スタッフ全員に満たす)にはならないでしょう。なんらかのアイテムをソフト制約として、妥協を図る必要があるでしょう。


2014年4月2日水曜日

連続休みを2回以上、連続休み間隔は2週間程度で平準化 その3

問題は、休み間隔を2週間程度とする、という仕様です。
言い換えると、短すぎても駄目だし、長すぎてきも駄目ということです。
ただ、このままでは、漠然しすぎていますね。

この実装は難しいですが、
以下を頑張って読んでいただくと、制約が書けるようになります。

もう少し具体的に考えるために、1ヶ月を4区間で、区切って考えます。

1 2 3 4
休  休       -Good!
    休   休-Good!

もし、第1週目が、休みのときは、第3週目が休みであれば、仕様にマッチします。
同様に、第2週目が、休みのときは、第4週目が休みであればよいですね。
以上が、仕様上許される全てのパターンで、これ以外の休みパターン、

1 2 3 4
休       休 -NG Too Long
休休     -NG  Too Short
    休休         -NG   Too Short
   休休     -NG   Too Short
   
  
は、すべて不可になります。
そうすると、どういう制約にすればよいでしょうか?

パターン1:1週目に一回かつ3週目に一回
パターン2: 2週目に一回かつ4週目に一回

制約: パターン1  OR  パターン2

という制約を書けばよいことになります。そうすれば、パターン1または、パターン2どちらか、
または、両方の制約が満足されますから、約2週間間隔で2回以上のの休みが取れることになります。

正確には、約2週間の最小は、1週間で、最大は、3週間になりますが、あまり範囲を狭くしすぎると
「解がない」可能性が高まるので、とりあえず、この制約でやってみましょう。

<続く>