Новые сообщения · Правила  
  • Страница 1 из 1
  • 1
Модератор форума: Berestovskiy  
Решение матричной игры методом Брауна-Робинсона (ДОДЕЛАТЬ)
Доброго времени суток! Нужна помощь.
Программа есть, ниже будет код. Эта программа решает все правильно, нужно лишь ее подправить и добавить кое чего. Во-первых нужно сделать так, чтобы результатом была не таблица итераций, а просто ответ - приближенное значение цены игры. И нужно чтобы еще выводилось соотношение количества каждой стратегии игрока, к количество итераций. Например:
Итерации 1, 2, 3, . . . n (в зависимости от размерности, количество итераций разное) соответственно встречаются:
У 1го игрока: 1/20, 15/20, 4/20 (1-это количество выбранных первых стратегий, 15-вторых и 4 третьих) можно вывести не в отношении, а просто десятичные дроби, как результаты деления 1 на 20, 15 на 20 и 4 на 20.
Так же и для второго игрока.
И еще, пусть и в входных данных матрица M*N желательно сделать относительно обычной квадратной матрице.
Я понимаю, что может это и не просто, но буду безмерно рада, если вы поможете.

Добавлено (12.05.12, 15:37)
---------------------------------------------

Code
uses crt;  
var matr:array [1..9,1..9] of integer;  
win1:array[0..150,1..10] of integer;  
win2:array[0..150,1..10]  of integer;  
   m,n,i,j,k, min, max,it, ik,p,a,str,str1:integer;  
kli:real;   
function first_igr:integer;             {Функция определения следующего}  
var a1,a2,max:integer;          {хода для игрока 1}  
begin  
max:=win1[a,1];  
first_igr:=1;  
if p=1 then a2:=m else a2:=n;  
for a1:=1 to a2 do if win1[a,a1]>max then begin  
max:=win1[a,a1];  
first_igr:=a1;  
end;  
end;   
function second_igr:byte;               {Функция определения следующего}  
var a1,a2,min:integer;          {хода для игрока 2}  
begin  
min:=win2[a,1];  
second_igr:=1;  
if p=1 then a2:=n else a2:=m;  
for a1:=1 to a2 do if win2[a,a1]<min then begin  
min:=win2[a,a1];  
second_igr:=a1;  
end;  
end;  
begin  
writeln('Введите размерность матрицы M*N');readln(m,n);  
writeln('Ввод матрицы:');  
for i:=1 to m do  
for j:=1 to m do  
read(matr[i,j]);  
writeln('Какой игрок начинает игру?');readln(p);  
writeln('Какую стратегию выбирает игрок?');readln(str);  
writeln('Введите количество итераций'); readln(k);  

Добавлено (12.05.12, 15:38)
---------------------------------------------

Code
a:=1;                       {заглавие таблицы}  
writeln(' №    стр.  выигрыш 1-го игр.          стр.    выигрыш 2-го игр.  V   W   Y');  
repeat  
write(a:2,str:6,'  ');          {формирование таблицы: номер итерации, стратегия 1игр.}  
if p=2 then begin  
for i:=1 to n do begin  
win1[a,i]:=matr[str,i]+win1[a-1,i];{формирование матрицы выигрышей 1 игр.}  
write(win1[a,i]:4);  
end;  
str1:=first_igr;            {определение ответной стратегии 2 игр.}  
gotoxy(32,wherey);  
write(str1:10,'    ');  
for i:=1 to m do begin  
win2[a,i]:=matr[i,str1]+win2[a-1,i];    {формирование матрицы выигрышей 2 игр.}  
write(win2[a,i]:4);  
end;   

Добавлено (12.05.12, 15:38)
---------------------------------------------

Code
gotoxy(64,wherey);  
write(win1[a,str1]:4);          {вывод наибольшего суммарного выигрыша 1 игр.}  
str:=second_igr;                    {определение ответной стратегии 1 игр.}  
write(win2[a,str]:4);           {вывод наибольшего суммарного выигрыша 2 игр.}  
write((win1[a,str1]+win2[a,str])/(a*2):6:2);{приближенное значение цены игры на шаге}  
end  
else  

Добавлено (12.05.12, 15:38)
---------------------------------------------

Code
begin  
for i:=1 to m do begin  
win1[a,i]:=matr[i,str]+win1[a-1,i];{формирование матрицы выигрышей 1 игр.}  
write(win1[a,i]:4);  
end;  
str1:=first_igr;                {определение ответной стратегии 2 игр.}  
gotoxy(32,wherey);  
write(str1:10,'    ');  
for i:=1 to n do begin  
win2[a,i]:=matr[str1,i]+win2[a-1,i];{формирование матрицы выигрышей 2 игр.}  
write(win2[a,i]:4);  
end;  
gotoxy(64,wherey);  
write(win1[a,str1]:4);          {вывод наибольшего суммарного выигрыша 1 игр.}  
str:=second_igr;                    {определение ответной стратегии 1 игр.}  
write(win2[a,str]:4);           {вывод наибольшего суммарного выигрыша 2 игр.}  
write((win1[a,str1]+win2[a,str])/(a*2):6:2);{приближенное значение цены игры}  
kli:= ((win1[a,str1]+win2[a,str])/(a*2));  
end;  
a:=a+1;                 {увеличение счетчика}  
writeln;  
until a=k+1;  
writeln('Приближенное значение цены игры =',kli);  
writeln('Где V - наибольший суммарный выигрыш первого игрока');  
writeln('    W - наименьший суммарный проигрыш второго игрока');  
writeln('    Y - приближенное значение игры на данной итерации');  
end.
1 | Автор: lEXI_DEKKER | 2012-05-12, 15:38   |  Репутация: [ + 0 ]
  • Страница 1 из 1
  • 1
Поиск: