/// <summary> シフトのメンバーの好みを自動設定する /// </summary> /// <param name="sDate">スケジュール化された(自動設定対象の)日付</param> /// <param name="pattern">設定するシフト</param> protected virtual void SetFavoritePatternStand(CScheduledDate sDate, CPattern pattern) { if (!pattern.IsAvailable(sDate.Date)) { // シフトが無効なら処理を抜ける return; } List <CMember> Candicates = new List <CMember>(); // シフトの有効なメンバーのリストを作成する for (int i = 0; i < sDate.ValidMemberSize; i++) { CMember m = sDate.GetValidMember(i); for (int j = 0; j < m.PatternSize; j++) { CPattern pat = m.GetPattern(j); if (pattern.Equals(pat)) { Candicates.Add(m); } } } int candicateSize = Candicates.Count; // 作成したリストからシフトに対して好みを割り振る for (int i = 0; i < candicateSize; i++) { int rand = 0; if (Candicates.Count > 1) { rand = Random1.Next(Candicates.Count); } CMember member = Candicates[rand]; Candicates.Remove(member); sDate.SetMemberRank(pattern, member, i); } }
/// <summary> メンバーのシフトの好みを自動設定する /// </summary> /// <param name="sDate">スケジュール化された(自動設定対象の)日付</param> /// <param name="member">設定するメンバー</param> /// <param name="force">休みを気にするかどうか</param> protected virtual void SetFavoriteMemberStand(CScheduledDate sDate, CMember member, bool force) { // List <CPattern> Candicates = new List <CPattern>(); // メンバーの有効なシフトのリストを作成する for (int i = 0; i < member.PatternSize; i++) { CPattern pattern = member.GetPattern(i); if (pattern.IsAvailable(sDate.Date)) { CRequirePatterns require = sDate.Require; if (require != null) { for (int j = 0; j < require.ValidSize; j++) { CPattern reqpat = sDate.Require.GetValid(j); if (pattern.Equals(reqpat)) { Candicates.Add(pattern); } } } } } // 休み設定 int conu = member.ContinuasInt; int cont = sDate.GetMemberContinues(member, conu); int rest = conu - cont; // 候補の数 int candicateSize = Candicates.Count; // 作成したリストからメンバーに対して好みを割り振る for (int i = 0; i < candicateSize; i++) { int rand = 0; if (Candicates.Count > 1) { rand = Random1.Next(Candicates.Count); } CPattern pattern = Candicates[rand]; Candicates.Remove(pattern); if (member.IsAvalableDay(sDate.Date.DayOfWeek)) { // 稼動の曜日 if ((rest > i || conu <= 0) || force) { // 連続稼動の許容範囲内 sDate.SetPatternRank(member, pattern, i); } else { // 連続稼動の許容範囲外 sDate.SetPatternRank(member, CPattern.DAYOFF, i); } } else { // せっかく設定したんですが曜日の都合で・・・ sDate.SetPatternRank(member, CPattern.DAYOFF, i); } } }
/// <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++; } }