JAVAの行列論実現

13947 ワード

転載は出典を明記してください.http://blog.csdn.net/xiaojimanman/article/details/50401727
http://www.llwjy.com/blogdetail/3c3f556d2e98284111139e5690f078a1.html
個人のブログサイトはすでにオープンしました.ウェブサイトwww.llwjy.com~皆さんのツッコミを歓迎します.
-------------------------------------------------------
      前の時間に銀行に行って業務をしていますが、並んでいる人が本当に多くて、自分で正式に業務を行うのも5分足らずです.しかし、たっぷり二時間待ちました.(多くの人がこのような状況に遭遇したと信じています.)このサービスのレベルについては本当に言葉がないです.また資源の利用率を保証できますか?次に私たちは行列論を通してこの問題をシミュレーションします.
行列論の概要
      行列論はシステムのランダム集散現象とランダムシステムの作業工程を研究する数学理論と方法であり、またランダムサービスシステム理論とも呼ばれ、オペレーティングシステムの分岐である.私達は次に並ぶことについて簡単に処理します.まず次の図を見ます.
JAVA实现排队论_第1张图片
      私達は図の左側にいくつかの青いフロントを配置して、右側は来るかもしれない赤色の顧客のために、中間は黄色の待合エリアで、もしフロントが空き状態にあるならば、お客様は直接にサービスを受けることができます.さもなければ、黄色のエリアで待つべきです.お客様のサービスの順番は先着サービスの原則を採用して、今お客様が来る確率分布を知っています.左側にいくつかのサービスカウンターを手配すれば、より良いサービスレベルに達することができます.また、サービスカウンターの利用率を保証できますか?この問題をシミュレートするためにモデルを構築します.
行列は段階的に実現されます.
1)行列論について、まず顧客の属性を確認し、顧客がいつ到着するか、必要なサービスの時間がかかるかなどを知っています.まずお客様の種類を作成します.ここでお客様のサービスの最大、最小時間を指定しました.ここでは簡略化のために直接サービス時間をランダムに認識します.
public class CustomerBean {
	//      
	private static int minServeTime = 3 * 1000;
	//      
	private static int maxServeTime = 15 * 1000;
	//      
	private long arriveTime;
	//        
	private int serveTime;
	
	public CustomerBean() {
		//      
		arriveTime = System.currentTimeMillis();
		//           
		serveTime = (int) (Math.random() * (maxServeTime - minServeTime) + minServeTime);
	}
}
2)上でお客様を定義しました.すぐ必要です.
行列を定義します.まず列の属性を見ます.ここでは行列を定義して、それを使って列に並ぶお客さんを保存します.次のお客さんが来る最小時間と最大時間の間隔とお客さんが来ない確率を定義します.(ここで簡単に説明すると、次の顧客の間隔時間は3であるが、確率計算によって満足されると、この顧客は列に入らない.このように設定された理由は、できるだけお客様をランダムにしているからである.)と列の中で最大の列の人数.
public class CustomerQuene {
	//      
	private LinkedList customers = new LinkedList();
	//           
	private int minTime = 0;
	//           
	private int maxTime = 1 * 1000;
	//      
	private double rate = 0.9;
	//          
	private boolean flag = true;
	//      
	private int maxWaitNum = 0;
}
3)お客様と並んでいる列があります.
お客様のスレッドを作って、お客様をどんどん発生させます.ここには上記の時間と確率の分布があります.
/**
 *@Description:        
 *@Author:lulei  
 *@Version:1.1.0
 */
private class CustomerThread extends Thread {
	private CustomerThread(String name) {
		super(name);
	}

	@Override
	public void run() {
		while (flag) {
			//         
			if (Math.random() < rate) {
				customers.addLast(new CustomerBean());
				if (maxWaitNum < customers.size()) {
					maxWaitNum = customers.size();
				}
			}
			int sleepTime = (int) (Math.random() * (maxTime - minTime) + minTime);
			try {
				TimeUnit.MILLISECONDS.sleep(sleepTime);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
4)列の中にお客さんが並んでいる場合、空いているフロントを切ると、先頭を取るお客さんがサービスを受ける必要があります.
public synchronized CustomerBean getCustomerBean() {
	if (customers == null || customers.size() < 1) {
		return null;
	}
	return customers.removeFirst();
}
5)お客様に関する属性と方法はすでに用意されています.以下はサービスカウンターに関する属性を設定します.ここで直接に
フロントはスレッドを設置し、サービスの顧客数、総待ち時間、総サービス時間、最大待ち時間などのサービス指標を定義する.
public class ServantThread extends Thread{
	//      
	private static int customerNum = 0;
	//     
	private static int sumWaitTime = 0;
	//     
	private static int sumServeTime = 0;
	//      
	private static int maxWaitTime = 0;
	private boolean flag = false;
	private String name;
}
6)フロントの一番の仕事は?
サービスのお客様、ここではサービスのお客様に関する操作をスレッドのrun方法に書いています.
public void run() {
	flag = true;
	while (flag) {
		CustomerBean customer = CustomerQuene.getCustomerQuene().getCustomerBean();
		//                  ,         
		if (customer == null) {
			if (!CustomerQuene.getCustomerQuene().isFlag()) {
				flag = false;
				print();
			}
			continue;
		}
		long now = System.currentTimeMillis();
		int waitTime = (int) (now - customer.getArriveTime());
		//         
		if (waitTime > maxWaitTime) {
			maxWaitTime = waitTime;
		}
		//            ,           
		try {
			TimeUnit.MILLISECONDS.sleep(customer.getServeTime());
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.err.println(name + "       :" + customer.getServeTime() + "ms\t    :" + waitTime + "ms");
		customerNum++;
		sumWaitTime += waitTime;
		sumServeTime += customer.getServeTime();
		
	}
}
7)最後に私たちは
テストモデルを作成して、サービスレベルを検証します.
 /**  
 *@Description:     
 */ 
package com.lulei.opsearch.quene;  

import java.util.concurrent.TimeUnit;
  
public class Test {

	public static void main(String[] args) {
		//  
		System.out.println("     !");
		boolean flag = true;
		CustomerQuene.getCustomerQuene();
		long a = System.currentTimeMillis();
		int servantNum = 10;
		for (int i = 0; i < servantNum; i++) {
			ServantThread thread = new ServantThread("   " + i);
			thread.start();
		}
		while (flag) {
			long b = System.currentTimeMillis();
			if (b - a > 1 * 60 * 1000 && flag) {
				//  
				flag = false;
				CustomerQuene.getCustomerQuene().close();
				System.out.println("      !");
			}
			System.out.println("      :" + (b -a) + "ms");
			System.out.println("      :" + ((b -a) * servantNum - ServantThread.getSumServeTime()));
			ServantThread.print();
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}
実行結果
1)運転開始
JAVA实现排队论_第2张图片
2)お客様がスレッドを生成してクローズします.
JAVA实现排队论_第3张图片
3)最終サービスレベル
JAVA实现排队论_第4张图片
      サービスカウンターの個数を修正することで、現在の顧客状況でいくつかのサービスカウンターを設置するべきだと評価できます.
完全コード
1)顧客類
 /**  
 *@Description:     
 */ 
package com.lulei.opsearch.quene;  
  
public class CustomerBean {
	//      
	private static int minServeTime = 3 * 1000;
	//      
	private static int maxServeTime = 15 * 1000;
	//      
	private long arriveTime;
	//        
	private int serveTime;
	
	public CustomerBean() {
		//      
		arriveTime = System.currentTimeMillis();
		//           
		serveTime = (int) (Math.random() * (maxServeTime - minServeTime) + minServeTime);
	}

	public static int getMinServeTime() {
		return minServeTime;
	}

	public static void setMinServeTime(int minServeTime) {
		CustomerBean.minServeTime = minServeTime;
	}

	public static int getMaxServeTime() {
		return maxServeTime;
	}

	public static void setMaxServeTime(int maxServeTime) {
		CustomerBean.maxServeTime = maxServeTime;
	}

	public long getArriveTime() {
		return arriveTime;
	}

	public void setArriveTime(long arriveTime) {
		this.arriveTime = arriveTime;
	}

	public int getServeTime() {
		return serveTime;
	}

	public void setServeTime(int serveTime) {
		this.serveTime = serveTime;
	}
}
2)顧客行列
 /**  
 *@Description:     
 */ 
package com.lulei.opsearch.quene;  

import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
  
public class CustomerQuene {
	//      
	private LinkedList customers = new LinkedList();
	//           
	private int minTime = 0;
	//           
	private int maxTime = 1 * 1000;
	//      
	private double rate = 0.9;
	//          
	private boolean flag = true;
	//      
	private int maxWaitNum = 0;
	
	public int getMaxWaitNum() {
		return maxWaitNum;
	}
	
	public boolean isFlag() {
		return flag;
	}

	/**
	 * @return
	 * @Author:lulei  
	 * @Description:          
	 */
	public synchronized CustomerBean getCustomerBean() {
		if (customers == null || customers.size() < 1) {
			return null;
		}
		return customers.removeFirst();
	}
	
	public void close() {
		if (flag) {
			flag = false;
		}
	}
	
	/**
	 * @return
	 * @Author:lulei  
	 * @Description:         
	 */
	public int getWaitCustomerNum() {
		return customers.size();
	}
	
	/**
	 *@Description:        
	 *@Author:lulei  
	 *@Version:1.1.0
	 */
	private class CustomerThread extends Thread {
		private CustomerThread(String name) {
			super(name);
		}

		@Override
		public void run() {
			while (flag) {
				//         
				if (Math.random() < rate) {
					customers.addLast(new CustomerBean());
					if (maxWaitNum < customers.size()) {
						maxWaitNum = customers.size();
					}
				}
				int sleepTime = (int) (Math.random() * (maxTime - minTime) + minTime);
				try {
					TimeUnit.MILLISECONDS.sleep(sleepTime);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	//      
	private static class CustomerQueneDao {
		private static CustomerQuene customerQuene = new CustomerQuene();
	}
	private CustomerQuene() {
		CustomerThread customerThread = new CustomerThread("      ");
		customerThread.start();
	}
	public static CustomerQuene getCustomerQuene() {
		return CustomerQueneDao.customerQuene;
	}
	//      
	
	public int getMinTime() {
		return minTime;
	}
	
	public void setMinTime(int minTime) {
		this.minTime = minTime;
	}
	
	public int getMaxTime() {
		return maxTime;
	}
	
	public void setMaxTime(int maxTime) {
		this.maxTime = maxTime;
	}

	public double getRate() {
		return rate;
	}

	public void setRate(double rate) {
		this.rate = rate;
	}
}
3)フロントスレッド
 /**  
 *@Description:     
 */ 
package com.lulei.opsearch.quene;  

import java.util.concurrent.TimeUnit;

import com.lulei.util.ParseUtil;
  
public class ServantThread extends Thread{
	//      
	private static int customerNum = 0;
	//     
	private static int sumWaitTime = 0;
	//     
	private static int sumServeTime = 0;
	//      
	private static int maxWaitTime = 0;
	private boolean flag = false;
	private String name;
	
	public ServantThread(String name) {
		super(name);
		this.name = name;
	}
	
	public static int getMaxWaitTime() {
		return maxWaitTime;
	}

	public static int getSumServeTime() {
		return sumServeTime;
	}

	@Override
	public void run() {
		flag = true;
		while (flag) {
			CustomerBean customer = CustomerQuene.getCustomerQuene().getCustomerBean();
			//                  ,         
			if (customer == null) {
				if (!CustomerQuene.getCustomerQuene().isFlag()) {
					flag = false;
					print();
				}
				continue;
			}
			long now = System.currentTimeMillis();
			int waitTime = (int) (now - customer.getArriveTime());
			//         
			if (waitTime > maxWaitTime) {
				maxWaitTime = waitTime;
			}
			//            ,           
			try {
				TimeUnit.MILLISECONDS.sleep(customer.getServeTime());
			} catch (Exception e) {
				e.printStackTrace();
			}
			System.err.println(name + "       :" + customer.getServeTime() + "ms\t    :" + waitTime + "ms");
			customerNum++;
			sumWaitTime += waitTime;
			sumServeTime += customer.getServeTime();
			
		}
	}
	
	public static void print() {
		if (customerNum > 0) {
			System.out.println("--------------------------------------");
			System.out.println("      :" + customerNum);
			System.out.println("      :" + maxWaitTime);
			System.out.println("      :" + CustomerQuene.getCustomerQuene().getWaitCustomerNum());
			System.out.println("        :" + CustomerQuene.getCustomerQuene().getMaxWaitNum());
			//          ,      
			System.out.println("        :" + ParseUtil.parseDoubleToDouble((sumWaitTime * 1.0 / customerNum), 2) + "ms");
			System.out.println("        :" + ParseUtil.parseDoubleToDouble((sumServeTime * 1.0 / customerNum), 2) + "ms");
			System.out.println("       :" + sumServeTime + "ms");
		}
	}
}
4)テストモデル
 /**  
 *@Description:     
 */ 
package com.lulei.opsearch.quene;  

import java.util.concurrent.TimeUnit;
  
public class Test {

	public static void main(String[] args) {
		//  
		System.out.println("     !");
		boolean flag = true;
		CustomerQuene.getCustomerQuene();
		long a = System.currentTimeMillis();
		int servantNum = 10;
		for (int i = 0; i < servantNum; i++) {
			ServantThread thread = new ServantThread("   " + i);
			thread.start();
		}
		while (flag) {
			long b = System.currentTimeMillis();
			if (b - a > 1 * 60 * 1000 && flag) {
				//  
				flag = false;
				CustomerQuene.getCustomerQuene().close();
				System.out.println("      !");
			}
			System.out.println("      :" + (b -a) + "ms");
			System.out.println("      :" + ((b -a) * servantNum - ServantThread.getSumServeTime()));
			ServantThread.print();
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}
-------------------------------------------------------
ささやかな福祉
-------------------------------------------------------
      個人は極客学院で「Lucene事例開発」の授業がもう始まりました.
第一課:Lucene概要
第二課:Lucene常用機能紹介
第三課:ネットワーカー
第四課:データベース接続池
第五課:小説サイトの収集
第六課:小説サイトのデータベース操作第七課:小説サイトの分布型爬虫類の実現