Ejemplo n.º 1
0
        /// <summary> 設定されたメンバーとシフトに対して組み合わせを作成する</summary>
        public virtual void  Auto()
        {
            int[]  memRnk = new int[ValidMemberSize];
            bool[] memChk = new bool[ValidMemberSize];
            for (int i = 0; i < ValidMemberSize; i++)
            {
                memRnk[i] = ValidMemberSize + 1;
                memChk[i] = false;
            }
            MemberCount memCnt = new MemberCount(this, Require);
            int         i2 = 0, j = 0;

            //System.out.println("展開サイズ:" + getRequire().getExtractedSize());
            if (Require == null)
            {
                return;
            }
            //
            while (i2 < Require.ExtractedSize)
            {
                j = 0;
                while (j < ValidMemberSize)
                {
                    if (memChk[j])
                    {
                        // もうすでに決定している
                        //System.out.println("すでに決定している:" + i + ":" + j);
                    }
                    else
                    {
                        CMember m1 = GetValidMember(j);
                        // i番目のメンバー
                        CPattern p1 = GetMembersPattern(m1, i2);
                        // メンバーがもっとも望むシフト
                        //System.out.println(i + ":" + m1.getName() + ":" + p1);
                        int m1rank = GetMemberRank(p1, m1);
                        // ↑がシフトにとってどれぐらい望まれているか?
                        if ((m1rank < memRnk[j]) && (p1 != null))
                        {
                            // メンバーがシフトを希望していてランクが有効である
                            if (memCnt.Addable(p1))
                            {
                                // シフトに登録可能な人数内
                                GetSchedule(m1).Pattern = p1;
                                memRnk[j] = m1rank;
                                memChk[j] = true;
                                memCnt.Add(p1);
                            }
                            else
                            {
                                // シフトに登録可能な人数外
                                for (int k = 0; k < ValidMemberSize; k++)
                                {
                                    CMember   compM = GetValidMember(k);
                                    CSchedule compS = GetSchedule(compM);
                                    CPattern  compP = compS.Pattern;
                                    if (p1.Equals(compP))
                                    {
                                        if (memRnk[k] > m1rank)
                                        {
                                            //
                                            GetSchedule(m1).Pattern = p1;
                                            memRnk[j]     = m1rank;
                                            memChk[j]     = true;                                         //
                                            compS.Pattern = null;
                                            memRnk[k]     = ValidMemberSize;
                                            memChk[k]     = false;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    j++;
                }
                i2++;
            }
        }