Система Segmental GPSS.
Новости за осень  2013. 
1. В заявку добавлен массив объектов, который может использоваться как аналог сугубо личных P – параметров. Доступ к ним намного быстрее, чем к общедоступным P – параметрам. Это хорошо для использования сегментарной версии GPSS.    public static void OSet(int Num, object value)   public static object OGet(int Num)
2. Каждый элемент множества (группы) теперь может содержать объект. Таким образом, множество может использоваться как набор данных, доступ к которым осуществляется через элементы множества.  Тогда множество , по сути дела, может рассматриваться как таблица базы данных. Здесь элемент Obj, с его внутренними полями,  будет играть роль ключа, а ObjVal - будет аналогом записи этой базы. 
В систему встроены ключи в виде строк, целых данных, или данных типа Double. Фактически, если отвлечься от скорости работы с группой,  строковый  ключ закрывает все проблемы работы с базой данных.  Однако,  для других ключей, лучше самому описать функцию сравнения, по образцу:
   public static int cmpSs(object rr1, object rr)
    {
      int result;
      RecGroup RR1 = (RecGroup)rr1;
      RecGroup RR = (RecGroup)rr;
      if(RR1.Obj== null)
        return -2;
      string OO1 = (string)RR1.Obj;
      string OO = (string)RR.Obj;
      result = RR1.Set.CompareTo(RR.Set); // Начало блока 
      if(result != 0)
        return result; // конец блока
      return OO1.CompareTo(OO);// Так выглядит последний блок проверки.
// здесь, вместо него может быть  вставлен следующий блок проверки
//  значений, или даже несколько блоков. Текст функции остаётся линейным, 
// и без фигурных скобок за счет досрочных return. 
    }

 Здесь, в примере,  доступ ведется по строковому параметру. Такая функция должна указываться в процедуре Init для множества в качестве её последнего параметра. 
 3. В систему встроена стандартная группа  S.BaseGroup,  которая отслеживает текущее множество заявок в системе. Её не нужно описывать, но можно ею пользоваться в информационных целях.
 4.  При вставке новых объектов в модель,  теперь первый объект нумеруется как 1. А каждый следующий – получает номер на 1 больше, чем самый большой текущий номер объекта в модели. Такой подход делает модель зрительно менее громоздкой, чем она была раньше, когда вставленные объекты идентифицировались их именами.
......
.......
5. Раньше каждая функция, блок или свойство системы, требовало префикса S,  в соответствии с текстом модели, так как они описывались в структуре Sys. Сейчас в тексте модели обычно можно опускать этот префикс, если в нижней части модели есть директива  /*#AutoIns UnitBase.c*/.
Пример:  Было
/*=JOEQ*/ static TQueue JOEQ;
/*=JOE*/ static TFacility JOE;
/*=tb*/ static TTable tb;
/*=tab0*/ static TTable tab0;
/*=Tab*/ static TTable Tab;
/*=JOEQ*/ Sys.Init( out JOEQ,"JOEQ");
/*=JOE*/ Sys.Init( out JOE,"JOE");
/*=tb*/ Sys.Init( out tb,"tb",0,1);
/*=tab0*/ Sys.Init( out tab0,"tab0",490,2);
/*=Tab*/ Sys.Init( out Tab,"Tab",400,2,200);
/*=Gen*/ Future.NewWaitProc(NModelTxt,Gen,S.MeanDev(16,6));
/*=Gen0*/ Future.NewWaitProc(NModelTxt,Gen0,0);
Стало.
 static TQueue JOEQ;//~1; 
 static TFacility JOE;//~2; 
 static TTable tb;//~3; 
 static TTable tab0;//~4; 
 static TTable Tab;//~5; 
  Sys.Init( out JOEQ,"JOEQ");//~1; 
  Sys.Init( out JOE,"JOE");//~2; 
  Sys.Init( out tb,"tb",0,1);//~3; 
  Sys.Init( out tab0,"tab0",490,2);//~4; 
  Sys.Init( out Tab,"Tab",400,2,200);//~5; 
 Future.NewWaitProc(NModelTxt,Gen,S.MeanDev(16,6));//~6; 
 Future.NewWaitProc(NModelTxt,Gen0,0);//~7; 
6.  Маленькие хитрости, полезные при отладке. 
 public static void Stop()  блок поручает системе прекратить моделирование как можно скорее.  Оно продолжается по кнопке Stop/Start.  А пока вы не нажали эту кнопку, можно посмотреть стандартный отчет, и решить, была ли ошибка в модели, и в чем именно она состоит.
    public static void SetDistance(int Dis)   блок  или процедура устанавливает предельную дистанцию для продвижения   заявки без задержки.  Если дистанция превышена, то моделирование прекращается. Это позволяет блокировать зацикливание движения заявок в модели.
    public static void MaxTransactionsSet(int newVal)   блок  или процедура устанавливает предельное количество   заявок в списке текущих событий.  Если количество   заявок превышено, то моделирование прекращается. Это позволяет блокировать переполнение списка текущих событий заявками в модели.
7. Протестирована модель, реализующая агентное моделирование на GPSS - Future. 
Так что, система GPSS - Future обеспечивает и агентное моделирование в том числе.
Текст модели.

// Модель 
using System.Drawing;
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*/
  }
}
// Отчёт

 NumObjInTran 32 TranRecords 2048 Num 46  ParamRecords 2048 Num 43/*~mtb*/ /*~mee*/
 Date Time Stamp= 30 ноября 2013 г.  0:46:51
   Hyper Yes - |Name - HyperLink `R 
 ...Agent.rtf
 StartTime 0,00000 EndTime  100000,00000
 PTLst 2176 PLstObj 256 InterrTranLst 256
 CurrentLst 256 SynLst 256

 |Model |Objects |Blocks |Values
 |CurrentList |SynchronizeList |InterruptList ParamTranList 
   Num   Blocks    SegmentNames
   0    18         Segment
 |R `Objects 
      Num    NameObject
    3    |Future
    4    |FutureBye
    5    |FutureEnd
    1    |BaseGroup
 |R `Model 

    internal static void ModelTxt()  
    {  
      switch (S.ActiveBlock)
      {
 /*::Gen*/   1 :Future.NewWait(0,0,2000);//~1;  // В модкль вводим 2000 заявок.
  /*::Ret*/  2 :Future.Wait(Exponential(100)); // задержка на время для возможной покупки.
         3 :Transfer(0.01,Ret,4); // возможна покупка с вероятностью 0.01
         4 :NumByeRecl ++; // покупка по рекламе
 /*::Ret2*/  5 :Assign(1,AClock);// время покупки запомнено в DP(1).
 /*::Ret1*/  6 :FutureBye.Wait(Exponential(100));    // задержка на время для возможной агитации
         7 :Test(BB(AClock<DP(1)+1200,  AClock<DP(1)+16000, true),II(8, Ret1, Ret)); // если прошло менее 1200 ед времени, то агитация возможна,
//  иначе, если прошло менее 16000 ед времени, то покупке забыли, иначе готовы к новой покупке.
         8 :Transfer(0.05, Ret1, 9); // возможна успешная агтация  с вероятностью 0.05
         9 :Future.UnlinkByNum( RR.IUniform(0, Future.L-1), Bye1); // сагитированный клиент идет покупать на Bye1 
         10 :Transfer(Ret1); // новый цикл до возможной агитации.
/*::Bye1*/   11 :NumByeAgitation++;// покупка по агитации
         12 :Transfer(Ret2); // Переход на ветвь после покупки

 /*::Gen0*/  13 :FutureEnd.NewWait(1000);//~3; // счетчик завершения по времени.
         14 :A.ToString(0,"Count= ",Count);
         15 :Graphic.Add(AClock,(NumByeAgitation+NumByeRecl )/AClock);
         16 :Graphic0.Add(AClock,(NumByeAgitation)/AClock);
         17 :Graphic1.Add(AClock,(NumByeRecl )/AClock);
         18 :Terminate (1);

   /*::_ModelTxt*/ /*~mte*/  
      } 
    } /*~mee*/
 |R `Blocks    BLOCK_Reportt 
    NumBlock  Total   Current Location
    1      2000         0 Segment
    2    440722       465 Segment
    3    434096         0 Segment
    4      4312         0 Segment
    5     10473         0 Segment
    6   1568134      1535 Segment
    7   1566599         0 Segment
    8    124887         0 Segment
    9      6161         0 Segment
   10      6161         0 Segment
   11      6161         0 Segment
   12      6161         0 Segment
   13       100         0 Segment
   14       100         0 Segment
   15       100         0 Segment
   16       100         0 Segment
   17       100         0 Segment
   18       100         0 Segment
 |R `Values   NumByeRecl = 4312  NumByeAgitation = 6161
 GroupTran  2176  2002
 |R  GroupTran= `BaseGroup Entries=2101 Current=2001 Average=2001,000 AverTime=95240,362
    Max=2002 Min=0 Active Time=100000,000 NextGo=0
 User/Future  2176  2000
 |R  Future `Future Entries=442722 Current=465 AverUser=434,177
 AverTime=98,070 Max=2000 Min=0  ActiveTime=100000,000 NextGo=0
 
 |R `Future      Report P LIST  Count= 2
          Num/Gr   Object  
         1/0   2000
         2/0   2001
 User/Future  2176  1998
 |R  Future `FutureBye Entries=1568134 Current=1535 AverUser=1564,823
 AverTime=99,789 Max=1998 Min=0  ActiveTime=100000,000 NextGo=0
 User/Future  256  1
 |R  Future `FutureEnd Entries=101 Current=1 AverUser=1,000
 AverTime=990,099 Max=1 Min=0  ActiveTime=100000,000 NextGo=0
 
 |R `FutureEnd      Report P LIST  Count= 2
          Num/Gr   Object  
        13/0   101
        14/0   2101

 End of report


Бесплатный конструктор сайтов - uCoz
Copyright MyCorp © 2018