Описание и программирование матричных игр

Автор работы: Пользователь скрыл имя, 17 Ноября 2011 в 08:04, курсовая работа

Краткое описание

Теория игр – раздел математики, предметом которого является изучение математических моделей принятия оптимальных решений в условиях конфликта.
ИГРОЙ называется всякая конфликтная ситуация, изучаемая в теории игр и представляющая собой упрощенную, схематизированную модель ситуации. От реальной конфликтной ситуации игра отличается тем, что не включает второстепенные, несущественные для ситуации факторы и ведется по определенным правилам, которые в реальной ситуации могут нарушаться

Содержимое работы - 1 файл

Отчет.doc

— 1.79 Мб (Скачать файл)

   } 

   /*

     Функция  определения следующего хода  для игрока 2

   */

   int MainWindow::PlayerTwo()

   {

       int a2, Min;

       Min = this->win_pltwo[this->a][0]; 

       if(this->pl == 1)

   

           a2 = n;

       else

           a2 = m; 

       int id = 0; 

       for(int i = 0; i < a2; i++)

           if(this->win_pltwo[a][i] < Min)

           {

               Min = this->win_pltwo[a][i];

               id = i;

           }

       return id;//Min

   } 

   void MainWindow::StartBtn()

   {

       this->m = this->ui->tableWidget->rowCount();

      this->n = this->ui->tableWidget->columnCount(); 

       /*

         Предположим, что:

       */

       this->nol = true;//Есть элементы равные 0

       this->otr = false;//Отрицательных элементов нет

       this->min = this->ui->tableWidget->item(0, 0)->text().toInt();//Минимальный элемент 

       /*

         Заполнение пользовательского массива  и флагов

       */

       this->array = new int*[m]; 

       for(int i = 0; i < m; i++)

       {

           this->array[i] = new int[n];

           for(int j = 0; j < n; j++)

           {

               if(this->ui->tableWidget->item(i, j)->text() != "")

                   this->array[i][j] = this->ui->tableWidget->item(i, j)->text().toInt();

               else

                   this->array[i][j] = 0; 

               if(this->array[i][j])

                   this->nol = false;

               if(this->array[i][j] < 0)

                   this->otr = true;

               if(this->array[i][j] < min)

   

                   min = this->array[i][j];

           }

       }

       /*

         Итеративный метод Брауна-Робинсона

       */

       if(this->nol)//Все элементы матрицы - 0

       {

           QMessageBox::warning(this, QString::fromLocal8Bit("Ошибка!"),

               QString::fromLocal8Bit("Все элементы матрицы равны 0!"),

               QMessageBox::Cancel);

           //QString::fromAscii()

       }

       else

       {

           if(this->otr)//если есть отрицательные элементы

           {

               for(int j = 0; j < this->m; j++)

                   for(int i = 0; i < this->m; i++)

                       this->array[i][j] = array[i][j] - this->min; 

               //Вывод окончательной матрицы

               for(int j = 0; j < this->m; j++)

                   for(int i = 0; i < this->n; i++)

                   {

                       QTableWidgetItem *item = new QTableWidgetItem(0);

                       QString s;

                       item->setText(s.setNum(this->array[i][j], 10));

                       this->ui->tableWidget->setItem(i, j, item);

                   }

           }

           a = 1; 

           /*Игрок который ходит первым*/ 

           if(this->ui->player1->isChecked())

               this->pl = 1;

           else

               this->pl = 2; 

           /*Начальна стратегия*/

           this->st = this->ui->strateg->text().toInt() - 1; 

           /*Количество итераций*/

           this->kl = this->ui->iteration->text().toInt();

   

   

           for(int i = 0; i < this->n; i++)

               this->win_plone[0][i] = 0; 

           do

           {

               if(this->pl == 2)//Ходит второй игрок

               {

                   for(int i = 0; i < this->n; i++)//Формирование матрицы выигрышей 1 игрока

                       this->win_plone[a][i] = this->array[st][i] + this->win_plone[a - 1][i];//

                   st1 = this->PlayerOne(); 

                   for(int i = 0; i < this->m; i++)//Формирование  матрицы выигрышей 2 игрока

                       this->win_pltwo[a][i] = this->array[i][st1] + this->win_pltwo[a - 1][i];//

                   st = this->PlayerTwo();

               }

               else

               {

                   for(int i = 0; i < this->m; i++)//Формирование  матрицы выигрышей 1 игрока

                       this->win_plone[a][i] = this->array[i][st] + this->win_plone[a - 1][i];//

                   st1 = this->PlayerOne(); 

                   for(int i = 0; i < this->n; i++)//Формирование  матрицы выигрышей 2 игрока

                       this->win_pltwo[a][i] = this->array[st1][i] + this->win_pltwo[a - 1][i];//

                   st = this->PlayerTwo();

               }

               this->ui->outTable->setRowCount(a); 

               /*

                 Внесение данных в таблицу

               */

               char buf[50] = "";

               for(int i = 0; i < this->n; i++)

                   sprintf(buf, "%s %i", buf, this->win_plone[a][i]); 

               //qDebug("%s", buf);

               this->setOutTblItem(a - 1, 1, QString::fromLocal8Bit(buf));//Выйграш  первого игрока 

               sprintf(buf, "%i", st1);

               this->setOutTblItem(a - 1, 0, QString::fromLocal8Bit(buf));//Стратегия первого игрока

   

   

               sprintf(buf, "%i", st);//Стратегия второго игрока

               this->setOutTblItem(a - 1, 2, QString::fromLocal8Bit(buf)); 

               sprintf(buf, "");

               for(int i = 0; i < this->m; i++)

                   sprintf(buf, "%s %i", buf, this->win_pltwo[a][i]);

               //Выйграш второго игрока

               this->setOutTblItem(a - 1, 3, QString::fromLocal8Bit(buf)); 

               //V - вывод наибольшего суммарного выигрыша 1 игрока

               sprintf(buf, "%i", this->win_plone[a][st1]);

               this->setOutTblItem(a - 1, 4, QString::fromLocal8Bit(buf)); 

               //W - вывод наибольшего суммарного выигрыша 2 игрока

               sprintf(buf, "%i", this->win_pltwo[a][st]);

               this->setOutTblItem(a - 1, 5, QString::fromLocal8Bit(buf)); 

               //Y - приближенное значение цены  игры

                sprintf(buf, "%.2f", (float)(this->win_plone[a][st1] + this 
    ->win_pltwo[a][st])/ (a * 2));

               this->setOutTblItem(a - 1, 6, QString::fromLocal8Bit(buf));

               /**/

               a++;

           }while(a <= kl);

       }

   } 

 

7.2 Руководство пользователя

 

   Работа  программы начинается с её настройки. Для начала нужно указать размер входной таблицы (переключатели 1, Рисунок 7.2.1). Далее записать исходные данные в таблицу (2, Рисунок 7.2.1). В случае, если данные в ячейку таблицы не будут внесены, то пустой элемент таблицы будет приравнен к нулю. Затем указать какой игрок первым начинает ходить(3, Рисунок 7.2.1), его начальную стратегию (4, Рисунок 7.2.1) и количество ходов, которые надо просчитать (5, Рисунок 7.2.1). Для начала расчета необходимо нажать кнопку «Начать» (6, Рисунок 7.2.1). Результаты расчетов будут выведены в таблицу (8, Рисунок 7.2.1). Кнопка «По умолчанию» (7, Рисунок 7.2.1) заполняет таблицу пользователей значениями, которые были в ней при старте программы.

   

   Рисунок 7.2.1. Основные элементы управления программой. 

   Программа имеет поддержку тем оформления. Описание стиля находится в текстовом файле «style.txt». Если данный файл не удается загрузить, то внешний вид программы будет соответствовать текущей теме оформления компьютера.

   

   Программа имеет встроенную справочную систему (Рисунок 7.2.2), которая находится на вкладке «Справка». В ней можно найти подробное описание принципа работы программы, и примеры задач, решаемых данным программным средством.

   

Рисунок 7.2.2. Встроенная справочная система.

 

8. Заключение

 

   В данной работе мы изучили некоторые  методы приближённого решения матричных игр: монотонный итеративный алгоритм решения матричных игр, и итерационный метод Брауна-Робинсона.

   В ходе разработки данного проекта  были приобретены практические навыки решения матричных игр.

   

   Итогом работы над данным курсовым проектом стала программа, написанная на объектно-ориентированном языке С++ реализующая итерационный метод Брауна – Робинсона для решения матричных игр. С помощью данной программы можно решать сельскохозяйственные задачи (о прибыли в зависимости от того, какое выдалось лето), производственные задачи (о планировании оптимального производства и расчет прибыли от продукции) и простеньки игры для двух человек (игра в «Пальцы»).

 

9. Список используемой литературы.

  1. Беленький В.З. Итеративные методы в теории игр и программировании. М.: «Наука», 1977
  2. Вентцель Е.С. Элементы теории игр. М., Физматгиз, 1961
  3. Давыдов Э.Г. Методы и модели теории антагонистических игр. М.: «Высшая школа», 1990
  4. Крушевский А.В. Теория игр: [Учебное пособие для вузов]. Киев: «Вища школа», 1977
  5. Оуэн Г. Теория игр. [Учебное пособие]. М.: «Мир», 1973
  6. Петросян Л.А., Зенкевич Н.А., Семен Е.А. Теория игр. М., 1989
  7. Карлин С. Математические методы в теории игр, программировании и экономике. М.: «Мир», 1964
  8. Блекуэлл Д.А. Теория игр и статистических решений. М., Изд. иностранной литературы, 1958

Информация о работе Описание и программирование матричных игр