using System;
using S =GPSSSYS.Sys;
using GPSSSYS;
using A = AddGPSS.AddMethods;
namespace Model
{
internal struct Model0
{
/*~cb*/
// Model description auto.
public const int Gen = 1;
public const int Ret = 2;
public const int Ret2 = 5;
public const int Ret1 = 6;
public const int Bye1 = 11;
public const int Gen0 = 13;
public const int _ModelTxt = 19;
public const int _NumBl =18;
public const string _ModelName = @"H:\E\C#\GPSS Proj\gpss Segmental 8 11 2013 object\GPSSSegmenal\modelsConv\samples3 good C##\Agent.rtf";
public const string _AddModelText = @"Agent.txt";
/*~ce*/ /*#Model Unit0.cs*/
static int NModelTxt;
public static AltRandom RR;
static TFuture Future;
static TFuture FutureBye;
static TFuture FutureEnd;
static int NumByeRecl ;//~2;
static int NumByeAgitation;//~4;
static OArr Graphic;//~5;
static OArr Graphic0;//~6;
static OArr Graphic1;//~7;
/*~ve*/ //=~0;
internal static void Initial()
{
S.Init( out RR,10,111); // возможно S.Init( out RR);
S.Init(out Future, "Future");// список будущих событий для возможных покупателей.
S.Init(out FutureBye, "FutureBye");// список будущих событий для тех, кто купил.
S.Init(out FutureEnd, "FutureEnd");// список будущих событий для заявок, управляющих временем завершения модели.
S.Init(out NModelTxt, ModelTxt, "Segment", _ModelTxt-1, true);
A.SetStart(100);
Future.NewWaitProc(NModelTxt,Gen,0);//~1;
NumByeRecl = 0;//~2;
FutureEnd.NewWaitProc(NModelTxt,Gen0,1000);//~3;
NumByeAgitation = 0;//~4;
A.SetReportFlag(11,false);
A.SetReportFlag(13,false);
A.SetReportFlag(16,false);
S.Init( out Graphic);//~5;
S.Init( out Graphic0);//~6;
S.Init( out Graphic1);//~7;
/*~ie*/
} /*~mtb*/
internal static void ModelTxt()
{
switch (S.ActiveBlock)
{
::Gen *:Future.NewWait(0,0,2000);//~1; // В модкль вводим 2000 заявок.
::Ret *:Future.Wait(Exponential(100)); // задержка на время для возможной покупки.
*:Transfer(0.01,Ret,!*); // возможна покупка с вероятностью 0.01
*:NumByeRecl ++; // покупка по рекламе
::Ret2 *:Assign(1,AClock);// время покупки запомнено в DP(1).
::Ret1 *:FutureBye.Wait(Exponential(100)); // задержка на время для возможной агитации
*:Test(BB(AClock<DP(1)+1200, AClock<DP(1)+16000, true),II(!*, Ret1, Ret)); // если прошло менее 1200 ед времени, то агитация возможна,
// иначе, если прошло менее 16000 ед времени, то покупке забыли, иначе готовы к новой покупке.
*:Transfer(0.05, Ret1, !*); // возможна успешная агтация с вероятностью 0.05
*:Future.UnlinkByNum( RR.IUniform(0, Future.L-1), Bye1); // сагитированный клиент идет покупать на Bye1
*:Transfer(Ret1); // новый цикл до возможной агитации.
::Bye1 *:NumByeAgitation++;// покупка по агитации
*:Transfer(Ret2); // Переход на ветвь после покупки
::Gen0 *:FutureEnd.NewWait(1000);//~3; // счетчик завершения по времени.
*:A.ToString(0,"Count= ",Count);
*:Graphic.Add(AClock,(NumByeAgitation+NumByeRecl )/AClock);
*:Graphic0.Add(AClock,(NumByeAgitation)/AClock);
*:Graphic1.Add(AClock,(NumByeRecl )/AClock);
*:Terminate (1);
break; ::_ModelTxt /*~mte*/
}
} /*~mee*/ // 18 блоков
internal static void Simulation()
{
S.Start(A.GetStart());
}
internal static void Report()
{
ReportVal(" NumByeRecl = ",NumByeRecl );
ReportVal(" NumByeAgitation = ",NumByeAgitation );
}
internal static void Show()
{ // каждая картинка - в своём масштабе.
A.Graph(Graphic.ToDArray(), "Graphic", Color.Green, Color.AntiqueWhite ,2);
A.Graph(Graphic0.ToDArray(), "Graphic0");
A.Graph(Graphic1.ToDArray(), "Graphic1");
}
/*#AutoIns UnitBase.c*/
}
}