Задание 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;