Материал: 1

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Теория игр и исследование операций.

Отчет по лабораторной работе №1.

Задание 1.

Реализация:

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

Задание 2.

Реализация:

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

Задание 3.

Примечание: Программа, код которой приведен ниже, рассчитывает платежную матрицу данной задачи с той точки зрения, что владелец котеджа может летом закупить от 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

Задание 4.

1. Существование единственного решения:

Решение с использованием linprog:

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

2. Существование бесконечного числа решений

Решение с использованием linprog:

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

3. Отсутствие решений – область пустое множество

Решение с использованием linprog:

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

4. Отсутствие решений – неограниченная область

Решение с использованием linprog:

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