Теория игр
Автор: Пользователь скрыл имя, 22 Апреля 2013 в 11:57, курсовая работа
Краткое описание
Целью данной работы является изучение математических основ теории игр, их приложение в экономике и написание простой программы реализующей применение теории игр в экономике.
Оглавление
Введение 3
1 Постановка задачи. Описание модели 4
2 Описание решения 6
3 Пример из экономике, где появлялись такие задачи. 12
4 Пример математического решения 14
5 Основная часть (программа) 16
5.1 Постановка задачи с точки зрения программирования…………………...16
5.2 Структура программы……………………………………………………….16
5.3 Текст программы…………………………………………………………….17
6 Тестирование 34
7 Руководство пользователя 37
Заключение……………………………………………………………………….42
Список литературы 43
Файлы: 1 файл
теория игр.docx
— 492.42 Кб (Скачать) Во время игры много
зависит и от рационального
поведения игрока, то есть продуманного
выбора и оптимальной
Нэш (Nash) Джон-Форбс (род в 1928) - американский экономист, лауреат Нобелевской премии (1994). Родился в г. Блуэфилд (штат Западная Вирджиния, США). Учился в Университете Карнеги-Меллона по специальности инженера-химика, но, увлекшись математикой, перевелся на математический факультет. Получил диплом бакалавра математики и одновременно магистра математики.
4 Пример математического решения
Платежная матрица имеет вид
Задача каждого из игроков – найти наилучшую стратегию игры, при этом предполагается, что противники одинаково разумны, и каждый из них делает все, чтобы получить наибольший доход.
Найдем нижнюю и верхнюю цены игры.
aa
a=a – нижняя цена игры.
bb
b=b – верхняя цена игры.
Так как a=b=0, матрица игры имеет седловую точку.
Оптимальная стратегия первого игрока - , второго . Из таблицы видно что отклонение первого игрока от оптимальной стратегии уменьшает его выигрыш, а отклонение второго игрока от увеличивает его проигрыш.
Найти решение игры, заданной матрицей
Найдем нижнюю и верхнюю цены игры.
ababn
Игра не имеет седловой точки. Оптимальное решение следует искать в области смешанных стратегий.
Для определения оптимальной стратегии игрока А имеем следующую задачу линейного программирования
Для нахождения оптимальной стратегии игрока В имеем следующую задачу линейного программирования
n
можно найти оптимальные стратегии игроков и цену игры:
n
5 Основная часть (программа)
5.1 Постановка задачи
с точки зрения программирования
Требуется написать программу решения матричных игр, в которых решение может присутствовать в чистых и смешанных стратегиях.
Программа делится на несколько подзадач:
- Ввод исходных данных;
- Проверка существования седловой точки;
- Поиск решения в смешанных стратегиях, если седловая точка отсутствует.
5.2 Структура программы
Проект написан с
Исходный текст программы готовится в среде Delphi 7 с помощью встроенного редактора исходных текстов. Этот редактор специализирован. Он отличается гибкими возможностями цветового выделения различных элементов текста программы (ключевые слова, названия, операций, чисел строк) и предоставляет возможность быстрого ввода часто встречающихся конструкций.
Программа состоит из 6 модулей. Каждый модуль соответствует одной из форм интерфейса пользователя.
Первая форма (unit 1) представляет собой заставку предназначенную для объяснения пользователю назначения программы.
Вторая форма (unit 2) предназначена для ввода числа стратегий каждого из игроков.
Третья форма (unit 3) предназначена для ввода матрицы игры. В этом модуле проводятся основные расчеты.
Определение верхней и нижней цен игры проводится функцией sedlo, она возвращает значение true в случае если существует седловая точка и false в противном случае.
Поиск решения игры в смешанных стратегиях проходит в процедуре simp.
5.3 Текст программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, jpeg;
type
TForm1 = class(TForm)
Label1: TLabel;
Shape1: TShape;
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.show;
form1.Hide;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit3, Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var a,c:integer;
begin
if ((edit1.text='') or (edit2.text='')) then
MessageBox(Application.Handle,
else
begin
val(edit1.Text,a,c);
if a>10 then
begin
MessageBox(Application.Handle,
edit1.Text:='10';
end;
val(edit2.Text,a,c);
if a>10 then
begin
MessageBox(Application.Handle,
edit2.Text:='10';
end;
form3.show;
form2.Hide;
end;
end;
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
const Digit: set of Char=['1'..'9', '0'];
begin
with (Sender as TEdit) do
begin
if (not(Key in Digit))
then Key:=#0;
end;
end;
procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char);
const Digit: set of Char=['1'..'9', '0'];
begin
with (Sender as TEdit) do
begin
if (not(Key in Digit))
then Key:=#0;
end;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.close;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Math;
type
TForm3 = class(TForm)
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
n,m:integer;
matrix: array[1..10,1..10] of integer;
simp: array[1..66,0..23] of real;
minMatrix, maxMatrix:array[1..10] of integer;
maxmin,minmax,kolshag:integer;
end;
var
Form3: TForm3;
i,j,k,kod:integer;
implementation
uses Unit1, Unit2, Unit4;
{$R *.dfm}
function sedlo:boolean;
begin
form3.minmax:=0;
form3.maxmin:=0;
// по стратегиям первого игрока
for i:=1 to form3.m do
begin
form3.minMatrix[i]:=form3.
for j:=2 to form3.n do
if form3.minMatrix[i]>form3.
form3.minMatrix[i]:=form3.
end;
form3.maxmin:=form3.minMatrix[
for j:=2 to form3.n do
if form3.maxmin<form3.minMatrix[
form3.maxmin:=form3.minMatrix[
// по стратегиям второго игрока
for j:=1 to form3.n do
begin
form3.maxMatrix[j]:=form3.
for i:=1 to form3.m do
if form3.maxMatrix[j]<form3.
form3.maxMatrix[j]:=form3.
end;
form3.minmax:=form3.maxMatrix[
for j:=2 to form3.m do
if form3.minmax>form3.maxMatrix[
form3.minmax:=form3.maxMatrix[
if form3.maxmin=form3.minmax then
sedlo:=true
else
sedlo:=false;
end;
procedure simplex;
var mi,minSO,del,v:real; nomMi,shag,nomSO,neopt:
begin
// заполнение первоначальной матрицы
for i:=1 to form3.n do
form3.simp[i,0]:=form3.m+i;
for i:=1 to form3.n do
begin
for j:=1 to form3.m do
form3.simp[i,j]:=form3.matrix[
for j:=form3.m+1 to form3.m+form3.n do
if i=j-form3.m then
form3.simp[i,j]:=1
else
form3.simp[i,j]:=0;
end;
for j:=1 to form3.m do
form3.simp[form3.m+1,j]:=-1;
for j:=1 to form3.n do
form3.simp[j,form3.m+form3.n+
for j:=form3.m+1 to form3.m+form3.n+1 do
form3.simp[form3.m+1,j]:=0;
shag:=0;
repeat
// поиск минимального в F строке
mi:=form3.simp[shag+form3.n+1,
nomMi:=1;
for j:=1 to form3.m+form3.n do
if mi>form3.simp[shag+form3.m+1,
begin
mi:=form3.simp[shag+form3.m+1,
nomMi:=j;
end;
for i:=1 to form3.n do
if form3.simp[shag+i,nomMi]<>0 then
form3.simp[shag+i,form3.m+
// минимальное с.о.
i:=1;
while form3.simp[shag+i,form3.m+
minSO:=form3.simp[shag+i,
nomSO:=shag+i;
for j:=i+1 to form3.n do
if minSO>form3.simp[shag+j,form3.
begin
minSO:=form3.simp[shag+j,
nomSO:=shag+j;
end;
shag:=shag+11;
//шаг С.М.
del:=form3.simp[nomSO,nomMi];
for j:=1 to form3.m+form3.n+1 do
form3.simp[nomSO+11,j]:=form3.
for i:=1 to form3.n do
form3.simp[i+shag,0]:=form3.
form3.simp[nomSO+11,0]:=nomMi;
for i:=shag-10 to shag+form3.n-10 do
if i<>nomSO then
begin
del:=form3.simp[i,nomMi];
for j:=1 to form3.m+form3.n+1 do
form3.simp[i+11,j]:=form3.
end;
//проверка на оптимальность
neopt:=0;
for i:=1 to form3.m+form3.n do
if form3.simp[form3.n+1+shag,i]<0 then
neopt:=1;
until neopt=0;
form3.kolshag:=(shag div 11)+1;
// получение решения
v:=1/form3.simp[(form3.
for i:=1 to form3.n do
y[round(form3.simp[i+shag,0])]
for i:=1 to form3.m do
x[i]:= form3.simp[form3.n+1+shag,i+
form4.label4.caption:='
for i:=1 to form3.m-1 do
form4.label4.caption:=form4.
form4.label4.caption:=form4.
form4.label5.caption:='
for i:=1 to form3.n-1 do
form4.label5.caption:=form4.
form4.label5.caption:=form4.
form4.label6.caption:='Цена игры равна '+FloatToStr(RoundTo(v,-2));