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('matrix')
PayMatrix =
0 2 -3 0
-2 0 0 3
3 0 0 -4
0 -3 4 0
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('matrix')
PayMatrix =
0 -300 -100 100 300
300 0 -200 0 200
100 200 0 -100 100
-100 0 100 0 0
-300 -200 -100 0 0
Примечание: Программа, код которой приведен ниже, рассчитывает платежную матрицу данной задачи с той точки зрения, что владелец котеджа может летом закупить от 0 до 8 тонн. В зависимости от объема, который будет куплен летом расчитывается сумма затрат на данный уголь плюс который потребуется к нему. Из результата вычитаем идеальное значение затрат — цена за уголь если его на всю зиму купить летом, и итог записывается в соответствующую ячейку матрицы.
function game3
SumCost = 7.5;
WinCost = [8.5 9.0 9.5];
WinWeight = [6 7 8];
A = 1:numel(WinCost);
B = 0:max(WinWeight);
for i = 1:numel(A)
for j = 1:numel(B)
S = SumCost*WinWeight(A(i));
PayMatrix(j,i) = S - B(j)*SumCost - (WinWeight(A(i)) - B(j))*WinCost(A(i))* ((WinWeight(A(i)) - B(j))>0);
end
end
PayMatrix
end
>> game3
PayMatrix =
-6.0000 -10.5000 -16.0000
-5.0000 -9.0000 -14.0000
-4.0000 -7.5000 -12.0000
-3.0000 -6.0000 -10.0000
-2.0000 -4.5000 -8.0000
-1.0000 -3.0000 -6.0000
0 -1.5000 -4.0000
-7.5000 0 -2.0000
-15.0000 -7.5000 0
f = [-1 -1]';
A = [1 0; 0 1];
b = [2 2]';
lb = [0 0];
[x fv] = linprog(f,A,b,[],[],lb)
Optimization terminated.
x =
2.0000
2.0000
fv =
-4.0000
f = [-1 -1]';
A = [1 1; -1 -1];
b = [1 -1/2]';
lb = [0 0];
[x fv] = linprog(f,A,b,[],[],lb)
Optimization terminated.
x =
0.5000
0.5000
fv =
-1.0000
f = [-1 -1]';
A = [1 0; 0 1;-1 0];
b = [0 2 -2]';
lb = [0 0];
[x fv] = linprog(f,A,b,[],[],lb)
Exiting: One or more of the residuals, duality gap, or total relative error
has grown 100000 times greater than its minimum value so far:
the primal appears to be infeasible (and the dual unbounded).
(The dual residual < TolFun=1.00e-008.)
x =
1.9803
2.2357
fv =
-4.2160
f = [-1 -1]';
A = [-1 -1; -1 -1];
b = [-1/2 -1]';
lb = [0 0];
[x fv] = linprog(f,A,b,[],[],lb)
Exiting: One or more of the residuals, duality gap, or total relative error
has stalled:
the dual appears to be infeasible (and the primal unbounded).
(The primal residual < TolFun=1.00e-008.)
x =
1.0e+011 *
1.3835
1.3835
fv =
-2.7670e+011