Лабораторная работа №1
Задача 1. Игроки А и В записывают цифры 1 и 2. Игра состоит в том, что, кроме своей цифры каждый игрок записывает еще и ту цифру, которую по его мнению, записал соперник. Если оба игрока угадали или оба ошиблись, то партия заканчивается вничью; если же угадал только один, то он получает столько очков, какова сумма записанных им цифр.
Реализуем эту игру в MATLAB.
clc;
A = [0 0]; B = [0 0];
AV = 0; BV = 0;
flag = input('Играем/Матрица? (1/0): ');
while flag == 1
A(1) = input('[Игрок 1] Введи свою цифру: ');
A(2) = input('[Игрок 1] Введи предпологаемую цифру противника: ');
clc
B(1) = input('[Игрок 2] Введи свою цифру: ');
B(2) = input('[Игрок 2] Введи предпологаемую цифру противника: ');
clc
if A(2)==B(1) && B(2)==A(1)
win = 'Ничья!';
elseif A(2)~=B(1) && B(2)~=A(1)
win = 'Ничья!';
elseif A(2)==B(1) && B(2)~=A(1)
AV=AV+sum(A);
win = 'Победил [Игрок 1]';
else
BV=BV+sum(B);
win = 'Победил [Игрок 2]';
end
fprintf('\nРезультат: %s\nСчет: %d\n', win, AV-BV);
flag = input('Продолжаем? (1/0): ');
end
fprintf('\nМатрица:\n');
matrix = zeros(4, 4);
val = [[1; 1], [1; 2], [2; 1], [2; 2]];
AV = 0; BV = 0;
for i = 1:4
for j = 1:4
AV = 0; BV = 0;
A = val(:, i); B = val(:, j);
if A(2)==B(1) && B(2)==A(1)
matrix(i, j) = 0;
elseif A(2)~=B(1) && B(2)~=A(1)
matrix(i, j) = 0;
elseif A(2)==B(1) && B(2)~=A(1)
AV=AV+sum(A);
else
BV=BV+sum(B);
end
matrix(i, j) = AV-BV;
end
end
disp(matrix)
Работа алгоритма:
Можно выбрать хотим ли мы играть, или хотим увидеть платежную матрицу.
Если играем, то ход
делает первый игрок:
Далее программа
сама отчищает консоль и ходит второй
игрок:
Программа выводит
результаты:
Можно вывести
платежную матрицу для этой игры:
Задача 2. Конкурирующие фирмы А и В производят однородный сезонный товар, пользующийся спросом в течение n единиц времени. Доход от продажи товара в единицу времени составляет С ден. ед. Фирма В, будучи более состоятельной, в ходе конкурентной борьбы стремится вытеснить фирму А с рынка сбыта, способствуя своими действиями минимизации ее дохода, не считаясь при этом с временными потерями части своего дохода в надежде наверстать упущенное в будущем. Действующее законодательство не позволяет использовать для этого заведомое занижение цены на товар (прибегать к демпинговым ценам). Единственным допустимым способом достижения своей цели для фирмы В (как и для фирмы А в целях защиты своих интересов на рынке сбыта) остается повышение качества товара и надлежащий выбор момента времени поставки его на рынок сбыта. Уровень спроса на товар зависит от его качества, и в данный момент реализуется тот товар, качество которого выше. Повышение же качества требует дополнительных затрат времени на совершенствование технологии его изготовления и переналадку оборудования. Поэтому будем предполагать, что качество товара тем выше, чем позже он поступает на рынок.
Таким образом стратегии для фирм А и В связаны с выбором моментов i и j предложения своего товара на рынок сбыта. А, выбирая момент i, стремится максимизировать свой доход. В преследует прямо противоположную цель – минимизировать доход игрока А.
Составить платежную матрицу игры для n=5 и С=100.
fprintf('\nМатрица:\n');
matrix = zeros(5, 5);
n = 5; c = 100;
for i = 1:n
for j = 1:n
if i==j
matrix(i, j) = c*(n - i + 1)/2;
elseif i < j
matrix(i, j) = c*(j - i);
else
matrix(i, j) = c*(n - i + 1);
end
end
end
disp(matrix)
Результат:
Задача 3. Для отопления коттеджа в зимний период используется уголь, цена на который зависит от времени года и характера зимы. Летом тонна угля стоит 7.5 ден. ед., в мягкую зиму – 8.5, в обычную – 9.0, а в холодную – 9.5. Расход угля в отопительный сезон полностью определяется характером зимы: на мягкую зиму достаточно 6 тонн, на обычную требуется 7, а в холодную расходуется 8. Арендатор может запасать топливо с лета и, в случае необходимости, пополнять его зимой. Однако продать неиспользованный уголь возможности не будет.
fprintf('\nМатрица:\n');
matrix = zeros(3, 3);
val1 = [6, 7, 8];
val2 = [8.5, 9.0, 9.5];
for i = 1:3
for j = 1:3
if (val1(j)-val1(i)) > 0
matrix(i,j) = -7.5*val1(i) - (val1(j)-val1(i))*val2(j);
else
matrix(i,j) = -7.5*val1(i);
end
end
end
disp(matrix)
Результат:
Задание 4. Используя графическую иллюстрацию решения задачи линейного программирования с ограничениям неравенствами (не менее трех) для двух независимых переменных, составить четыре задачи линейного программирования для следующих случаев:
- решение (максимум и (или) минимум целевой функции) существует и единственно;
- бесчисленное множество решений;
- решение не существует (целевая функция неограниченна на допустимом множестве);
- решение не существует (допустимое множество пусто).
Условия задач записать в трех видах:
- с ограничениями равенствами;
- неравенствами;
- смешанными.
Поскольку ответ Вам известен, получите его средствами MATLAB (команда linprog)
Оформите отчет в редакторе Word с набором формул и рисунками.
Задача максимизации (обращаем функцию). Решение единственно.
f = [-1 -1]';
A = [1 0; 0 1];
b = [5 5]';
lb = [0 0];
[x, fv] = linprog(f,A,b,[],[],lb)
x =
5.0000
5.0000
fv =
-10.0000
Задача максимизации (обращаем функцию). Решений бесконечно много.
f = [-1 -1]';
A = [1 1; 0 0];
b = [3 0]';
lb = [0 0];
[x, fv] = linprog(f,A,b,[],[],lb)
Optimization terminated.
x =
1.5000
1.5000
fv =
-3.0000
Задача максимизации (обращаем функцию). Решений нет.
f = [-1 -1]';
A = [1 -100; 0 0];
b = [0 0]';
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 dual appears to be infeasible (and the primal unbounded).
(The primal residual < TolFun=1.00e-08.)
x =
1.0e+21 *
5.1913
0.0519
fv =
-5.2433e+21
Задача максимизации (обращаем функцию). Решений нет. Многугольник решений с нулевой площадью.
f = [-1 -1]';
A = [0 -1; 1 1];
b = [-6 5]';
lb = [0 0];
[x, fv] = linprog(f,A,b,[],[],lb)
x = linspace(0,5, 500);
hold on; grid on;
plot(x, x.*0,'b')
plot(x.*0, x,'b')
plot(x, -x + 5,'b')
plot(x, x.*0+5,'b')
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-08.)
x =
0.0000
5.9801
fv =
-5.9801