排队模型java代码_基于排队论的排队系统分析软件源码-2

本文档提供了基于Java实现的排队模型,包括先来先服务(FCFS)、短作业优先(SJF)和高响应比优先(FPF)三种策略的详细代码。每个策略模型都有对应的处理服务函数,用于模拟不同的排队服务方式。此外,还包含顾客工厂类、文件匹配类以及文件浏览器类,用于从文件读取顾客信息并初始化模型。
摘要由CSDN通过智能技术生成

5、xuzhenzhen.com.strategy包:MVC模式中的控制包

//策略接口

package xuzhenzhen.com.strategy;

public interface ServiceStrategy {

public void service(int counterNum);

}

//先来先服务策略模型

package xuzhenzhen.com.strategy;

import java.util.ArrayList;

import xuzhenzhen.com.model.CounterEntity;

import xuzhenzhen.com.model.StrategyEntity;

public class FcfsStrategy implements ServiceStrategy{

private ArrayList

list;//策略列表,存储经过FCFS策略后的结果

public

FcfsStrategy(ArrayList

list){

this.list=list;

}

@Override

public void service(int counterNum){//FCFS策略服务函数

if(counterNum<1)return;

CounterEntity counter=new CounterEntity(counterNum);

if(list.size()>0){

SortList sortList=new SortList(list);

sortList.sortByComeT();

for(int i=0;i

StrategyEntity temp=list.get(i);

int index=counter.getMinIndex();

float startT=Math.max(counter.get(index), temp.getComeT());

temp.setServiceID(index);

temp.setStartT(startT);

temp.computeTimes();

counter.set(index, temp.getEndT());

}

}

}

}

//短作业优先服务策略模型

package xuzhenzhen.com.strategy;

import java.util.ArrayList;

import xuzhenzhen.com.model.CounterEntity;

import xuzhenzhen.com.model.StrategyEntity;

public class SjfStrategy implements ServiceStrategy{

private ArrayList

list; //策略列表,存储经过SJF策略后的结果

public

SjfStrategy(ArrayList

list) {

this.list = list;

}

@Override

public void service(int counterNum) {//SJF策略服务函数

if(counterNum<1)return;

CounterEntity counter=new CounterEntity(counterNum);

if(list.size()>0){

SortList sortList=new SortList(list);

sortList.sortByComeT();

QueueList queue=new QueueList();

float now=list.get(0).getComeT();

int i=0;

int index;//服务台标号

while(i0){

while(i=list.get(i).getComeT()){//加入到队列中

queue.add(list.get(i));

i++;

}

if(queue.size()<=0&&i

queue.add(list.get(i));

i++;

}

StrategyEntity entity=queue.popMin();

if(entity!=null){

index=counter.getMinIndex();

float startT=Math.max(counter.get(index),entity.getComeT());

entity.setServiceID(index);

entity.setStartT(startT);

entity.computeTimes();

counter.set(index, entity.getEndT());

}

now=counter.getMin();

}

}

}

}

//高响应比优先服务策略模型

package xuzhenzhen.com.strategy;

import java.util.ArrayList;

import xuzhenzhen.com.model.CounterEntity;

import xuzhenzhen.com.model.StrategyEntity;

public class FpfStrategy implements ServiceStrategy{

private

ArrayListlist;

//策略列表,存储经过FPF策略后的结果

public

FpfStrategy(ArrayList

list) {

this.list = list;

}

@Override

public void service(int counterNum) {//FPF策略服务函数

// TODO Auto-generated method stub

if(counterNum<1)return;

CounterEntity counter=new CounterEntity(counterNum);

if(list.size()>0){

SortList sortList=new SortList(list);

sortList.sortByComeT();

QueueList queue=new QueueList();

float now=list.get(0).getComeT();

int i=0;

int index;//服务台标号

while(i0){

while(i=list.get(i).getComeT()){//加入到队列中

queue.add(list.get(i));

i++;

}

if(queue.size()<=0&&i

queue.add(list.get(i));

i++;

}

StrategyEntity entity=queue.popFpfMax(now);

if(entity!=null){

index=counter.getMinIndex();

float startT=Math.max(counter.get(index),entity.getComeT());

entity.setServiceID(index);

entity.setStartT(startT);

entity.computeTimes();

counter.set(index, entity.getEndT());

}

now=counter.getMin();

}

}

}

}

//排队列表类,用来对顾客进行排队的类

package xuzhenzhen.com.strategy;

import java.util.ArrayList;

import xuzhenzhen.com.model.StrategyEntity;

public class QueueList {

private ArrayList

list;

public QueueList(){

list=new

ArrayList();

}

public int size(){

return list.size();

}

public void add(StrategyEntity entity){

list.add(entity);

}

public StrategyEntity popMin(){//移除服务时间最短的顾客

int size=list.size();

if(size>0){

int index=0;

float MinT=list.get(0).getServiceT();

for(int i=1;i

if(MinT>list.get(i).getServiceT()){

MinT=list.get(i).getServiceT();

index=i;

}

}

return list.remove(index);

}

return null;

}

public StrategyEntity popFpfMax(float now){//移除响应比最大的顾客

int size=list.size();

if(size>0){

int index=0;

float max=getFpfWeight(now, list.get(0));

for(int i=1;i

float weight=getFpfWeight(now, list.get(i));

if(max

max=weight;

index=i;

}

}

return list.remove(index);

}

return null;

}

public float getFpfWeight(float now,StrategyEntity entity){

return 1+(now-entity.getComeT())/entity.getServiceT();

}

}

//排序类,对顾客按照规则排序的类

package xuzhenzhen.com.strategy;

import java.util.ArrayList;

import xuzhenzhen.com.model.StrategyEntity;

public class SortList {

private ArrayList

list;

public

SortList(ArrayList

list) {

this.list = list;

}

public void sortByComeT(){

int size=list.size();

boolean isChange;

for(int i=0;i

isChange=false;

for(int j=size-1;j>=i+1;j--){

if(compareEntity(j-1, j)){

swapEntity(j, j-1);

isChange=true;

}

if(!isChange)return;

}

}

}

public boolean compareEntity(int i,int j){

float temp1=list.get(i).getComeT();

float temp2=list.get(j).getComeT();

return temp1>temp2;

}

public void swapEntity(int i,int j){

StrategyEntity temp=list.set(i,list.get(j));

list.set(j, temp);

}

}

6、xuzhenzhen.com.factory包:工厂包,通过文件来制造模型

//顾客工厂类,在文件中读取顾客信息,用来初始化顾客的类

package xuzhenzhen.com.factory;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

import xuzhenzhen.com.model.CustomEntity;

public class EntityFactory {

public ArrayList

getEntity(){

ArrayList list=new

ArrayList();

OpenFile open=new OpenFile("打开");

File file=open.openFile();

BufferedReader input=null;

if(file==null)return null;

try {

input=new BufferedReader(

new FileReader(file));

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

System.out.println("读取文件失败!");

e.printStackTrace();

}

try {

String value;

while((value=input.readLine())!=null){

String[] temp=value.split("[ \t]");//拆分字符串按空格和制表符

if(temp.length!=3)return null;

String id=temp[0];

float cT=Float.parseFloat(temp[1]);

float sT=Float.parseFloat(temp[2]);

CustomEntity cus=new CustomEntity(id, cT, sT);

list.add(cus);

}

input.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return list;

}

}

//文件匹配类,用来匹配正确的初始化文件

package xuzhenzhen.com.factory;

import java.io.File;

import javax.swing.filechooser.FileFilter;

public class MyFileFilter extends FileFilter{

private String ext;

public MyFileFilter(String ext) {

super();

this.ext = ext;

}

@Override

public boolean accept(File file) {

// TODO Auto-generated method stub

if(file.isDirectory())

return true;

String fileName=file.getName();

int index=fileName.lastIndexOf('.');

if(index>0&&index

String extension=fileName.substring(index+1).toLowerCase();

if(extension.equals(ext))

return true;

}

return false;

}

@Override

public String getDescription() {

// TODO Auto-generated method stub

if(ext.equals("txt"))

return "文本文件(*.txt)";

return "";

}

}

//文件浏览器类,用来打开指定文件

package xuzhenzhen.com.factory;

import java.io.File;

import javax.swing.JFileChooser;

public class OpenFile {

private String btnStr;

public OpenFile(String s){

this.btnStr=s;

}

public File openFile(){

File file=null;

JFileChooser fileChooser=new JFileChooser("D:\");

fileChooser.addChoosableFileFilter(new MyFileFilter("txt"));

int result=fileChooser.showDialog(null,btnStr);

if(result==JFileChooser.APPROVE_OPTION){

file=fileChooser.getSelectedFile();

}

return file;

}

}

7、xuzhenzhen.com.menu包:菜单包,集成所有的菜单选项类

//文件菜单类,封装了文件菜单中的子菜单

package xuzhenzhen.com.menu;

import java.awt.event.ActionListener;

import javax.swing.ImageIcon;

import javax.swing.JMenu;

import javax.swing.JMenuItem;

import javax.swing.KeyStroke;

public class FileMenu extends JMenu{

private static final long serialVersionUID =

7796528198277716694L;

private JMenuItem openItem;

private JMenuItem saveItem;

private JMenuItem exitItem;

public FileMenu(){

super("文件");

setMnemonic('F');

init();

}

public void init(){

openItem=new JMenuItem("打开",new ImageIcon("icons/open.gif"));

saveItem=new JMenuItem("保存",new ImageIcon("icons/save.gif"));

exitItem=new JMenuItem("退出");

openItem.setAccelerator(KeyStroke.getKeyStroke('O',

java.awt.Event.CTRL_MASK, false));

saveItem.setAccelerator(KeyStroke.getKeyStroke('S',

java.awt.Event.CTRL_MASK, false));

exitItem.setAccelerator(KeyStroke.getKeyStroke('X',

java.awt.Event.CTRL_MASK, false));

add(openItem);

add(saveItem);

addSeparator();

add(exitItem);

}

public void addListener(ActionListener l){

openItem.addActionListener(l);

saveItem.addActionListener(l);

exitItem.addActionListener(l);

}

}

//操作菜单类,封装了用于操作的子菜单

package xuzhenzhen.com.menu;

import java.awt.event.ActionListener;

import javax.swing.JMenu;

import javax.swing.JMenuItem;

import javax.swing.KeyStroke;

public class OperationMenu extends JMenu{

private static final long serialVersionUID =

1739915004810336972L;

private JMenuItem FCFSItem;

private JMenuItem SJFItem;

private JMenuItem FPFItem;

public OperationMenu() {

super("操作");

init();

}

public void init(){

FCFSItem=new JMenuItem("先来先服务");

SJFItem=new JMenuItem("短作业优先服务");

FPFItem=new JMenuItem("高响应比优先服务");

FCFSItem.setAccelerator(KeyStroke.getKeyStroke('F',

java.awt.Event.ALT_MASK, false));

SJFItem.setAccelerator(KeyStroke.getKeyStroke('S',

java.awt.Event.ALT_MASK, false));

FPFItem.setAccelerator(KeyStroke.getKeyStroke('P',

java.awt.Event.ALT_MASK, false));

add(FCFSItem);

add(SJFItem);

add(FPFItem);

}

public void addListener(ActionListener l){

FCFSItem.addActionListener(l);

SJFItem.addActionListener(l);

FPFItem.addActionListener(l);

}

}

//设置菜单类,封装了用于设置的子菜单

package xuzhenzhen.com.menu;

import java.awt.event.ActionListener;

import javax.swing.JMenu;

import javax.swing.JMenuItem;

import javax.swing.KeyStroke;

public class SettingMenu extends JMenu{

private static final long serialVersionUID =

-721137626887704367L;

private JMenuItem setCounterItem;//设置服务台个数

public SettingMenu(){

super("设置");

init();

}

public void init(){

setCounterItem=new JMenuItem("设置服务台");

setCounterItem.setAccelerator(KeyStroke.getKeyStroke('R',

java.awt.Event.CTRL_MASK, false));

add(setCounterItem);

}

public void addListener(ActionListener l){

setCounterItem.addActionListener(l);

}

}

8、xuzhenzhen.com.view包:MVC模式中的视图层,用来显示模型

//主窗体类,用来显示主窗体

package xuzhenzhen.com.view;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.JFrame;

import javax.swing.JMenuBar;

import javax.swing.JOptionPane;

import xuzhenzhen.com.menu.FileMenu;

import xuzhenzhen.com.menu.OperationMenu;

import xuzhenzhen.com.menu.SettingMenu;

public class MainFrame extends JFrame implements

ActionListener{

private static final long serialVersionUID =

5976758585383446855L;

private JMenuBar bar;

private FileMenu fileMenu;//文件菜单

private SettingMenu settingMenu;//设置菜单

private OperationMenu operationMenu;//操作菜单

private MainTabbedPane panel;//主面板

public MainFrame(){

init();

}

public void init(){//初始化主窗体中的对象

bar=new JMenuBar();

fileMenu=new FileMenu();

settingMenu=new SettingMenu();

operationMenu=new OperationMenu();

fileMenu.addListener(this);

settingMenu.addListener(this);

operationMenu.addListener(this);

bar.add(fileMenu);

bar.add(settingMenu);

bar.add(operationMenu);

setJMenuBar(bar);

panel=new MainTabbedPane();

this.setContentPane(panel);

this.setTitle("排队系统分析软件");

this.setSize(800, 600);

this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

this.setLocationRelativeTo(null);

addWindowListener(new WindowAdapter() {

@Override

public void windowClosing(WindowEvent arg0) {

// TODO Auto-generated method stub

dealQuit();

}

});

}

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

String event=e.getActionCommand();

if(event.equals("打开")) dealOpen();

if(event.equals("保存")) dealSave();

if(event.equals("退出")) dealQuit();

if(event.equals("设置服务台"))dealSetting();

if(event.equals("先来先服务"))panel.operateFcfs();

if(event.equals("短作业优先服务"))panel.operateSjf();

if(event.equals("高响应比优先服务"))panel.operateFpf();

}

public void dealQuit(){

int result=JOptionPane.showConfirmDialog(null, "是否退出软件?", "提示",

JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);

if(result==JOptionPane.YES_OPTION){

System.exit(0);

}

}

public void dealOpen(){

panel.loadFromFile();

}

public void dealSave(){

}

public void dealSetting(){

SetCounterDialog dialog=new

SetCounterDialog(panel.getServiceCount());

panel.setServiceCount(dialog.getCounterValue());

}

}

//主面板类,用来封装顾客表格和策略表格

package xuzhenzhen.com.view;

import java.util.ArrayList;

import javax.swing.JOptionPane;

import javax.swing.JTabbedPane;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import xuzhenzhen.com.control.CustomListener;

import xuzhenzhen.com.factory.EntityFactory;

import xuzhenzhen.com.model.CustomEntity;

public class MainTabbedPane extends JTabbedPane implements

CustomListener,ChangeListener{

private static final long serialVersionUID =

6749334923783628548L;

private ArrayList

list;//顾客列表

private int serviceCount=1;//服务台个数

private CustomPanel customPane;//顾客面板

private ResultPanel fcfsPane;//FCFS面板

private ResultPanel sjfPane;//SJF面板

private ResultPanel fpfPane;//FPF面板

private boolean isChange=false;//顾客属性是否改变的标志

public MainTabbedPane(){

init();

}

public void init(){//初始化主面板

customPane=new CustomPanel();

fcfsPane=new ResultPanel();

sjfPane=new ResultPanel();

fpfPane=new ResultPanel();

add("顾客到达表", customPane);

add("FCFS表",fcfsPane);

add("SJF表",sjfPane);

add("FPF表",fpfPane);

addChangeListener(this);

}

public void loadFromFile(){//在文件中加载顾客到达情况

EntityFactory factory=new EntityFactory();

if(factory!=null){

list=factory.getEntity();

if(list!=null)customPane.setTableModel(this, list);

else{

JOptionPane.showMessageDialog(null, "文件格式错误!", "警告",

JOptionPane.ERROR_MESSAGE);

}

}

}

public void operateFcfs(){//执行FCFS策略

if(list!=null){

if(!isChange)fcfsPane.oprateService(list, serviceCount,1);

setSelectedIndex(1);

}

}

public void operateSjf(){//执行SJF策略

if(list!=null){

if(!isChange)sjfPane.oprateService(list, serviceCount,2);

setSelectedIndex(2);

}

}

public void operateFpf(){//执行FPF策略

if(list!=null){

if(!isChange)fpfPane.oprateService(list, serviceCount,3);

setSelectedIndex(3);

}

}

public int getServiceCount() {

return serviceCount;

}

public void setServiceCount(int serviceCount) {

this.serviceCount = serviceCount;

}

@Override

public void customDataChanged() {

// TODO Auto-generated method stub

this.isChange=true;

}

@Override

public void stateChanged(ChangeEvent arg0) {

// TODO Auto-generated method stub

if(isChange&&list!=null){

int index=this.getSelectedIndex();

if(index>0){

int result=JOptionPane.showConfirmDialog(null, "列表已更新,是否重新运行算法?",

"提示",

JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);

if(result==JOptionPane.YES_OPTION){

isChange=false;

fcfsPane.oprateService(list, serviceCount,1);

sjfPane.oprateService(list, serviceCount,2);

fpfPane.oprateService(list, serviceCount,3);

}

}

}

}

}

//顾客面板类,用来显示顾客到达情况的面板

package xuzhenzhen.com.view;

import java.awt.BorderLayout;

import java.util.ArrayList;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import xuzhenzhen.com.control.CustomListener;

import xuzhenzhen.com.model.CustomEntity;

import xuzhenzhen.com.tablemodel.CustomTableModel;

public class CustomPanel extends JPanel{

private static final long serialVersionUID =

-8497054290255576000L;

private CustomTableModel model;//顾客表单模型

private JTable table;//表格,用来显示顾客表单模型

private JScrollPane panel;

public CustomPanel(){

table=new JTable();

table.getTableHeader().setReorderingAllowed(false);

panel=new JScrollPane(table);

setLayout(new BorderLayout());

add(panel,BorderLayout.CENTER);

}

public CustomPanel(CustomListener

l,ArrayList list){

model=new CustomTableModel(l, list);

table=new JTable(model);

table.getTableHeader().setReorderingAllowed(false);

panel=new JScrollPane(table);

setLayout(new BorderLayout());

add(panel,BorderLayout.CENTER);

}

public void setTableModel(CustomListener

l,ArrayList list){

model=new CustomTableModel(l, list);

table.setModel(model);

this.validate();

}

}

//结果面板类,用来显示策略的结果

package xuzhenzhen.com.view;

import java.awt.BorderLayout;

import java.util.ArrayList;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import xuzhenzhen.com.model.CustomEntity;

import xuzhenzhen.com.tablemodel.StrategyTableModel;

public class ResultPanel extends JPanel{

private static final long serialVersionUID =

-6825335095647863360L;

private StrategyTableModel model;//策略模型

private JTable table;//用来显示策略模型

private JScrollPane panel;

public ResultPanel(){

table=new JTable();

table.getTableHeader().setReorderingAllowed(false);

panel=new JScrollPane(table);

setLayout(new BorderLayout());

add(panel,BorderLayout.CENTER);

}

public void

oprateService(ArrayList

list,int num,int strategyKey){

model=new StrategyTableModel(list);

model.doService(num,strategyKey);

table.setModel(model);

this.validate();

}

}

//设置服务台个数的输入框类

package xuzhenzhen.com.view;

import java.awt.BorderLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class SetCounterDialog implements ActionListener{

private JDialog dialog;

private JTextField counterNum;

private JButton OKBtn;

private JButton cancelBtn;

private int counterCount;

public SetCounterDialog(int counterCount) {

this.counterCount = counterCount;

init();

}

public void init(){

dialog = new JDialog(new JDialog(),"设置服务台个数",true);

counterNum=new JTextField();

counterNum.setText(this.counterCount+"");

OKBtn=new JButton("确定");

cancelBtn=new JButton("取消");

OKBtn.addActionListener(this);

cancelBtn.addActionListener(this);

dialog.setLayout(new BorderLayout());

JPanel panel=new JPanel(new GridLayout(1, 2,1,2));

panel.add(new JLabel("服务台个数:",JLabel.CENTER));

panel.add(counterNum);

JPanel btnPanel=new JPanel(new GridLayout(1, 2));

btnPanel.add(OKBtn);

btnPanel.add(cancelBtn);

dialog.add(panel,BorderLayout.CENTER);

dialog.add(btnPanel,BorderLayout.SOUTH);

dialog.setSize(200, 100);

dialog.setResizable(false);

dialog.setLocationRelativeTo(null);

dialog.setVisible(true);

}

public int getCounterValue(){

return this.counterCount;

}

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

String event=e.getActionCommand();

if(event.equals("确定")){

try {

int temp=Integer.parseInt(counterNum.getText());

this.counterCount=temp;

dialog.dispose();

} catch (Exception e2) {

// TODO: handle exception

JOptionPane.showMessageDialog(null, "数据输入错误!",

"警告",JOptionPane.ERROR_MESSAGE);

}

}

if(event.equals("取消")){

dialog.dispose();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值