原创--C#实例编程2
模拟超市购物
一、需求描述
超市客流符合泊松分布,有一个收银台,有三个购物通道,来人随机进入三个通道,在一
通道的购物数为2-5,停留时间60-180;在二通道的购物数为3-6,停留时间120-180;在三通道的
购物数为4-6,停留时间75-165;收银台的处理时间为每件物品为3s.输出结果:最大篮子数,
最长等待队列。
二、使用的知识要点
1.随机数
2.多线程
三、算法思想
自定义mydata类,mydata类中主要有两个数组,一个作为存储通道中的人Buyers,一个队列中的人myQ。整个程序有三个线程并发进行,第一个线程StartThread产生来人,向Buyers中插入数据,增加篮子数;第二个线程每隔10毫秒扫描Buyers数据,使其待待时间减10ms,如果为0则删除同时插入myQ数组,增加等待队列数;第三个线程每次取出队列中的第一个人,减少篮子数,减少等待队列数。如果队列中有人则增加收银员工作时间,反之则增加收银员的空闲时间。
四、主程序界面
五、主要程序段
客流符合泊松分布,则来人间隔时间符合负指数分布log(u)/lamla,u则符合均匀分布。
首先定义一个随机数
public Random myrond = new Random();//随机数
则
u=this.myrond.NextDouble();//0-1之间均匀分布的随机数
来人时间间隔为v
v=-1*this.averagetime*Math.Log(u);//产生来人时间间隔 产生负指数分布时间
自定mydata类
class myarrclass{...
}
自定义结构Buyer{
public int WayFlag;//通道
public int WaitTime;//等待时间
public int CountGoods;//购物数
}
六、全部程序代码
mlgw类
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;
namespace 经济管理模型
{
/// <summary>
/// mlgw 的摘要说明。
/// </summary>
public class mlgw : System.Windows.Forms.Form
{
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox textBox5;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.ListBox listBox2;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox textBox6;
private System.Windows.Forms.Button button3;
/*==================================*/
//自动义变量和类
public Random myrond = new Random();//随机数
public static MyArrClass mydata;//数据类
//
public int Count_Baskets = 0;//篮子数
public int Count_MaxBaskets=0;//最大篮子数
public int Count_Queue = 0;//队列长度
public bool flag=true;//是否运行
public Thread StartThread,MiddleThread,EndThread;//三个线程
public int multiple=100;
private double averagetime;//平均来人时间
private double worktime=0;//工作时间
private double sparetime=0;//空闲时间
//End自动义变量和类
/*==================================*/
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public mlgw()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(mlgw));
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.button3 = new System.Windows.Forms.Button();
this.textBox6 = new System.Windows.Forms.TextBox();
this.label6 = new System.Windows.Forms.Label();
this.textBox5 = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.textBox3 = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.textBox2 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.listBox2 = new System.Windows.Forms.ListBox();
this.listBox1 = new System.Windows.Forms.ListBox();
this.panel1 = new System.Windows.Forms.Panel();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.SuspendLayout();
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Location = new System.Drawing.Point(-8, 0);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(576, 416);
this.tabControl1.TabIndex = 0;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.groupBox2);
this.tabPage1.Controls.Add(this.groupBox1);
this.tabPage1.Controls.Add(this.pictureBox1);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Size = new System.Drawing.Size(568, 390);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "模拟";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.button3);
this.groupBox2.Controls.Add(this.textBox6);
this.groupBox2.Controls.Add(this.label6);
this.groupBox2.Controls.Add(this.textBox5);
this.groupBox2.Controls.Add(this.label5);
this.groupBox2.Controls.Add(this.button2);
this.groupBox2.Controls.Add(this.button1);
this.groupBox2.Location = new System.Drawing.Point(304, 248);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(248, 136);
this.groupBox2.TabIndex = 8;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "参数";
//
// button3
//
this.button3.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button3.Location = new System.Drawing.Point(152, 48);
this.button3.Name = "button3";
this.button3.TabIndex = 8;
this.button3.Text = "改变";
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// textBox6
//
this.textBox6.BackColor = System.Drawing.SystemColors.Info;
this.textBox6.Location = new System.Drawing.Point(128, 80);
this.textBox6.Name = "textBox6";
this.textBox6.TabIndex = 7;
this.textBox6.Text = "1000";
//
// label6
//
this.label6.Location = new System.Drawing.Point(16, 80);
this.label6.Name = "label6";
this.label6.TabIndex = 6;
this.label6.Text = "最大容纳人数:";
//
// textBox5
//
this.textBox5.BackColor = System.Drawing.SystemColors.Info;
this.textBox5.Location = new System.Drawing.Point(128, 24);
this.textBox5.Name = "textBox5";
this.textBox5.TabIndex = 5;
this.textBox5.Text = "75";
//
// label5
//
this.label5.Location = new System.Drawing.Point(16, 24);
this.label5.Name = "label5";
this.label5.TabIndex = 4;
this.label5.Text = "平均来人时间:";
//
// button2
//
this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button2.Location = new System.Drawing.Point(104, 104);
this.button2.Name = "button2";
this.button2.TabIndex = 3;
this.button2.Text = "停止";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button1
//
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button1.Location = new System.Drawing.Point(24, 104);
this.button1.Name = "button1";
this.button1.TabIndex = 2;
this.button1.Text = "确定";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.textBox3);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.textBox2);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.textBox1);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Location = new System.Drawing.Point(16, 248);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(240, 136);
this.groupBox1.TabIndex = 7;
this.groupBox1.TabStop = false;
this.groupBox1.Text = " 统计信息";
//
// textBox3
//
this.textBox3.BackColor = System.Drawing.SystemColors.Info;
this.textBox3.Location = new System.Drawing.Point(126, 88);
this.textBox3.Name = "textBox3";
this.textBox3.TabIndex = 12;
this.textBox3.Text = "";
//
// label3
//
this.label3.Location = new System.Drawing.Point(14, 88);
this.label3.Name = "label3";
this.label3.TabIndex = 11;
this.label3.Text = "工作效率:";
//
// textBox2
//
this.textBox2.BackColor = System.Drawing.SystemColors.Info;
this.textBox2.Location = new System.Drawing.Point(126, 56);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 10;
this.textBox2.Text = "";
//
// label2
//
this.label2.Location = new System.Drawing.Point(14, 56);
this.label2.Name = "label2";
this.label2.TabIndex = 9;
this.label2.Text = "最长等待队列:";
//
// textBox1
//
this.textBox1.BackColor = System.Drawing.SystemColors.Info;
this.textBox1.Location = new System.Drawing.Point(126, 24);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 8;
this.textBox1.Text = "";
//
// label1
//
this.label1.Location = new System.Drawing.Point(14, 24);
this.label1.Name = "label1";
this.label1.TabIndex = 7;
this.label1.Text = "最大篮子数:";
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(8, 8);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(552, 224);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// tabPage2
//
this.tabPage2.Controls.Add(this.listBox2);
this.tabPage2.Controls.Add(this.listBox1);
this.tabPage2.Controls.Add(this.panel1);
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Size = new System.Drawing.Size(568, 390);
this.tabPage2.TabIndex = 1;
//
// listBox2
//
this.listBox2.Location = new System.Drawing.Point(144, 224);
this.listBox2.Name = "listBox2";
this.listBox2.Size = new System.Drawing.Size(120, 160);
this.listBox2.TabIndex = 2;
//
// listBox1
//
this.listBox1.Location = new System.Drawing.Point(16, 224);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(120, 160);
this.listBox1.TabIndex = 1;
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.Honeydew;
this.panel1.Location = new System.Drawing.Point(8, 8);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(552, 208);
this.panel1.TabIndex = 0;
//
// mlgw
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(560, 413);
this.Controls.Add(this.tabControl1);
this.Name = "mlgw";
this.Text = "购物模拟";
this.Closing += new System.ComponentModel.CancelEventHandler(this.mlgw_Closing);
this.Load += new System.EventHandler(this.mlgw_Load);
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
public void HandleStartThread()
{
double u,v;
int vv,WayFlag;
while(flag==true)
{
//u=Drand();
u=this.myrond.NextDouble();//0-1之间均匀分布的随机数
v=-1*this.averagetime*Math.Log(u);//产生来人时间间隔 产生负指数分布时间
vv=(int)(v);
WayFlag = this.myrond.Next(1,4);//选择的通道
switch(WayFlag)
{
case 1:
mydata.Add(1,this.myrond.Next(60,181),this.myrond.Next(2,6));//增加buyers
break;
case 2:
mydata.Add(2,this.myrond.Next(120,180),this.myrond.Next(3,7));
break;
case 3:
mydata.Add(3,this.myrond.Next(75,165),this.myrond.Next(4,7));
break;
default:
break;
}
//
this.Count_Baskets+=1;
if (this.Count_Baskets>this.Count_MaxBaskets)
this.Count_MaxBaskets = this.Count_Baskets;
this.textBox1.Text = this.Count_MaxBaskets.ToString();
Thread.Sleep(vv);
}
}
public double Drand()//优化随机数
{
double x;
int i;
for(i=0;i<20;i++) this.myrond.Next();
x = this.myrond.Next();
x=65539*x+1743251541;
x=Math.IEEERemainder(x,2147483638);
return(x/2147483638);
}
private void button1_Click(object sender, System.EventArgs e)
{
this.averagetime = Convert.ToDouble(this.textBox5.Text)*100;
mydata = new MyArrClass(Convert.ToInt16(this.textBox6.Text));
StartThread = new Thread(new ThreadStart(HandleStartThread));
StartThread.Name="StartThread";
MiddleThread = new Thread(new ThreadStart(HandleMiddleThread));
MiddleThread.Name="MiddleThread";
EndThread = new Thread(new ThreadStart(HandleEndThread));
EndThread.Name="EndThread";
this.flag = true;
StartThread.Start();
MiddleThread.Start();
EndThread.Start();
}
private void button2_Click(object sender, System.EventArgs e)
{
this.flag = false;
if(this.StartThread!=null)
{
this.StartThread.Abort();
this.MiddleThread.Abort();
this.EndThread.Abort();
}
this.textBox3.Text = Convert.ToString(this.worktime/(this.worktime+this.sparetime));
//this.StartThread.Suspend();
}
private void HandleMiddleThread()//中间线程(第二个线程)
{
while(flag == true)
{
mydata.DelOne();
//this.listBox1.Items.Add(this.Count_Baskets);
this.listBox2.Items.Add(mydata.myQ_Count());
this.textBox2.Text = mydata.MaxQueueLen.ToString();
Thread.Sleep(10);
}
}
private void HandleEndThread()//第三个线程
{
while(flag == true)
{
int temptime;//收银台处理时间
if(mydata.myQ_Del()>0)//myQ_Del出队列,删除第一个人
{
Monitor.Enter(this.Count_Baskets);
this.Count_Baskets--;
Monitor.Exit(this.Count_Baskets);
}
if((temptime = mydata.myQ_First())>0)//获得当前队列第一个人的处理时间
this.worktime+=temptime;
else
this.sparetime+=0.01;
Thread.Sleep(temptime);
}
}
private void mlgw_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{//程序关闭事件
if(this.StartThread != null) this.StartThread.Abort();
if(this.MiddleThread != null) this.MiddleThread.Abort();
if(this.EndThread != null) this.EndThread.Abort();
this.Dispose();
}
private void mlgw_Load(object sender, System.EventArgs e)
{
}
private void button3_Click(object sender, System.EventArgs e)
{
this.averagetime = Convert.ToDouble(this.textBox5.Text)*100;
}
}
}
MyArrClass类