Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Футбол на плюсе, ч.2: фактическая

Anna | 18.06.2014 | нет комментариев
Несмотря на определенный скепсис, по поводу первой части материала, как и обещал, публикую итоги, и то как они были получены.
В основном манипуляции производились с данными, хранимыми в Excell, таблицы которого сформированы по 3НФ, следственно в некоторых местах кода взамен индексов применяются данные из ячеек. Выходит согласно алгорифму нужно получить показатель клуба и климатическую колляцию города, в котором данный клуб принимает конкурентов = команда: {климат, рейтинг} — это и есть основная цель. Поехали.

1 этап:

Уполномоченный человек либо Система случайным образом выбирают число N в рамках числа поверенных команд участниц – от 1 до 16, упорядоченных согласно алфавиту. Выбранный участник приглашается для вычисления веса-рейтинга случайной команды.

            TeamSequence = new List<int>();
            for (int i = 0; i < teams.Length; i  )
            {
                int team_ambassor = generator.Next(1000, 1000000)%teams.Length; 
                while (TeamSequence.Contains(team_ambassor))
                team_ambassor = generator.Next(1000, 1000000)%teams.Length; 
                TeamSequence.Add(team_ambassor); 
            }
            foreach (int i in TeamSequence) textBox1.Text  = "Приглашается прдставитель команды: "   teams[i]   "rn";

Для поверенного теснее сформированы данные по участникам соревнований, которые безусловно же он не видит, также как и наименование команды, для которой производится расчет:
image

2 Этап

Т.к. у меня не было вероятности пригласить кого-либо из специалистов, расстановку оценок по параметрам сделал случайной, а для того Дабы приблизить к действительности провел эту процедуру 8 раз ровно по числу оцениваемых показателей.

            double[,] rate = new double[16,8];
            int team=new int();
            DataTable table = new DataTable();
            List<int> Marklist = new List<int>();
            string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text"", "C:\team.xlsx");
            using (OleDbConnection dbConnection = new OleDbConnection(strConn))
            {
                using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT * FROM [Лист3$]", dbConnection))
                dbAdapter.Fill(table);
                for (int j = 0; j < 8; j  )
                {
                    team = 0;
                    foreach (DataRow dr in table.Rows)
                    {
                        for (int i = 9; i < 17; i  )
                        {
                            int mark = 1   generator.Next(10000, 10000000)%8;
                            while (Marklist.Contains(mark))
                                mark = 1   generator.Next(10000, 10000000)%8;
                            Marklist.Add(mark);
                            rate[team, i - 9]  = Convert.ToInt32(dr.ItemArray[i])*mark;
                        }
                        team  ;
                        Marklist.Clear();
                    }
                }
                dbConnection.Close();
            }

Хранение данных в xlsx файлах довольно комфортное, т.к. некоторые банальные арифметические действия дозволено проводить сразу внутри таблиц с данными.
Исполнив случайную оценку показателей, были получены непредвзятые колляции участников соревнований.
image
Итоги получились абсолютно логичными.
Напомню, что оптимизация производится по минимальному критерию, т.е. поменьше=отменнее.

3 Этап

Остается к показателю клуба, добавить климатическую отзыв города. Эти колляции были получены для всякого месяца, в в рамках которых проводится турнир: июль-декабрь, март-май. Данные довольно массивные и приводить их не вижу смысла.
Подсчитаем итоговые колляции:

           double[,] rate = new double[12,9];
            int team=new int();
            DataTable table = new DataTable();
            List<int> Marklist = new List<int>();
            string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text"", "C:\team.xlsx");
            using (OleDbConnection dbConnection = new OleDbConnection(strConn))
            {
                //здесь данные о микроклимате, 12 городов, 9 месяцев
                using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT * FROM [Лист5$]", dbConnection))
                dbAdapter.Fill(table);
                team = 0;
                foreach (DataRow dr in table.Rows)
                {
                    {
                        rate[Convert.ToInt32(dr.ItemArray[0]) - 1, team%9] = Convert.ToDouble(dr.ItemArray[6]);
                        team  ;
                    }
                }
dbConnection.Close();
            }
            table = new DataTable();
            double[,] team_rate = new double[16,9];
            team = 0;
            using (OleDbConnection dbConnection = new OleDbConnection(strConn))
            {
                 //здесь данные о командах = 16 шт.
                using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT * FROM [Лист6$]", dbConnection))
                dbAdapter.Fill(table);
                foreach (DataRow dr in table.Rows)
                {
                    for (int i = 0; i < 9; i  )
                    {
                        team_rate[team%16, i] = rate[Convert.ToInt32(dr.ItemArray[0]) - 1, i]*
                                                Convert.ToDouble(dr.ItemArray[1]);
                    }
                    team  ;

                }
                dbConnection.Close();
            }
            StreamWriter sw = new StreamWriter("teams_koeff.txt");
            for (int i = 0; i <16; i  )
            {
                sw.WriteLine(Convert.ToString(teams[i]));
                for (int j = 0; j < 9; j  )
                {
                    sw.Write(Convert.ToString(month[j] "t"));
                    sw.Write(team_rate[i, j] "t");
                }
                sw.WriteLine();
            }
            sw.Close();

Готово. Немножко реформирования и получится дальнейшая таблица:
image
Как видно, у Кубани и Краснодара рейтинги различные, правда они из одного города, аналогичная обстановка у московских клубов. На основе этой информации дозволено оптимизировать процедуру жеребьевки. Безусловно же, различные форс-мажоры, игры в еврокубках, сборные, рекомендации полиции и т.п., нужно будет рассматривать вручную, но всеобщий каркас сетки теснее будет сформирован.
Для примера сравним опубликованный календарь и нашу таблицу:
imageimage
Если не рассматривать 2 московские пары, то приблизительно 50% «качества». Впрочем в некоторых парах, показатель отличается на порядок!!! Кто-то может сказать, что в тезисе «все типично», но определенно дозволено было бы сформировать календарь так, Дабы (по 1 таблице) Терек сыграл с Томью, а Краснодар с Рубином. Как ни верти, в Сибири в ноябре прохладно и бегать, а уж тем больше глядеть на трибуне.
Спасибо! Как неизменно рад Вашим комментариям.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB