java多线程模拟M/M/C(马科洛夫队列)

本文介绍了使用Java模拟M/M/C马科洛夫队列的多服务器排队模型,通过指数分布和正态分布随机数生成算法,模拟客户到达间隔和服务时间。在指定服务窗口数、最大客户数、到达率λ、服务率μ和标准差σ后,程序计算实际的参数值及平均队列长度、平均等待时间和平均停留时间。
摘要由CSDN通过智能技术生成

M/M/C(马科洛夫队列)是一个多服务器的排队模型,每个客户到来的时候选择等待队列最短的服务窗口排队等待服务,在商场,银行等服务行业应用广泛,模型如下:


使用服从指数分布的随机数(平均值为lamda)模拟每个客户到达间隔时间,使用服从正态分布的随机数(平均数为mu,标准差为sigma)模拟每个客户在服务窗口接受服务时间,给定服务窗口数,最大客户数,以及lamda,mu和sigma之后,程序进行模拟运算之后可以给出实际计算的lamda,mu和sigma,已经平均队列长度,平均等待时间,平均停留时间等等。程序代码如下:

首先,产生服从指数分布和正太分布伪随机数的算法如下(从网上找到的代码):

import java.util.Random;

/**
 * Generate the specify type random number
 */
public class RandomGenerator {

	/**
	 * Generate normal distribute random number
	 * @param average Expect average
	 * @param sigma Standard devation
	 * @return Normal distribute random number
	 */
	public static double generateNormalDistrRand(double average,
			double sigma) {
		double N = 12;
		double x = 0, temp = N;
		do {
			x = 0;
			for (int i = 0; i < N; i++)
				x = x + (Math.random());
			x = (x - temp / 2) / (Math.sqrt(temp / 12));
			x = average + x * Math.sqrt(sigma);
		} while (x <= 0);
		return x;
	}
	
	/**
	 * Generate negative index distribute random number
	 * @param lamda Expect average 
	 * @return Negative index distribute random number
	 */
	public static double generateNegativeIndexDistrRand(double lamda) {
		Random random = new Random();
		return -Math.log(random.nextDouble()) / lamda;
	}
}
客户模型:

public class Customer {
	private double arrivalTime = 0.0;//客户到达时刻
	private double serviceTime = 0.0;//客户接受服务的时间
	private double departureTime = 0.0;//客户离开时刻=客户到达时刻+客户等待时间+客户接受服务时间
	private int queueLen;

	public double getDepartureTime() {
		return departureTime;
	}

	public void setDepartureTime(double departureTime) {
		this.departureTime = departureTime;
	}

	public double getArrivalTime() {
		return arrivalTime;
	}

	public void setArrivalTime(double arrivalTime) {
		this.arrivalTime = arrivalTime;
	}

	public double getServiceTime() {
		return serviceTime;
	}

	public void setServiceTime(double serviceTime) {
		this.serviceTime = serviceTime;
	}

	@Override
	public String toString() {//客户停留时间=客户离开时刻-客户到达时刻,客户等待时间=客户离开时刻-客户到达时刻-客户接受服务时间
		return "Customer stay time = " + (departureTime - arrivalTime)
				+ ", and wait time = "
				+ (departureTime - arrivalTime - serviceTime);
	}

	public void setQueueLen(int size) {
		this.queueLen = size;

	}

	public int getQueueLen() {
		return this.queueLen;
	}
}
使用多线程模拟服务窗口:

public class Server implements Runnable {
	private int serverId;
	private volatile boolean isAlive = true;
	private Deque<Customer> customerQueue = new LinkedBlockingDeque<Customer>();//每个服务窗口都有一个客户等待队列

	private int custoemrServed = 0;
	private
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值