Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание 4-6.docx
Скачиваний:
8
Добавлен:
28.05.2015
Размер:
555.85 Кб
Скачать

Задание 4. Матричные игры

Определить нижнюю и верхнюю цену игры, заданной платёжной матрицей, где k – номер варианта.

Используя графическую интерпретацию, найти решение игры.

Имея вариант №23, получаем платежную матрицу.

Результаты работы программы.

Код основной части программы.

m: Integer; // Общее количество строк

n: Integer; // Общее количество столбцов

A: array[1..MaxSize, 1..MaxSize] of Real; // Платежная матрица игры

X: array[1..MaxSize] of Real; // Вероятность стратегии для строки

Y: array[1..MaxSize] of Real; // Вероятность стратегии для столбца

Z1: array[1..MaxSize] of Real; // Коэффициенты для итерации

Z2: array[1..MaxSize] of Real;

procedure UpDateMatrix;

public

end;

var

MainForm: TMainForm;

implementation

procedure TMainForm.UpDateMatrix;

var

I: Integer;

begin

for I := 1 to Matrix.RowCount do

begin

Matrix.Cells[0, I] := 'A' + IntToStr(I);

end;

for I := 1 to Matrix.ColCount do

begin

Matrix.Cells[I, 0] := 'B' + IntToStr(I);

end;

end;

// Процедура поиска наименьшего элемента в массиве

function Min(var Buf; n: Integer): Integer;

var

r: Real;

i, Index: Integer;

begin

Index := 1;

r := TRealArray(Buf)[1];

for i := 2 to n do

begin

if TRealArray(Buf)[i] < r then

begin

Index := i;

r := TRealArray(Buf)[i];

end;

end;

Result := Index;

end;

// Процедура поиска наибольшего элемента в массиве

function Max(var Buf; n: Integer): Integer;

var

r: Real;

i, Index: Integer;

begin

Index := 1;

r := TRealArray(Buf)[1];

for i := 2 to n do

begin

if TRealArray(Buf)[i] > r then

begin

Index := i;

r := TRealArray(Buf)[i];

end;

end;

Result := Index;

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

m := 3;

n := 2;

UpDateMatrix;

end;

procedure TMainForm.ExitBitBtnClick(Sender: TObject);

begin

Close;

end;

procedure TMainForm.PlayerBChange(Sender: TObject);

var

temp: Integer;

begin

temp := 0;

try

temp := StrToInt(PlayerB.Text) + 1;

except

Matrix.ColCount := 2;

PlayerB.Text := '1';

end;

if not ((temp > 1) and (temp < 102)) then

begin

Matrix.ColCount := 6;

PlayerB.Text := '5';

m := 5;

end else

begin

m := temp - 1;

Matrix.ColCount := temp;

UpDateMatrix;

end;

end;

procedure TMainForm.PlayerAChange(Sender: TObject);

var

temp: Integer;

begin

try

temp := StrToInt(PlayerA.Text) + 1;

except

Matrix.RowCount := 2;

PlayerB.Text := '1';

Exit;

end;

if not ((temp > 1) and (temp < 102)) then

begin

Matrix.RowCount := 6;

PlayerB.Text := '5';

n := 5;

end else

begin

n := temp - 1;

Matrix.RowCount := temp;

UpDateMatrix;

end;

end;

procedure TMainForm.FindBitBtnClick(Sender: TObject);

var

C1, C2, CSUM, temp: Real;

i, j, k: Integer;

begin

temp := 0;

for i := 1 to n do

for j := 1 to m do

begin

try

if String(Matrix.Cells[j, i]) = '' then

begin

ShowMessage('Введите значения матрицы!');

Exit;

end;

temp := StrToFloat(String(Matrix.Cells[j, i]));

except

ShowMessage('Неправилный формат числа: "' + String(Matrix.Cells[j, i]) + '"');

Exit;

end;

A[i, j] := temp;

end;

// Решение матрицы

// Обнуляем массивы

FillChar(X, SizeOf(X), 0);

FillChar(Y, SizeOf(X), 0);

FillChar(Z1, SizeOf(X), 0);

FillChar(Z2, SizeOf(X), 0);

k := 0;

i := 1;

repeat

Inc(k);

for j := 1 to n do Z1[j] := Z1[j] + A[i, j]; // Расчет элементов строки

j := Min(Z1, n); // Поиск наименьшего в строке

Y[j] := Y[j] + 1;

C1 := Z1[j] / k; // Нижняя цена игры

for i := 1 to m do Z2[i] := Z2[i] + a[i, j]; // Расчет элементов столбца

i := Max(Z2, n); // Поиск наибольшего в столбце

X[i] := X[i] + 1;

C2 := Z2[i] / K; // Верхняя цена игры

CSUM := (C1 + C2) / 2; // Среднее значение цены игры

until k = IterationCount;

// Определение оптимальных смешанных стратегий

for i := 1 to m do X[i] := X[i] / k; // Для строк

for j := 1 to n do Y[j] := Y[j] / k; // для столбцов

Memo.Clear;

Memo.Lines.Add('Цена игры: ' + FloatToStr(CSUM));

Memo.Lines.Add('');

for i := 1 to m do Memo.Lines.Add('P(A'+ IntToStr(i) + ') = ' + FloatToStr(x[i]));

Memo.Lines.Add('');

Memo.Lines.Add('----------');

Memo.Lines.Add('');

for i := 1 to n do Memo.Lines.Add('P(B'+ IntToStr(i) + ') = ' + FloatToStr(y[i]));

end;