Распределение затрат на общественный проект.




Исходные данные:

Потребле- ние агента 1. Потребле- ние агента 2. Потребле- ние агента 3. Потребле- ние агента 4. Потребле- ние агента 5. Потребле- ние агента 6. Цена реал изац ии
            56.4

 

Решение представлено в следующем скрипте MatLab:

N=6;

b = [3,5,10,13,17,21];

bs=sum(b);

c = 56.4;

disp(['Массив потреблений b(1:N) = ', num2str(b)]);

disp([' Затраты на проект c = ', num2str(c)]);

disp([' Сумма потреблений bs = ', num2str(bs)]);

meff = (sum(b) - c)/N;

disp([' Средняя эффективность проекта = ', num2str(meff)]);

x = b - meff;

disp([' Вектор индивидуальных затрат x(i) = ', num2str(x)]);

u = b - x;

disp(['Массив полезностей u(1:N) = ', num2str(u)]);

 

Результат работы скрипта:

Массив потреблений b(1:N) = 3 5 10 13 17 21

Затраты на проект c = 56.4

Сумма потреблений bs = 69

Средняя эффективность проекта = 2.1

Вектор индивидуальных затрат x(i) = 0.9 2.9 7.9 10.9 14.9 18.9

Массив полезностей u (1:N) = 2.1 2.1 2.1 2.1 2.1 2.1

 

Дележ продуктов.

Размер подарка печеньем. Размер подарка вином. Полезность печенья для первого. Полезность вина для первого. Полезность печенья для второго. Полезность вина для второго.
           

 

Решение представлено в следующем скрипте:

clear all

clc

global lc lw uc1 uw1 uc2 uw2

FF=10; % Размер сетки табуляции значений функций

lc=40; % Размер подарка печеньем

lw=40; % Размер подарка вином

uc1=4; uw1=60; % Параметры функции полезности для 1-го агента

uc2=3; uw2=70; % Параметры функции полезности для 2-го агента

x = linspace(0,lc,FF); % Сетка значений

% вариантов доли печенья 1-го агента

y = linspace(0,lw,FF); % Сетка значений

% вариантов доли вина 1-го агента

[x1,y1] = meshgrid(x,y); % Варианты дележа в формате

% приемлемом для построения 3-d графика

z1 = u1(x1,y1); % Полезности для 1-го агента

z2 = u2(x1,y1); % Полезности для 2-го агента

figure(1),mesh(x1,y1,z1),hold on, title('Useness 1 & 2');

mesh(x1,y1,z2);

figure(2),[C3,h] = contour(x1,y1,z1,5);grid,hold on, title('Useness 1');

text_handle = clabel(C3,h);

set(text_handle,'BackgroundColor',[1 1.6],'Edgecolor',[.7.7.7]);

figure(3),[C4,h] = contour(x1,y1,z2,5),grid,hold on, title('Useness 2');

text_handle = clabel(C4,h);

set(text_handle,'BackgroundColor',[0.9 0.9.8],'Edgecolor',[.3.3.3]);

figure(4),[C7,h] = contour(x1,y1,z1-z2, [0 0],'b'),title('Useness1 equals Use-ness2,vs Usness1'),hold on;

set(text_handle,'BackgroundColor',[0.9 0.9.8],'Edgecolor',[.3.3.3]);

[C3,h] = contour(x1,y1,z1,5),grid;

text_handle = clabel(C3,h);

set(text_handle,'BackgroundColor',[1 1.6],'Edgecolor',[.7.7.7]);

figure(5),[C7,h] = contour(x1,y1,z1-z2, [0 0],'b'),title('Useness1 equals Use-ness2.vs Useness2'),hold on;

set(text_handle,'BackgroundColor',[0.9 0.9.8],'Edgecolor',[.3.3.3]);

[C4,h] = contour(x1,y1,z2,5),grid;

text_handle = clabel(C4,h);

set(text_handle,'BackgroundColor',[0.9 0.9.8],'Edgecolor',[.3.3.3]);

figure(6), [C6,h] = contour(x1,y1,z1-z2, [0 0],'b'),title('Useness1 equals Use-ness2'),grid;

set(text_handle,'BackgroundColor',[0.9 0.9.8],'Edgecolor',[.3.3.3]);

[s1,s2] = size(C7);

cmax = C7(1,s2); % Самое большое значение x на изолинии "u1=u2"

u1par=u1(cmax,reduc(cmax))

u2par=u2(cmax,reduc(cmax))

disp([' Доля печенья первого агента равна = ', num2str(cmax)]);

disp([' Доля вина первого агента равна = ', num2str(reduc(cmax))]);

disp([' Доля печенья второго агента равна = ', num2str(lc - cmax)]);

disp([' Доля вина первого агента равна = ', num2str(reduc(cmax))]);

disp([' Полезность первого агента = ', num2str(u1par)]);

disp([' Полезность второго агента = ', num2str(u2par)]);

 

Функция U1:

function res = u1(x,y)

% Векторнозначная функция полезности 1-го агента

% зависящая от глобальных данных uc1 uw1

% и матриц x,y, соответствуюшие долям 1-го

global uc1 uw1

res=uc1*x + uw1*y;

Функция U2:

function res = u2(x,y)

% Векторнозначная функция полезности 2-го агента

% зависящая от глобальных данных uc2 uw2

% и матриц x,y, уже задействованных в u1

global uc2 uw2 lc lw

res=uc2*(lc-x) + uw2 * (lw-y);

 

Функция reduc:

function res = reduc(x)

% Функция вычисляющая res долю вина 1-го агента по x -

% его доле печенья в ситуации, когда полезности агентов выравнены

% lc=3; % Размер подарка печеньем

% lw=1; % Размер подарка вином

% uc1=1; uw1=1; % Параметры функции полезности для 1-го агента

% uc2=1; uw2=4; % Параметры функции полезности для 2-го агента

global lc lw uc1 uw1 uc2 uw2

res=((uc2*lc + uw2*lw)-x*(uc1+uc2))/(uw1+uw2);

 

Результат работы скрипта:

Размер подарка печеньем = 40

Размер подарка вином = 40

Доля печенья первого агента равна = 40

Доля вина первого агента равна = 20.3077

Доля печенья второго агента равна = 0

Доля вина первого агента равна = 20.3077

Полезность первого агента = 1378.4615

Полезность второго агента = 1378.4615

Рисунок 13. Полезность обоих агентов как функции доли 2-ого.

 

Рисунок 14. Линии безразличия 1.

Рисунок 15. Линия безразличия 2.

 

Рисунок 16. Линия равной полезности против линий безразличия 1.

 

Рисунок 17. Линия равной полезности против линий безразличия 2.

 

Рисунок 18. Линия равной полезности.

 

Проведем контроль полученного решения, проведя повторное исследование методом линейного программирования. В нашем распоряжении имеется па-кет Linear Program Solver (LiPS), предназначенный для решений задач линейного программирования. Для проверки решения сначала сформируем ЗЛП. Функция от четырех переменных f = 4 * x1 + 3 * x2 + 60 * x3 + 70 * x4 выражает общую полезность от раздачи подарка двум агентам, где:

x1 – размер подарка печеньем для первого агента

х2 – размер подарка печеньем для второго агента

х3 – размер подарка вином для первого агента

х4 – размер подарка вином для второго агента

При этом действуют следующие ограничения. Так как полезности дележа для каждого агента должны быть равны, то мы имеем:

-4 * x1 + 3 * x2 - 60 * x3 + 70 * x4 = 0.

Кроме того, дележ продуктов не должен оставлять остатков, поэтому

x1 + x2 = 40,а x3 + x4 = 40, не считая обычных ограничений для размеров подарков чисто физическими значениями – размер подарка для каждого агента не может быть отрицательным или превышать общий размер подаренных продуктов, т.е 0 x1,2 40 x3,4 40

Исходя из заданных условий, вводим в LiPS табличную модель, удовлетворяющей нашей задаче (рис. 17) и получаем решение, которое выдает максимальную величину полезности, как 2756.92 (рис. 19).

Рисунок 19. Табличная модель задачи линейного программирования.

Проверяя полезности для каждого агента, исходя из выданного решения имеем, что размер подарка печенья для первого агента равна 40, для второго 0.

В то время, как размер подарка вином для первого агента составил согласно решению ЗЛП 264/13 ≈ 20,308, а для второго 256/13 ≈ 19,692. Полезность для первого агента составляет 20,308* 60 + 40 * 4 = 1378,48, а для второго агента 19,692 * 70 = 1378,44, что с учетом погрешностей дает нам решение, подтверждающее правильность работы предыдущего скрипта.

 

 

Рисунок 20. Решение задачи линейного программирования.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: