2020年2月6日木曜日

公休数10.5日をどう記述する?

時間制約でも記述できます。この場合、スタッフプロパティで 8.5/9/9.5/10/10.5/11...に対応するプロパティを用意して、それぞれ時間制約で制約すればよいです。

Pythonで記述すること考えたのですが、プロパティファイル生成時、浮動小数に対応していないという問題が発生しました。そこで、以下のように正規表現を使って浮動小数に対応しました。(ソルバ C++)を変更しました。(対応Versionは、127C)



bool check_int(std::string str)
{
#ifdef FEB052020
 regex re("[0-9]+(\.[0-9]*)?|[0-9]+");
 if (regex_match(str, re)) {
  return true;
 }else return false;
#endif
 
127C以降では、次のようにPythonで記述できます。
 
 半休は、1回、公休(1日休み)は、2回カウントしてやると、0.5が整数になります。なので、min/maxを2倍にしてやります。これで時間制約の記述なしにpythonで、浮動小数の公休数に対応しました。
なお、float型かint型かの判定をしたあと、float型で,かつまだ浮動小数があるならメッセージを出しています。
 
def 公休数設定():
    for person in 全スタッフ:
        max=-1
        min=0
        if person not in 公休数属性:
            continue
        st=staffdef[person]+'公休数を制約'
        sc3.print(st+'します。\n')
        if person in 公休数属性:
                max=公休数属性[person]#float
                min=公休数属性[person]
        max *=2
        min *=2
        if isinstance(max, float) and not max.is_integer():
            sc3.print('公休数設定で、maxが整数型ではありません。')
            continue

        max =int(max) #float to int
        min =int(min) #float to int
        sc3.print(str(max)+str(min)+'\n')
        vlist=[]
        for day in 今月:
            v=sc3.GetShiftVar(person,day,'公休')#公休は2回分カウント
            vlist.append(v)
            vlist.append(v)
            v=sc3.GetShiftVar(person,day,'早半休')#早半休は1回
            vlist.append(v)
            v=sc3.GetShiftVar(person,day,'半休')#半休は1回
            vlist.append(v)
        sc3.AddSoft(sc3.SeqError(min,max,4,vlist),st,6)

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。