Теория игр и исследование операций.
Отчет по лабораторной работе №1.
Задание 1.
Игроки А и В записывают цифры 1 и 2. Игра состоит в том, что, кроме своей цифры каждый игрок записывает еще и ту цифру, которую по его мнению, записал соперник. Если оба игрока угадали или оба ошиблись, то партия заканчивается вничью; если же угадал только один, то он получает столько очков, какова сумма записанных им цифр.
Реализация:
function res = game(mode)
if (strcmp(mode,'matrix') == 1)
a1 = 1:2;
A = zeros(numel(a1)^2);
for i = 1:numel(a1)
for j = 1:numel(a1)
A((i-1)*2 + j,1:2) = [a1(i) a1(j)];
end
end
B = A;
PayMatrix = zeros(numel(A(:,1)));
for i = 1:numel(a1)^2
for j = 1:numel(a1)^2
PayMatrix(i,j) = sud(A(i,:),B(j,:));
end
end
res = PayMatrix;
PayMatrix
return
end
N = input('Enter number of games: ');
disp(sprintf('------------------------------------------------------------------------------------'));
disp(sprintf('- - - - -'));
disp(sprintf('- N - Player A - - Player B -'));
disp(sprintf('- - - - -'));
disp(sprintf('------------------------------------------------------------------------------------'));
disp(sprintf('- - - - -'));
if ( strcmp(mode,'manual') == 1)
A = zeros(N,2);
B = zeros(N,2);
sumA = 0;
sumB = 0;
for i = 1:N
A(i,1:2) = input('Player A: ');
clc;
B(i,1:2) = input('Player B: ');
clc;
disp(sprintf('-%3d- %7s - - %7s -',i,pr(A(i,:)),pr(B(i,:))));
sumA = sumA + sud(A(i,:),B(i,:));
sumB = sumB - sud(A(i,:),B(i,:));
end
elseif ( strcmp(mode,'automatic') == 1)
A = randint(N,2,[1 2]);
B = randint(N,2,[1 2]);
sumA = 0;
sumB = 0;
for i = 1:N
disp(sprintf('-%3d- %7s - - %7s -',i,pr(A(i,:)),pr(B(i,:))));
sumA = sumA + sud(A(i,:),B(i,:));
sumB = sumB - sud(A(i,:),B(i,:));
end
end
disp(sprintf('- - - - -'));
disp(sprintf('------------------------------------------------------------------------------------'));
disp(sprintf('- - - - -'));
disp(sprintf('-SUM- %7d - - %7d -',sumA,sumB));
disp(sprintf('- - - - -'));
disp(sprintf('------------------------------------------------------------------------------------'));
end
function res = pr(A)
res = sprintf('(%2d,%2d)',A(1),A(2));
end
function res = sud(A,B)
if A(2)==B(1) & B(2)==A(1)
res = 0;
elseif A(2)~=B(1) & B(2)~=A(1)
res = 0;
elseif A(2)==B(1) & B(2)~=A(1)
res = sum(A);
else
res = -sum(B);
end
end
Пример вызова: |
game('manual') |
Формат входных данных: |
mode – параметр, регулирующий режим работы программы: 'matrix' – соответствует выводу платежной матрицы для данной игры; 'manual' – игра двух игроков; 'automatic' – симуляция игры двух игроков (не требует ввода с клавиатуры) |
>> game('automatic')
Enter number of games: 23
------------------------------------------------------------------------------------
- - - - -
- N - Player A - - Player B -
- - - - -
------------------------------------------------------------------------------------
- - - - -
- 1- ( 1, 1) - - ( 2, 2) -
- 2- ( 2, 2) - - ( 2, 2) -
- 3- ( 2, 1) - - ( 2, 2) -
- 4- ( 2, 2) - - ( 1, 1) -
- 5- ( 1, 1) - - ( 2, 1) -
- 6- ( 2, 2) - - ( 1, 1) -
- 7- ( 2, 1) - - ( 1, 2) -
- 8- ( 1, 1) - - ( 1, 1) -
- 9- ( 1, 1) - - ( 1, 2) -
- 10- ( 1, 2) - - ( 2, 2) -
- 11- ( 2, 1) - - ( 1, 2) -
- 12- ( 1, 1) - - ( 2, 1) -
- 13- ( 2, 2) - - ( 1, 1) -
- 14- ( 1, 2) - - ( 2, 1) -
- 15- ( 2, 2) - - ( 1, 2) -
- 16- ( 1, 2) - - ( 2, 1) -
- 17- ( 2, 1) - - ( 2, 2) -
- 18- ( 2, 2) - - ( 2, 1) -
- 19- ( 2, 2) - - ( 1, 1) -
- 20- ( 2, 1) - - ( 1, 1) -
- 21- ( 2, 2) - - ( 1, 1) -
- 22- ( 1, 1) - - ( 2, 2) -
- 23- ( 1, 1) - - ( 1, 2) -
- - - - -
------------------------------------------------------------------------------------
- - - - -
-SUM- -3 - - 3 -
- - - - -
------------------------------------------------------------------------------------
>> game('matrix')
PayMatrix =
0 2 -3 0
-2 0 0 3
3 0 0 -4
0 -3 4 0
Конкурирующие фирмы А и В производят однородный сезонный товар, пользующийся спросом в течении n единиц времени. Доход от продажи товара в единицу времени составляет C ден. ед. Фирма В, будучи более состоятельной в ходе конкурентной борьбы стремиться вытеснить фирму А с рынка сбыта, способствуя своими действиями минимизации ее дохода, не считаясь при этом с временными потерями части своего дохода в надежде наверстать упущенное в будущем. Действующее законодательство не позволяет использовать для этого заведомо занижение цены на товар(прибегать к демпинговым ценам). Единственным допустимым способом достижения своей цели для фирмы В (как и для фирмы А в целях защиты своих интересов на рынке сбыта) остается повышение качества товара и надлежащий выбор момента времени поставки его на рынок сбыта. Уровень спроса на товар зависит от его качества, и в данный момент реализуется товар, качество которого выше. Повышение же качества требует дополнительных затрат времени на совершенствование технологии его изготовления и переналадку оборудования. Поэтому будем предполагать, что качество товара тем выше, чем позже он поступает на рынок.
function game2(mode)
C = 100;
n = 5;
if (strcmp(mode,'matrix') == 1)
A = 1:n;
B = 1:n;
for i = 1:n
for j = 1:n
[mn, idx] = min([A(i),B(j)]);
Delta(i,j) = abs(A(i) - B(j))*(-1)^(idx+1)*C;
sm(i,j) = (n-(A(i)+B(j) - mn)+1)*C*(-1)^(idx);
PayMatrix(i,j) = Delta(i,j) + sm(i,j);
if (A(i)==B(j))
PayMatrix(i,j) = 0;
end
end
end
PayMatrix
return;
end
Number = input('Number of games = ');
hello;
if (strcmp(mode,'manual') == 1)
for i = 1:Number
A(i) = input('Player A: ');
clc;
B(i) = input('Player B: ');
clc;
end
end
if (strcmp(mode,'automatic') == 1)
A = randint(1,Number,n) + 1;
B = randint(1,Number,n) + 1;
end
for i = 1:Number
show(A(i),B(i));
[mn, idx] = min([A(i),B(i)]);
Delta(i) = abs(A(i) - B(i))*(-1)^(idx+1)*C;
sm(i) = (n-(A(i)+B(i) - mn)+1)*C*(-1)^(idx);
if (A(i)==B(i))
Delta(i) = 0;
sm(i) = 0;
end
end
Asum = sum(Delta + sm);
Bsum = sum(-Delta - sm);
its_all(Asum,Bsum);
end
function res = pr(A)
res = sprintf('%7d',A);
end
function show(A,B)
disp(sprintf('-%3d- %7s - - %7s -',i,pr(A),pr(B)));
end
function res = sud(A,B)
if A(2)==B(1) & B(2)==A(1)
res = 0;
elseif A(2)~=B(1) & B(2)~=A(1)
res = 0;
elseif A(2)==B(1) & B(2)~=A(1)
res = sum(A);
else
res = -sum(B);
end
end
function hello
disp(sprintf('------------------------------------------------------------------------------------'));
disp(sprintf('- - - - -'));
disp(sprintf('- N - Player A - - Player B -'));
disp(sprintf('- - - - -'));
disp(sprintf('------------------------------------------------------------------------------------'));
disp(sprintf('- - - - -'));
end
function its_all(a,b)
disp(sprintf('- - - - -'));
disp(sprintf('------------------------------------------------------------------------------------'));
disp(sprintf('- - - - -'));
disp(sprintf('-SUM- %7d - - %7d -',a,b));
disp(sprintf('- - - - -'));
disp(sprintf('------------------------------------------------------------------------------------'));
end
Пример вызова: |
game2('manual') |
Формат входных данных: |
mode – параметр, регулирующий режим работы программы: 'matrix' – соответствует выводу платежной матрицы для данной игры; 'manual' – игра двух игроков; 'automatic' – симуляция игры двух игроков (не требует ввода с клавиатуры) |
>> game2('automatic')
Number of games = 23
------------------------------------------------------------------------------------
- - - - -
- N - Player A - - Player B -
- - - - -
------------------------------------------------------------------------------------
- - - - -
- 0- 3 - - 2 -
- 0- 2 - - 3 -
- 0- 4 - - 4 -
- 0- 4 - - 4 -
- 0- 2 - - 2 -
- 0- 1 - - 2 -
- 0- 2 - - 5 -
- 0- 2 - - 1 -
- 0- 3 - - 5 -
- 0- 3 - - 5 -
- 0- 1 - - 4 -
- 0- 2 - - 1 -
- 0- 5 - - 2 -
- 0- 1 - - 2 -
- 0- 5 - - 4 -
- 0- 4 - - 1 -
- 0- 3 - - 4 -
- 0- 3 - - 1 -
- 0- 2 - - 4 -
- 0- 3 - - 3 -
- 0- 5 - - 4 -
- 0- 3 - - 4 -
- 0- 3 - - 5 -
- - - - -
------------------------------------------------------------------------------------
- - - - -
-SUM- 200 - - -200 -
- - - - -
------------------------------------------------------------------------------------