183466 (Имитационная модель интеллектуального агента в условиях конкуренции), страница 2
Описание файла
Документ из архива "Имитационная модель интеллектуального агента в условиях конкуренции", который расположен в категории "". Всё это находится в предмете "экономико-математическое моделирование" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "экономико-математическое моделирование" в общих файлах.
Онлайн просмотр документа "183466"
Текст 2 страницы из документа "183466"
QUAN(INTEGER):IUNIFORM(LowLimit:=100,UpLimit:=200), # объем выпуска
SAL(REAL):UNIFORM(LowLimit:=0,UpLimit:=1), # скидки
ADV(REAL):UNIFORM(LowLimit:=15,UpLimit:=35), # реклама
QUAL(REAL):EXPO(Mean:=50), # качество
ASSORT(INTEGER):IUNIFORM(LowLimit:=1,UpLimit:=3), # товарный ассортимент
TRU(INTEGER):IUNIFORM(LowLimit:=2,UpLimit:=5), # доверие
REMOT(REAL):EXPO(Mean:=150), # удаленность
DELIV(INTEGER):IUNIFORM(LowLimit:=1,UpLimit:=3), # доставка
Inv(INTEGER):IUNIFORM(LowLimit:=1,UpLimit:=4) # денежные поступления извне
TRANSITIONS INDICATORS
print,
ffm,
ffm2,
ffm3
LOCATION
QueryStock1(query):=0 query, # накопитель, содержащий параметры предложения
F1Stock(query):=0 query # накопитель, содержащий параметры предложения фирм- конкурентов
SENSOR LOCATION
FStock(query)
DYNAMIC BEHAVIOUR
ON START DO
parameters1[1]^:=PRI;
parameters1[2]^:=QUAN;
parameters1[4]^:=ADV;
parameters1[5]^:=QUAL;
parameters1[6]^:=1;
parameters1[7]^:=TRU;
parameters1[8]^:=REMOT;
parameters1[9]^:=DELIV;
SIGNAL ffm;
END
WHENEVER T>=TNext
DO IF (NUMBER(FStock)<>0) DO
SIGNAL ffm3;
(ARRAY p1^,past_b^):=strategy(past_b2,LOCATION FStock,ARRAY LOST_cl,
ARRAY balances,ff,1,g,ARRAY parameters1,invest,ARRAY demand);
SIGNAL ffm2;
END
SIGNAL ffm;
TNext^:=TNext+1;
END
ON ffm DO
QueryStock1^: ADD 1 NEW query
CHANGING
(ARRAY QB^):=form(ARRAY parameters1);
END
END
ON ffm2 DO
(ARRAY parameters1^):=form(ARRAY p1);
END
ON ffm3 DO
past_b2^:=past_b;
invest^:=Inv;
END
END OF Firm
Приходя на рынок (базисный компонент Market), покупатель рассматривает предложение каждой фирмы и выбирает максимально соответствующее его требованиям. Параллельно ведется подсчет покупателей для каждой из фирм, а также количество купленного товара.
FUNCTION FChoice
MOBILE SUBCOMPONENT OF CLASS query
DECLARATION OF ELEMENTS
INPUT PARAMETERS
FStock(LOCATION FOR query),
ARRAY[n][s]CRITER(REAL), #покупатель
ARRAY [l] Dummy(REAL),
g(INTEGER)
OUTPUT PARAMETERS
ARRAY[l]balance(REAL), #остаток на складе
f(INTEGER), #количество покупателей фирмы 1
f2(INTEGER), #количество покупателей фирмы 2
f3(INTEGER), #количество покупателей фирмы 3
ARRAY[n][l]copy_param(REAL),
ARRAY[l]LOST_clients(LOGICAL),
leader(INTEGER),
ARRAY [l]dem(REAL)
LOCAL VARIABLES
ss(INTEGER):=100,
k(REAL):=0, #количество совпадающих параметров
rem(REAL):=0,
maxim(REAL):=0,
imaxim(INTEGER):=0,
JMAX(INTEGER):=0,
ARRAY[l][s]QuBu(REAL):=0, #массив совпадений
ARRAY[l][s]QuanBuy(INTEGER), #массив распределения покупателей
ARRAY [l]clients(INTEGER),
max_cl(INTEGER)
BEGIN
FOR W FROM 1 TO 9
REPEAT
FOR I FROM 1 TO g
REPEAT
copy_param[W][I]:=FStock:query[I].QB[W];
balance[I]:=FStock:query[I].QB[2];
END_LOOP
END_LOOP
#Процесс сравнения критериев покупателей с параметрами продавцов
FOR J FROM 1 TO g
REPEAT
FOR I FROM 1 TO ss
REPEAT
k:=0;
FOR R FROM 1 TO 9
REPEAT
IF R<>2 DO
# Для удовлетворения покупателя параметр продавца не должен отклоняться более чем на 20% от требования покупателя.
IF (FStock:query[J].QB[R]<=CRITER[R][I]+CRITER[R][I]*0.2) AND
(FStock:query[J].QB[R]>=CRITER[R][I]-CRITER[R][I]*0.2)
DO
k:=k+1/9;# степень удовлетворенности покупателя
END
END
END_LOOP
QuBu[J][I]:=k;
END_LOOP
END_LOOP
# Выбор покупателем наиболее подходящей фирмы
FOR I FROM 1 TO ss
REPEAT
# если итоговые показатели всех фирм одинаковы, то выбирается первая встречная, на которой есть необходимое количество товара.
IF (QuBu[1][I]=QuBu[2][I]) AND (QuBu[1][I]=QuBu[3][I])
AND (QuBu[1][I]<>0)
DO LOOP
FOR J FROM 1 TO g
REPEAT
# подсчет остатков и выявление упущенных клиентов
IF balance[J]>=CRITER[2][I] DO
balance[J]:=balance[J]-CRITER[2][I];
QuanBuy[J][I]:=1;
LOST_clients[J]:=FALSE;
EXIT ;
END
END_LOOP
END
ELSIF (QuBu[1][I]<>QuBu[2][I]) OR (QuBu[1][I]<>QuBu[3][I])
DO
maxim:=0;
FOR J FROM 1 TO g
REPEAT
IF QuBu[J][I]>maxim DO
maxim:=QuBu[J][I];
imaxim:=J;
JMAX:=I;
END
END_LOOP
Подсчет остатков и объема упущенных продаж
IF balance[imaxim]>=CRITER[2][I] DO
balance[imaxim]:=balance[imaxim]-CRITER[2][I];
QuanBuy[imaxim][JMAX]:=1;
LOST_clients[imaxim]:=FALSE;
END
ELSIF balance[imaxim] DISPLAY("Товара НЕТ на %d !!!\n",imaxim); LOST_clients[imaxim]:=TRUE; dem[imaxim]:=dem[imaxim]+CRITER[2][I]; END END END_LOOP FOR J FROM 1 TO ss REPEAT f := f + QuanBuy[1][J];# подсчет количества покупателей 1 фирмы END_LOOP FOR J FROM 1 TO ss REPEAT f2 := f2 + QuanBuy[2][J];# подсчет количества покупателей 2 фирмы END_LOOP FOR J FROM 1 TO ss REPEAT f3 := f3 + QuanBuy[3][J];# подсчет количества покупателей 3 фирмы END_LOOP clients[1]:=f; clients[2]:=f2; clients[3]:=f3; #Выявление фирмы-лидера max_cl:=0; FOR I FROM 1 TO g REPEAT IF clients[I]>max_cl DO max_cl:=clients[I]; leader:=I; END END_LOOP RETURN END OF FChoice В конце временного периода каждой фирме отправляется информация о количестве покупателей и об остатках товара на складах. Это реализовано в компоненте высокого уровня. HIGH LEVEL COMPONENT Market_HIGH SUBCOMPONENTS Firm, Firm2, Firm3, buyer, Market COMPONENT CONNECTION Firm.QueryStock1-->Market.QStock1; Firm2.QueryStock2-->Market.QStock2; Firm3.QueryStock3-->Market.QStock3; buyer.criterion{i OF 1..9}{j OF 1..100}-->Market.criterion[i][j]; массив критериев покупателей Firm.parameters1{i OF 1..9}-->Firm3.parameters1[i]; параметры 1 фирмы в 3-ю Firm2.parameters2{i OF 1..9}-->Firm3.parameters2[i]; параметры 2 фирмы в 3-ю Market.g-->Firm.g; Market.g-->Firm2.g; Market.g-->Firm3.g; # Количество покупателей Market.ff-->Firm.ff; Market.ff2-->Firm2.ff2; Market.ff3-->Firm3.ff3; # Остатки на складах Market.balances[1]-->Firm.balances[1]; Market.balances[2]-->Firm2.balances[2]; Market.balances[3]-->Firm3.balances[3]; # Необслуженные клиенты Market.LOST_clients[1]-->Firm.LOST_cl[1]; Market.LOST_clients[2]-->Firm2.LOST_cl[2]; Market.LOST_clients[3]-->Firm3.LOST_cl[3]; # Фирма - лидер Market.firm_leader-->Firm.firm_leader; Market.firm_leader-->Firm2.firm_leader; Market.firm_leader-->Firm3.firm_leader; # Массив, содержащий объем упущенных продаж по каждой фирме Market.demand[1]-->Firm.demand[1]; Market.demand[2]-->Firm2.demand[2]; Market.demand[3]-->Firm3.demand[3]; Market.EQUIPOISE-->Firm3.EQUIPOISE; END OF Market_HIGH Исходя из этого и учитывая прошлый опыт (объем продаж и спрос за прошлые периоды), олигополист выбирает одну из возможных стратегий на последующий период времени. Событие 1. Так как фирм немного, то каждый продавец вынужден следить за поведением конкурентов. Таким образом, в модели фирмы-участники договариваются об установлении средней цены. Каждая фирма считает недостающий объем выпуска и в событии 2 при наличии необслуженных клиентов, увеличивает выпуск на недостающую величину. Событие 3. Если остаток фирмы больше 1/3 всего выпущенного объема, то олигополист вводит скидки для распродажи и уменьшает выпускаемый объем на 2%. Далее, исходя из изменений спроса, олигополист варьирует неценовые факторы (событие 4). Если в текущем периоде увеличивается количество покупателей по сравнению с прошлым периодом, то фирма увеличивает предлагаемый товар на 10 ед. Если же спрос снижается, то фирма предпринимает действия в соответствии с количеством имеющихся свободных денежных средств (переменная cash). При величине cash = 1, соответствующей большой сумме денежных поступлений, олигополист разрабатывает новый продукт и увеличивает свой товарный ассортимент. Дальнейшие изменения переменной cash означают уменьшение денежных средств. При cash = 2 олигополист улучшает качество имеющегося товара, тем самым улучшая свой имидж и увеличивая доверие клиентов. При cash = 3 улучшается реклама. При cash = 4 – доставка. Данный алгоритм в программе реализован следующим образом. FUNCTION strategy MOBILE SUBCOMPONENT OF CLASS query LOCAL DEFINITIONS DECLARATION OF SUBFUNCTION form(ARRAY [n]REAL:PP-->ARRAY[n]REAL) DECLARATION OF ELEMENTS INPUT PARAMETERS past_buy2(INTEGER), #j=2 l=3 n=9 Stock(LOCATION FOR query), ARRAY[l] LOST_c(LOGICAL), ARRAY[l] bal(REAL), ff1(INTEGER), I(INTEGER), #номер фирмы g(INTEGER), ARRAY [n]param1(REAL), cash(INTEGER), ARRAY [l]dem(REAL) OUTPUT PARAMETERS ARRAY[n] par(REAL), past_buy(INTEGER) LOCAL VARIABLES average_price(REAL):=0, cash1(INTEGER):=0 BEGIN (ARRAY par):=form(ARRAY param1); #Событие 1 FOR J FROM 1 TO g REPEAT average_price:=average_price+Stock:query[J].QB[1]; END_LOOP average_price:=average_price/g; DISPLAY("сред цена %3.2f\n",average_price); IF par[1]>average_price DO par[1]:=par[1]-par[1]*0.01; END ELSIF par[1] DO par[1]:=par[1]+par[1]*0.01; END #Событие 2 IF LOST_c[I] DO par[2]:=par[2]+dem[I]; END ELSIF LOST_c[I]=FALSE DO par[2]:=par[2]; END #Событие 3 IF bal[I]>par[2]/3 DO par[3]:=par[3]+1; par[2]:=par[2]-par[2]*0.02; END #Событие 4 IF ff1>past_buy2 DO par[2]:=par[2]+10; END ELSIF ff1<=past_buy2 DO IF cash=1 DO par[6]:=par[6]+1; END ELSIF cash=2 DO par[5]:=par[5]+5; IF (par[5]>230) AND (par[7]<6) DO par[7]:=par[7]+1; END END ELSIF cash=3 DO par[4]:=par[4]+5; END ELSIF (cash=4) AND (par[9]<3) DO par[9]:=par[9]+1; END END past_buy:=ff1; RETURN END OF strategy Результаты Когда на рынке устанавливается относительное равновесие цен между первой и второй фирмой, то на него входит новая фирма, которая предварительно изучила ситуацию. Теперь события будут развиваться с тремя конкурентами до обретения нового равновесия (рис. 1, 2). Рис. 1 - Процесс установления средней цены Рис. 2 - Доля рынка каждой фирмы На графике представлено количество покупателей каждой фирмы. Синяя линия соответствует первой фирме (Firm), красная – второй (Firm2), а зеленая – третьей (Firm3). Очевидно, что некоторая доля рынка перейдет к новичку. Модель показала, какой эта доля будет и статус, который займет новая фирма – олигополист. На рис. 3 отражена конкурентная борьба, происходящая между олигополистами. Рис. 3 - Объем выпуска каждой фирмы – олигополиста Объем выпускаемой продукции напрямую связан со спросом на нее. Чем выше спрос, тем больше выпуск. Следующие графики отображают изменение величины спроса отдельно взятой фирмы. Синяя линия – это предлагаемый объем продукции, красная – остатки на складе, после совершения покупок клиентами, а область между ними – величина спроса. Рис. 4 - Изменение спроса на товар 1 фирмы Рис. 5 - Изменение спроса на товар 2 фирмы Рис. 6 - Изменение спроса на товар 3 фирмы