Exemplo n.º 1
0
        // 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);
        }
Exemplo n.º 2
0
        // 全ての審査エントリについて繰り返す
        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);
                    }
                }
            }
        }
Exemplo n.º 3
0
 // 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);
 }
Exemplo n.º 4
0
        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());
        }