// IDから審査イベントを返す public DefenseEvent GetEvent(int id) { DefenseEvent ev = null; using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT * FROM events WHERE ID=" + id.ToString() + ";"; using (var reader = cmd.ExecuteReader()) { if (reader.Read()) { ev = new DefenseEvent( reader.GetInt32(0), // ID reader.GetString(1), // DEGREE reader.GetString(2), // STUDENT_NO reader.GetString(3), // DEPARTMENT reader.GetString(4), // STUDENT_NAME reader.GetString(5) // PAPER_TITLE ); for (int i = 0; i < 5; i++) { ev.Referee_id[i] = reader.GetInt32(i + 6); } } } } return(ev); }
// 全ての審査エントリについて繰り返す public IEnumerable <DefenseEvent> EachEvent() { using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT * FROM events"; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var ev = new DefenseEvent( reader.GetInt32(0), // ID reader.GetString(1), // DEGREE reader.GetString(2), // STUDENT_NO reader.GetString(3), // DEPARTMENT reader.GetString(4), // STUDENT_NAME reader.GetString(5) // PAPER_TITLE ); for (int i = 0; i < 5; i++) { ev.Referee_id[i] = reader.GetInt32(i + 6); } yield return(ev); } } } }
// 2つのイベントが同時に開催できないかどうか // 同じ審査員がいる場合はtrue public bool IsConflict(DefenseEvent ev) { for (int i = 0; i < 5; i++) { if (Referee_id[i] == -1) { break; } for (int j = 0; j < 5; j++) { if (Referee_id[i] == Referee_id[j]) { return(true); } } } return(false); }
internal void DoAlignment1(int max_slot, int nepoch, int niter, double tconst, int[,] slotevent) { Chart chart = (Chart)form.GetControl("グラフ"); Label countlabel = (Label)form.GetControl("重複数"); Check_DB_is_not_open(); // 部屋を準備 rooms = new Rooms(max_slot); var all_room = new List <Room>(); foreach (var room_name in excel2DB.DB.EachRoom()) { all_room.Add(rooms.AddRoom(room_name)); } // 不都合日程の部屋 var p_room = rooms.AddRoom("不都合日程"); p_room.unchangable(); all_room.Add(p_room); // すべてのイベントを部屋に割り当てる int n_event = excel2DB.DB.EventCount(); var pool = new AttendeePool(); var room_no = new int[max_slot]; for (int i = 0; i < max_slot; i++) { room_no[i] = 0; } int max_room = all_room.Count - 1; for (int event_id = 0; event_id < n_event; event_id++) { bool event_allocated = false; for (int slot = 0; slot < max_slot; slot++) { if (room_no[slot] == max_room) { continue; } if (slotevent[slot, event_id] == 1) { DefenseEvent d_ev = excel2DB.DB.GetEvent(event_id + 1); var ev = new Event(d_ev.Student_No); for (int i = 0; i < 5; i++) { if (d_ev.Referee_id[i] != -1) { ev.Attendees.Add(pool.Get(excel2DB.DB.GetProfessorName(d_ev.Referee_id[i]))); } } all_room[room_no[slot]].addEvent(ev, slot); room_no[slot]++; event_allocated = true; break; } } if (!event_allocated) { MessageBox.Show("審査" + event_id.ToString() + "が割り当てられませんでした", "Impossible", MessageBoxButtons.OK, MessageBoxIcon.Information); } } // 不都合日程割り当て for (int slot = 0; slot < max_slot; slot++) { var ev = new Event("不都合" + slot.ToString()); foreach (var prof_id in excel2DB.DB.GetProhibitProfs(slot + 1)) { var name = excel2DB.DB.GetProfessorName(prof_id); ev.Attendees.Add(pool.Get(name)); } p_room.addEvent(ev); } // ここから本番 void callbacklinear(int epoch, int iter, double lossval, int losscount) { series.Points.AddXY(epoch * niter + iter, lossval); chart.Update(); countlabel.Text = losscount.ToString(); countlabel.Refresh(); } double inittemp = 50.0; for (int failiter = 0; failiter < 3; failiter++) { series = new Series(); //chart.ChartAreas.First().AxisX.IsLogarithmic = true; chart.Series.Add(series); // 全ルームの全スロットで入れ替え rooms.anneal(inittemp, nepoch, niter, tconst, pool.maxid + 1, callbacklinear, false); chart.Series.Clear(); // 重複解消できたか if (countlabel.Text == "") { break; } inittemp /= 10; } // 全ルームの同スロットで入れ替え double inittemp2 = 0.1; series = new Series(); chart.Series.Add(series); rooms.anneal(inittemp2, nepoch, niter, tconst, pool.maxid + 1, callbacklinear, true); string resultfilename = Program.GetFilename("output.csv", "Text CSV (*.csv)|*.csv|All files(*.*)|*.*"); if (resultfilename == null) { MessageBox.Show("中止しました", "Aborted", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } OutputResult(resultfilename, "<?xml version = \"1.0\" encoding = \"UTF-8\" ?>" + rooms.ToString()); }