[英]calculate average waiting time for a preemptive shortest job first scheduling algorithm
我的目标是为抢先式最短作业优先调度算法计算平均等待时间。
假设作业的到达时间以2个单位为间隔,例如0,2,4,6 .....即,第一个作业以0个单位输入,第二个作业在2个单位时间后输入,依此类推。
我为程序测试了3个测试用例,并得到正确答案:
测试用例1:
工作:8,4,9,5
平均时间:6.5测试案例2:
工作:7,4,1,4
平均时间:3
但是,当我将一个具有1000个作业的文件作为输入时,我得到了平均时间:16872.434,但是我从互联网上获得的代码给了我答案,为平均时间:16024我不明白如何在此处附加该文本文件...所以,我只想知道我的代码是否正确? 如果没有,我哪里出了问题?
package algoritm_W4_M6;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Vector;
/**
* To calculate the average Waiting Time of jobs when done in shortest Job First(SJF)-Preemptive
* @author Rahul Konda
*
*/
public class Preemptivr_SJV {
Vector<Float> burstTimes ;
public Preemptivr_SJV() {
burstTimes = new Vector<Float>();
}
public void loadFile() {
try {
float f;
Scanner scan = new Scanner(new FileInputStream("cpu_burst_times.txt"));
while(scan.hasNext()) {
f = Float.parseFloat( scan.nextLine());
burstTimes.add(f);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void readc() {
burstTimes.add((float) 7);
burstTimes.add((float) 4);
burstTimes.add((float) 1);
// burstTimes.add((float) 8);
burstTimes.add((float) 4);
// burstTimes.add((float) 2);
}
public float calculateAvgWaitingTime() {
// readc(); //this is for test cases 1 and 2
loadFile(); //this is to read from file
float waitingTime= 0.0f;
float totalTime = 0.0f;
PriorityQueue<Float> pq = new PriorityQueue<Float>();
for (Float time : burstTimes) {
pq.add(time);
Float minTime = pq.poll();
if(time<=2) {
waitingTime = waitingTime +(minTime*pq.size());
continue;
}
waitingTime = waitingTime +2*pq.size();
pq.add(minTime-2);//as job not completed I add back to queue
}
totalTime = totalTime + waitingTime; //summing up the above waiting times
waitingTime = 0.0f;
while(!pq.isEmpty()) {
waitingTime = waitingTime +pq.poll();
totalTime = totalTime + waitingTime; //summing up the above waiting times
}
totalTime = totalTime - waitingTime;
System.out.println("Jobs burst values:\n"+burstTimes.toString());
return (totalTime/1000);
}
public static void main(String[] args) {
Preemptivr_SJV fs = new Preemptivr_SJV();
System.out.println("\nAverage Waiting Time is: "+fs.calculateAvgWaitingTime());
}
}
上面的代码在Java中,谢谢。
如果作业分别在时间0、1、2、3到达,则测试用例1的平均时间是正确的。
您需要一种在添加新流程时指定到达时间或步进时间的方法。
这是抢先的最短作业优先调度的有效实现:
import java.util.PriorityQueue;
public class PreemptiveSJF {
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
private int waiting = 0;
private int numberOfProcesses = 0;
public void addProcess(int time) {
numberOfProcesses ++;
pq.add(time);
}
public float getAverageWaitingTime() {
while (pq.size() > 1) {
stepTime(1);
}
return (float)waiting / numberOfProcesses;
}
public void stepTime(int timeStep) {
int time = pq.poll();
if (time <= timeStep) {
waiting = waiting + time * pq.size();
} else {
waiting = waiting + timeStep * pq.size();
time = time - timeStep;
pq.add(time);
}
}
}
这是测试用例:
import static org.junit.Assert.*;
import org.junit.Test;
public class PreemptiveSJFTest {
@Test
public void test1() {
PreemptiveSJF psjf = new PreemptiveSJF();
psjf.addProcess(6);
psjf.addProcess(8);
psjf.addProcess(7);
psjf.addProcess(3);
assertEquals(7, psjf.getAverageWaitingTime(), 0.000001);
}
@Test
public void test2() {
PreemptiveSJF psjf = new PreemptiveSJF();
psjf.addProcess(8);
psjf.stepTime(1);
psjf.addProcess(4);
psjf.stepTime(1);
psjf.addProcess(9);
psjf.stepTime(1);
psjf.addProcess(5);
assertEquals(6.5f, psjf.getAverageWaitingTime(), 0.000001);
}
@Test
public void test3() {
PreemptiveSJF psjf = new PreemptiveSJF();
psjf.addProcess(7);
psjf.stepTime(2);
psjf.addProcess(4);
psjf.stepTime(2);
psjf.addProcess(1);
psjf.stepTime(1);
psjf.addProcess(4);
assertEquals(3f, psjf.getAverageWaitingTime(), 0.000001);
}
}
始终将测试用例与代码分开。
我希望这有帮助。
我相信您从这里得到了一些例子:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.