如何在java中为M/M/2系统处理模拟队列的阻塞时间?

如何在java中为M/M/2系统处理模拟队列的阻塞时间?,java,arrays,math,queue,simulation,Java,Arrays,Math,Queue,Simulation,大家好,为了模拟M/M/1的队列阻塞时间,我提出了这个解决方案,但不幸的是,它不是面向对象的,问题是我想用M/M/2系统模拟它,例如,我用19初始化lambda,用20初始化mu,只是为了简化计算。任何解决方案,提示,代码示例将不胜感激 public class Main { public static void main(String[] args) { final int MAX_ENTITY = 100000; final int SYSTEM_CA

大家好,为了模拟M/M/1的队列阻塞时间,我提出了这个解决方案,但不幸的是,它不是面向对象的,问题是我想用M/M/2系统模拟它,例如,我用19初始化lambda,用20初始化mu,只是为了简化计算。任何解决方案,提示,代码示例将不胜感激

public class Main {
    public static void main(String[] args) {
        final int MAX_ENTITY = 100000;
        final int SYSTEM_CAPACITY = 5;
        final int BUSY = 1;
        final int IDLE = 0;
        double lambda = 19, mu = 20;
        int blocked = 0;
        int queue_length = 0;
        int server_state = IDLE;
        int entity = 0;
        double next_av = getArivalRand(lambda);
        double next_dp = next_av + getDeparturedRand(lambda);
        while (entity <= MAX_ENTITY) {
            //Arrival
            if (next_av <= next_dp) {
                entity++;
                if (server_state == IDLE) {
                    server_state = BUSY;
                } else if (queue_length < SYSTEM_CAPACITY - 1) {
                    queue_length++;
                } else {
                    blocked++;
                }
                next_av += getArivalRand(lambda);
            } // Departure
            else if (queue_length > 0) {
                queue_length--;
                next_dp = next_dp + getDeparturedRand(mu);
            } else {
                server_state = IDLE;
                next_dp = next_av + getDeparturedRand(mu);
            }
        }
        System.out.println("Blocked Etity:" + blocked + "\n");
    }

    public static double getArivalRand(double lambda) {
        return -1 / lambda * Math.log(1 - Math.random());
    }

    public static double getDeparturedRand(double mu) {
        return -1 / mu * Math.log(1 - Math.random());
    }
}
公共类主{
公共静态void main(字符串[]args){
最终整数最大实体=100000;
最终int系统容量=5;
最终int忙碌=1;
最终int怠速=0;
双λ=19,μ=20;
int=0;
int队列长度=0;
int server_state=空闲;
int实体=0;
double next_av=getArivalRand(λ);
double next_dp=next_av+getDeparturedRand(λ);

然而(实体哦,孩子,你的代码需要认真重构才能实现
M/M/2
。 我创建了一个gist文件,我想它实现了你想要的, 在gist文件中,我创建了一个
Dispatcher
类,用于平衡两台服务器中的两个队列,并且我还用两个种子对其进行了模拟,这是一种更加面向对象的方法

下面是gist文件中的示例代码,用于平衡 任务

if(server1.getQueueLength()server2.getQueueLength())
currentServer=server2;
else if(currentServer==server1)
currentServer=server2;
其他的
currentServer=server1;

请保持礼貌,它表示服务器的数量,请阅读此处了解更多信息。这只是一个愚蠢的笑话。你应该将链接编辑到你的问题中。具体来说,你的问题是什么?即,你的代码做了什么不应该做的,还是不应该做的?@pjs正如我所述,我以M/M/1的顺序实现了它,我想实现M/M/2,也就是好吧,我看不出有什么理由放弃Please@Michael谢谢我编辑了它,请把它投上去,这样我可以更快地得到答案
if (server1.getQueueLength() < server2.getQueueLength()) 
   currentServer = server1;
else if (server1.getQueueLength() > server2.getQueueLength()) 
   currentServer = server2;
else if (currentServer == server1) 
   currentServer = server2;
else 
   currentServer = server1;