SMOModel_Program.cs
using System;
namespaceModel_Lab
{
classProgram
{
staticvoid Main(string[] args)
{
//
varsmoModel = newSmoModel(null, "");
try
{
//
smoModel.PERFORM();
}
catch (Exception e)
{
// ,
smoModel.Tracer.TraceOut(e.Message);
}
//
smoModel.Tracer.OutStream.Flush();
}
}
}
SMOModel_Class.cs
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingCommonModel.StatisticsCollecting;
usingCommonModel.RandomStreamProducing;
usingCommonModel.Collections;
usingCommonModel.Kernel;
usingCommonModel.Serialization;
usingSystem.Runtime.Serialization;
namespaceModel_Lab {
[DataContract]
publicpartialclassSmoModel:Model
{
#region
constintstreamAmount = 2; //
constintqueueAmount = 3; //
[DataMember]
double[] Lamd = newdouble[streamAmount]; //
[DataMember]
double[] Mu = newdouble[streamAmount]; //
[DataMember]
int A, B; //
int[] M = newint[queueAmount]; //
[DataMember]
publicconstdouble P = 0.25; // 2
[DataMember]
doubleTP; //
#endregion
#region
bool[] KZ = newbool[streamAmount]; //
int NZS;
// ,
TIntVar [] KVZ; // (3)
TIntVar [] KPZ; // (3)
TRealVar[] TSZK; // (2)
TRealVar[] Tobs; // (2)
TIntVarKZS; // (1 - )
#endregion
#region
//
publicclassZayavka
{
publicdoubleTvh; //
publicintNZ; //
publicintNP; //
}
//
classQRec:QueueRecord
{
publicZayavka Z;
}
//
SimpleModelList<QRec>[] Queue;
#endregion
#region C
Variance<int>[] Variance_KVZ = newVariance<int>[queueAmount];
Variance<int>[] Variance_KPZ = newVariance<int>[queueAmount];
Variance<double>[] Variance_Tobs = newVariance<double>[streamAmount];
|
|
Variance<int>Variance_KZS;
#endregion
#region
UniformStreamUniform_generator; //
ExpStreamFirstStream_ReqTime_ExpGenerator; //
ExpStreamSecondStream_ReqTime_ExpGenerator; //
ExpStreamFirstStream_ServTime_ExpGenerator; //
ExpStreamSecondStream_ServTime_ExpGenerator; //
#endregion
#region
publicSmoModel(Model parent, string name): base(parent, name)
{
Queue = newSimpleModelList<QRec>[queueAmount]; //
KVZ =newTIntVar[queueAmount]; //
KPZ =newTIntVar[queueAmount]; //
TSZK = newTRealVar[streamAmount]; //
Tobs = newTRealVar[streamAmount]; //
KZS =InitModelObject<TIntVar>(" ");//
for (inti = 0; i<streamAmount; i++)
{
TSZK[i] = InitModelObject<TRealVar> (" ");
// KZS[i] = InitModelObject<TIntVar>(" ");
Tobs[i] = InitModelObject<TRealVar> (" ");
// Variance_TSZK[i] = InitModelObject<Variance<double>>(" TSZK " + (i + 1).ToString() + " ");
Variance_Tobs[i] = InitModelObject<Variance<double>>("Tobs " + (i + 1).ToString() + " ");
}
for (inti = 0; i<queueAmount; i++)
{
KVZ[i] = InitModelObject<TIntVar>(" ");
KPZ[i] = InitModelObject<TIntVar>(" ");
Variance_KVZ[i] = InitModelObject<Variance<int>>(" KVZ" + (i + 1).ToString() + " ");
Variance_KPZ[i] = InitModelObject<Variance<int>>(" KPZ" + (i + 1).ToString() + " ");
}
for (inti = 0; i<queueAmount; i++)
Queue[i] = InitModelObject<SimpleModelList<QRec>>(" " + (i + 1).ToString() + " ");;
Variance_KZS = InitModelObject<Variance<int>>(" KZS");
// c#?
Uniform_generator = InitModelObject<UniformStream>(" ' 2- ' ");
FirstStream_ReqTime_ExpGenerator = InitModelObject<ExpStream> (" ' '");
SecondStream_ReqTime_ExpGenerator = InitModelObject<ExpStream> (" ' '");
FirstStream_ServTime_ExpGenerator = InitModelObject<ExpStream> (" ' '");
|
|
SecondStream_ServTime_ExpGenerator = InitModelObject<ExpStream>(" ' '");
for (inti = 0; i<streamAmount; i++)
{
Variance_Tobs[i].ConnectOnSet(Tobs[i]);
}
for (inti = 0; i<queueAmount; i++)
{
Variance_KVZ[i].ConnectOnSet(KVZ[i]);
Variance_KPZ[i].ConnectOnSet(KPZ[i]);
}
Variance_KZS.ConnectOnSet(KZS);
}
#endregion
}
}
SMOModel_Event.cs
using CommonModel.Kernel;
namespace Model_Lab
{
public partial class SmoModel: Model
{
// -
public class Event1_Enter:TimeModelEvent<SmoModel>
{
#region
public Zayavka Z;
#endregion
//
protected override void HandleEvent(ModelEventArgsargs)
{
Model.KVZ[0].Value++; // 1
Model.KZS.Value++; //
Z.Tvh = Model.Time; //
Z.NP = 0;
Model.Tracer.EventTrace(this, Z.NZ); //
//
if(!Model.KZ[0])
{
Model.KZ[0] = true; //
// Event2_Finish
var ev2 = new Event2_Finish(); //
ev2.Z = this.Z; //
//
doubledt = Model.FirstStream_ServTime_ExpGenerator.GenerateValue();
//
Model.PlanEvent(ev2, dt);
//
Model.Tracer.PlanEventTrace(ev2, Z.NZ);
}
//
else
{
//
if (Model.Queue[0].Count.Value<Model.M[0])
{
varQueueRecord = new QRec(); //
QueueRecord.Z = this.Z; //
Model.Queue[0].Add(QueueRecord); //
}
//
else
{
Model.KPZ[0].Value++; //
Model.KZS.Value--; //
}
}
//
Zayavkanew_Z = newZayavka();//
Model.NZS++;
new_Z.NZ = Model.NZS;
var ev1 = new Event1_Enter(); //
ev1.Z = new_Z; //
//
double dt1 = Model.FirstStream_ReqTime_ExpGenerator.GenerateValue();
//
Model.PlanEvent(ev1, dt1);
//
Model.Tracer.PlanEventTrace(ev1, new_Z.NZ);
Model.TraceModel(); //
}
}
// -
public class Event2_Finish:TimeModelEvent<SmoModel>
{
#region
public Zayavka Z;
#endregion
//
protected override void HandleEvent(ModelEventArgsargs)
{
Model.KVZ[1].Value++; // 1
Model.Tracer.EventTrace(this, Z.NZ); //
//
if(!Model.KZ[1])
{
Model.KZ[1] = true; //
// Event2_Finish
var ev3 = new Event3_Finish2(Z); //
|
|
//ev3.Z = this.Z; //
//
double dt = Model.SecondStream_ServTime_ExpGenerator.GenerateValue();
//
Model.PlanEvent(ev3, dt);
//
Model.Tracer.PlanEventTrace(ev3, Z.NZ);
}
//
else
{
//
if (Model.Queue[1].Count.Value<Model.M[1])
{
varQueueRecord = new QRec(); //
QueueRecord.Z = this.Z; //
Model.Queue[1].Add(QueueRecord); //
}
//
else
{
Model.KPZ[1].Value++; //
Model.KZS.Value--; //
}
}
//
if (Model.Queue[0].Count.Value> 0)
{
// 1 (0)
var ev2 = new Event2_Finish(); //
ev2.Z = Model.Queue[0].Pop().Z; //
//
double dt1 = Model.FirstStream_ServTime_ExpGenerator.GenerateValue();
//
Model.TSZK[0].Value += dt1;
Model.Tobs[0].Value = Model.Time - this.Z.Tvh + dt1;
//
Model.PlanEvent(ev2, dt1);
//
Model.Tracer.PlanEventTrace(ev2, ev2.Z.NZ);
}
else
{
// 1
Model.KZ[0] = false;
}
Model.TraceModel(); //
}
}
publicclassEvent3_Finish2:TimeModelEvent<SmoModel>
{
#region
publicZayavka Z;
#endregion
public Event3_Finish2(Zayavka z)
{
this.Z = z;
}
protectedoverridevoidHandleEvent(ModelEventArgsargs)
{
//
#region
if (Z.NP == 1)
{
// ""
#region
doublenew_event = Model.Uniform_generator.GenerateValue();
if (new_event< 0.25)
{
if (Model.Queue[2].Count!= 0)// 3
{
//Model.Tracer.TraceOut("chanel is not free");
//
varev = newEvent3_Finish2(this.Z);
ev.Z = Model.Queue[2].Pop().Z;
// o
doubledt = Model.FirstStream_ServTime_ExpGenerator.GenerateValue();
Model.Tobs[1].Value = Model.Time - this.Z.Tvh+dt;
//
Model.TSZK[1].Value += dt;
//
Model.PlanEvent(ev, dt);
//
Model.Tracer.PlanEventTrace(ev, ev.Z.NZ);
//
var Q = newQRec();
Q.Z = this.Z;
Model.Queue[2].Add(Q);
Model.TraceModel(); //
}
else
{//
//Model.Tracer.TraceOut("chanel is free");
Event3_Finish2ev = newEvent3_Finish2(this.Z);
doubledt = Model.SecondStream_ServTime_ExpGenerator.GenerateValue();
//C
Model.TSZK[1].Value += dt;
//
Model.Tobs[1].Value = Model.Time - this.Z.Tvh + dt;
//
Model.PlanEvent(ev, dt);
|
|
//
Model.Tracer.PlanEventTrace(ev, ev.Z.NZ);
Model.TraceModel(); //
}
}//
#endregion
else
{
Model.KZS.Value--;
//
if (Model.Queue[2].Count!= 0)// 3
{
//
varev = newEvent3_Finish2(this.Z);
ev.Z = Model.Queue[2].Pop().Z;
// o
doubledt = Model.SecondStream_ServTime_ExpGenerator.GenerateValue();
//
Model.TSZK[1].Value += dt;
Model.Tobs[1].Value = Model.Time - this.Z.Tvh + dt;
//
Model.PlanEvent(ev, dt);
//
Model.Tracer.PlanEventTrace(ev, ev.Z.NZ);
Model.TraceModel(); //
}
else
// 2
if (Model.Queue[1].Count!= 0)
{
//
varev = newEvent3_Finish2(this.Z);//, - XD
ev.Z = Model.Queue[1].Pop().Z;
// o
doubledt = Model.SecondStream_ServTime_ExpGenerator.GenerateValue();
//
Model.TSZK[1].Value += dt;
Model.Tobs[1].Value = Model.Time - this.Z.Tvh + dt;
//
Model.PlanEvent(ev, dt);
//
Model.Tracer.PlanEventTrace(ev, ev.Z.NZ);
Model.TraceModel(); //
}
else//
Model.KZ[1] = false;
}
}
#endregion
// " "
else
{
Model.KZS.Value--;
if (Model.Queue[2].Count!= 0)// 3
{
//
varev = newEvent3_Finish2(this.Z);
ev.Z = Model.Queue[2].Pop().Z;
// o
doubledt = Model.FirstStream_ServTime_ExpGenerator.GenerateValue();
//
Model.TSZK[1].Value += dt;
//
Model.PlanEvent(ev, dt);
//
Model.Tracer.PlanEventTrace(ev, ev.Z.NZ);
Model.TraceModel(); //
}
else
// 2
if (Model.Queue[1].Count!= 0)
{
//
varev = newEvent3_Finish2(this.Z);//, - XD
ev.Z = Model.Queue[1].Pop().Z;
// o
doubledt = Model.FirstStream_ServTime_ExpGenerator.GenerateValue();
//
Model.TSZK[1].Value += dt;
//
Model.PlanEvent(ev, dt);
//
Model.Tracer.PlanEventTrace(ev, ev.Z.NZ);
Model.TraceModel(); //
}
else//
Model.KZ[1] = false;
}
}
}
public class Event4_EnterTo2:TimeModelEvent<SmoModel>
{
// -
#region
publicZayavkaZ;
#endregion
public Event4_EnterTo2(Zayavka z)
{
this.Z = z;
}
//
protected override void HandleEvent(ModelEventArgsargs)
{
Model.KVZ[2].Value++; // 1
Model.KZS.Value++; //
Z.Tvh = Model.Time; //
Z.NP = 1;
Model.Tracer.EventTrace(this, Z.NZ); //
if(!Model.KZ[1])
{
Model.KZ[1] = true; //
// Event2_Finish
varev4 = newEvent3_Finish2(Z); // ,
//
double dt = Model.SecondStream_ServTime_ExpGenerator.GenerateValue();
//
Model.PlanEvent(ev4, dt);
//
Model.Tracer.PlanEventTrace(ev4, Z.NZ);
}//end
//
else
{
// 3-
|
|
if (Model.Queue[2].Count<Model.M[2])
{
varQueueRecord = new QRec(); //
QueueRecord.Z = this.Z; //
Model.Queue[2].Add(QueueRecord); //
}
// ,
else
{
Model.KPZ[2].Value++; //
Model.KZS.Value--; //
}
}//end
//
Zayavkanew_Z = newZayavka();//
Model.NZS++;
//new_Z.NZ = Model.KVZ[2]; //
new_Z.NZ = Model.NZS;
varev3 = newEvent4_EnterTo2(new_Z); // ,
//
double dt1 = Model.SecondStream_ReqTime_ExpGenerator.GenerateValue();
//
Model.PlanEvent(ev3, dt1);
//
Model.Tracer.PlanEventTrace(ev3, new_Z.NZ);
Model.TraceModel(); //
}
}
}
}
SMOModel_Experiment.cs
usingCommonModel.Kernel;
usingCommonModel.RandomStreamProducing;
namespaceModel_Lab
{
publicpartialclassSmoModel:Model
{
// True - . false. </summary>
publicoverrideboolMustStopRun(intvariantCount, intrunCount)
{
return (Time>= TP);
}
//
publicoverrideboolMustPerformNextVariant(intvariantCount)
{
//
returnvariantCount< 1;
}
//
publicoverridevoidSetNextVariant(intvariantCount)
{
#region
Lamd[0] = (double)1 / (double)300; // 1 / 300
Lamd[1] = (double)1 / (double)480; // 1 / 480
Mu[0] = (double)1 / (double)240; // 1 / 240
Mu[1] = (double)1 / (double)150; // 1 / 150
M[0] = 3;
M[1] = 4;
M[2] = 5;
A = 0;
B = 1;
TP = 14400000;// 4 14400000;
NZS = 0;
//: 100000
#endregion
#region
(Uniform_generator.BPNasGeneratedBaseRandomStream).Seed = 17981;
(FirstStream_ReqTime_ExpGenerator.BPNasGeneratedBaseRandomStream).Seed = 17981;
(SecondStream_ReqTime_ExpGenerator.BPNasGeneratedBaseRandomStream).Seed = 17981;
(FirstStream_ServTime_ExpGenerator.BPNasGeneratedBaseRandomStream).Seed = 17981;
(SecondStream_ServTime_ExpGenerator.BPNasGeneratedBaseRandomStream).Seed = 17981;
Uniform_generator.A = A;
Uniform_generator.B = B;
FirstStream_ReqTime_ExpGenerator.Lyambda = Lamd[0];
SecondStream_ReqTime_ExpGenerator.Lyambda = Lamd[1];
FirstStream_ServTime_ExpGenerator.Lyambda = Mu[0];
SecondStream_ServTime_ExpGenerator.Lyambda = Mu[1];
#endregion
}
publicoverridevoidStartModelling(intvariantCount, intrunCount)
{
#region
KZS.Value = 0;
for (inti = 0; i<streamAmount; i++)
{
TSZK[i].Value = 0.0;
Tobs[i].Value = 0.0;
KZ[i] = false;
}
for (inti = 0; i<queueAmount; i++)
{
KVZ[i].Value = 0;
KPZ[i].Value = 0;
Queue[i].Clear();
}
#endregion
#region C
Variance_KZS.ResetCollector();
for (inti = 0; i<streamAmount; i++)
{
Variance_Tobs[i].ResetCollector();
}
for (inti = 0; i<queueAmount; i++)
{
Variance_KVZ[i].ResetCollector();
Variance_KPZ[i].ResetCollector();
}
#endregion
//
TraceModelHeader();
#region
//Forfirst
Zayavka Z1 = newZayavka();
Z1.NZ = NZS;
NZS++;
varstart_event = newEvent1_Enter();
start_event.Z = Z1;
doubledt = FirstStream_ReqTime_ExpGenerator.GenerateValue();
PlanEvent(start_event, dt);
Tracer.PlanEventTrace(start_event, Z1.NZ);
//For second
Zayavka Z4 = newZayavka();
Z4.NZ = NZS;
NZS++;
var start_event4 = newEvent4_EnterTo2(Z4);
dt = SecondStream_ReqTime_ExpGenerator.GenerateValue();
PlanEvent(start_event4, dt);
Tracer.PlanEventTrace(start_event4, Z1.NZ);
TraceModel(); //
Tracer.TraceOut("");
#endregion
}
//
publicoverridevoidFinishModelling(intvariantCount, intrunCount)
{
Tracer.TraceOut("==============================================================");
Tracer.TraceOut("============ ===========");
Tracer.TraceOut("==============================================================");
Tracer.TraceOut("\n\t\t\t #" + variantCount + " #" + runCount);
Tracer.TraceOut(" : " + Time);
Tracer.TraceOut(" : " + ((double)KVZ[0].Value / (double)Time));
Tracer.TraceOut(" : " + ((double)KVZ[1].Value / (double)Time));
Tracer.TraceOut(" 1: " + ((double)KPZ[0].Value / (double)KVZ[0].Value));
Tracer.TraceOut(" 2: " + ((double)KPZ[1].Value / (double)KVZ[1].Value));
Tracer.TraceOut(" 3: " + ((double)KPZ[2].Value / (double)KVZ[2].Value));
Tracer.TraceOut(" :" + ((double)TSZK[0].Value / (double)Time));
Tracer.TraceOut(" :" + ((double)TSZK[1].Value / (double)Time));
Tracer.TraceOut(" : " + Variance_Tobs[0].Mx);
Tracer.TraceOut(" : " + Variance_Tobs[1].Mx);
Tracer.TraceOut(" : " + Variance_KZS.Mx);
}
//
voidTraceModelHeader()
{
Tracer.TraceOut(" ");
//
Tracer.TraceOut(" : ");
Tracer.TraceOut("Lamd[1] = " + Lamd[0]);
Tracer.TraceOut("Lamd[2] = " + Lamd[1]);
Tracer.TraceOut(" : ");
Tracer.TraceOut("Mu[1] = " + Mu[0]);
Tracer.TraceOut("Mu[2] = " + Mu[1]);
Tracer.TraceOut(" : ");
Tracer.TraceOut("M[1] = " + M[0]);
Tracer.TraceOut("M[2] = " + M[1]);
Tracer.TraceOut("M[3] = " + M[2]);
Tracer.TraceOut("________________________________________________________________________________");
//
Tracer.AnyTrace("KZ[0]", "KZ[1]", "Queue[0]", "Queue[1]", "Queue[2]", "KVZ[0]", "KVZ[1]", "KVZ[2]", "KPZ[0]", "KPZ[1]", "KPZ[2]", "TSZK[0]", "TSZK[1]");
Tracer.TraceOut("");
//Tracer.AnyTrace("KZ[0]", "KZ[1]", "KVZ[0]", "KVZ[1]", "KVZ[2]", "KPZ[0]", "KPZ[1]", "KPZ[2]", "Queue[0]", "Queue[1]", "Queue[2]", "TSZK[0]", "TSZK[1]");
}
//
voidTraceModel()
{
Tracer.AnyTrace(KZ[0], KZ[1], Queue[0].Count.Value, Queue[1].Count.Value, Queue[2].Count.Value, KVZ[0].Value, KVZ[1].Value, KVZ[2].Value, KPZ[0].Value, KPZ[1].Value, KPZ[2].Value, TSZK[0].Value, TSZK[1].Value);
//Tracer.AnyTrace(KZ[0],KZ[1], KVZ[0].Value, KVZ[1].Value, KVZ[2].Value, KPZ[0].Value, KPZ[1].Value, KPZ[2].Value, Queue[0].Count.Value, Queue[1].Count.Value, Queue[2].Count.Value,TSZK[0].Value,TSZK[1].Value);
}
}
}