当前位置: 首页 > 知识库问答 >
问题:

硬算法实现

齐高阳
2023-03-14

我无法实现SJF(最短作业优先)算法。

SJF就是这样工作的

如果进程到达0时间,它将工作到下一个进程到达,算法必须检查到达1的到达(进程/进程)是否比当前剩余时间短
示例:P0执行了1,还有2要完成,现在我们有P0,P1,P2,P3,P4 in 1算法将执行最短的一个P3,之后是P0,然后是P4,然后是P1,依此类推。问题是我必须保存所有进程的开始和结束时间执行,以及等待时间。

这是我的最新算法。(出现一些错误案例)

输入数据:

Process Arrival Burest 
P0      0       3
P1      0       4
P2      0       5
P3      1       1
p4      1       3

for (i = 0; i < proc.Count; i++)
{
    minProcIndex = i;
    for (x = i; x < proc.Count; x++)
    {
        for (int y = 0 ; y < proc.Count; y++)
        {
            if (y == minProcIndex)
                continue;

            if (tempBrust[minProcIndex] - tempArrival[y] > tempBrust[y] 
                && tempBrust[y] != 0)
            {
                tempBrust[minProcIndex] -= tempArrival[y];
               // tempArrival[minProcIndex] += tempArrival[y];
                clock += tempArrival[y];
                //proc[y].start = clock;
                minProcIndex = y;
            }
            else if (y != proc.Count -1)
                continue;
            else
            {
                if (y == 0)
                {
                    proc[minProcIndex].start = 0;
                }
                else if (proc[y].start > 0)
                {
                    proc[y].start = clock;
                }
                else
                proc[minProcIndex].start = clock;

                proc[minProcIndex].end = proc[minProcIndex].brust + clock;
                tempBrust[minProcIndex] = 0;
                clock += proc[minProcIndex].brust;
                if (minProcIndex == proc.Count - 1)
                    minProcIndex = 0;
                else
                minProcIndex++;
                for (int c = 0; c < proc.Count; c++)
                {
                    if (tempArrival[c] < clock)
                        tempArrival[c] = clock - 1;
                }
            }
        }
    }
}

共有1个答案

薛修能
2023-03-14

我认为如果您创建一个类来保存进程信息,这将更容易

public class ProcessInformation
{
    public string Name { get; private set; }
    public int Duration { get; private set; }
    public int ArrivalTime { get; private set; }

    public int TimeLeft { get; set; }
    public int? StartTime { get; set; }
    public int? EndTime { get; set; }
    public List<int> InterruptTimes { get; private set; }

    public ProcessInformation(string name, int arrivalTime, int duration)
    {
        Name = name;
        ArrivalTime = arrivalTime;
        Duration = duration;
        TimeLeft = duration;
        InterruptTimes = new List<int>();
    }
}

然后您可以运行以下代码

var processes = new List<ProcessInformation>
                {
                    new ProcessInformation("P0", 0, 3),
                    new ProcessInformation("P1", 0, 4),
                    new ProcessInformation("P2", 0, 5),
                    new ProcessInformation("P3", 1, 1),
                    new ProcessInformation("P4", 1, 3)
                };

int currentTime = 0;
ProcessInformation currentProcess = null;
while (processes.Any(p => p.TimeLeft > 0))
{
    var shortest =
        processes.Where(p => p.ArrivalTime <= currentTime && p.TimeLeft > 0)
            .OrderBy(p => p.TimeLeft)
            .FirstOrDefault();

    if (currentProcess != null && currentProcess.TimeLeft > 0 && shortest != currentProcess)
    {
        currentProcess.InterruptTimes.Add(currentTime);
    }

    if (shortest != null)
    {
        if (shortest.StartTime == null) shortest.StartTime = currentTime;
        shortest.TimeLeft--;
        if (shortest.TimeLeft == 0) shortest.EndTime = currentTime + 1;
    }

    currentProcess = shortest;
    currentTime++;
}

foreach (var p in processes)
{
    Console.WriteLine(
        "Process {0} arrived {1} started {2} ended {3} duration {4} wait {5} interrupt times {6}", 
        p.Name, 
        p.ArrivalTime, 
        p.StartTime, 
        p.EndTime, 
        p.Duration, 
        p.EndTime - p.ArrivalTime - p.Duration,
        p.InteruptTimes.Any() ? string.Join(", ", p.InteruptTimes) : "None");
}

输出以下内容

进程P0到达0开始0结束4持续时间3等待1中断次数1

过程P1到达0开始7结束11持续时间4等待7中断次数无

进程P2到达0开始11结束16持续时间5等待11中断时间无

进程 P3 到达 1 开始 1 结束 2 持续时间 1 等待 0 中断次数 无

进程P4到达1开始4结束7持续时间3等待3中间时间无

 类似资料:
  • 首先,是的,这是我的硬件,我觉得很难,所以我真的很感激一些指导。 我需要证明对于当

  • 我正在尝试构建一个交换算法,以交换与库存数量相同的硬币。我有一本字典,里面有两个面值的键值对 输入是要返回的值,例如2,80欧元。考虑到股票,我需要一个算法来计算返回资金的最佳方式 (最好的方法是库存硬币数量的标准差最低,这意味着所有面额的库存都是相同的),因此在这个例子中,我需要返还120欧元的硬币 我怎样才能计算出最好的数字,以返回每面额使用c算法,并保持股票相同的所有硬币? 其中map Va

  • 我见过很多硬币更换问题,这个问题很独特。我尝试使用DP和递归,但我无法解决它。 这就是问题所在: 假设给定一个价格,X,其中X是美分,我有5种有限面额的硬币,1,5,10,20,50。我有不同数量的1、5、10、20、50分硬币。我想用最大数量的硬币来确定价格X。我该怎么做?(假设X总是可以用手头的硬币制作) 例如,如果价格X=52,并且 我有三枚一分硬币 我有四枚五分硬币 我有8枚10美分的硬币

  • 所以这是一个经典的问题,在一套硬币中找到一个假币,只使用一个称重天平。为了完整起见,这里有一个这样的问题的例子: 一个著名的例子有九个(或更少)物品,例如硬币(或球),它们的重量相同,除了一个,在这个例子中它比其他的更轻--一个假币(一个奇怪的球)。差别只有在秤上称重才能察觉--但只有硬币本身才能称重。仅用两个称重就能将假币隔离吗? 我们所处理的情况是,只有一枚硬币是假币,而且我们知道它是怎么回事

  • 本文向大家介绍SMO算法实现?相关面试题,主要包含被问及SMO算法实现?时的应答技巧和注意事项,需要的朋友参考一下 选择原凸二次规划的两个变量,其他变量保持不变,根据这两个变量构建一个新的二次规划问题,这样将原问题划分为更小的子问题可以大大加快计算速度,而选择变量的方式是: 其中一个是严重违反KKT条件的一个变量 另一个变量是根据自由约束确定的

  • 朴素贝叶斯算法 给定数据集$$T={(x{(1)},y{(1)}),(x{(2)},y{(2)}),...,(x{(m)},y{(m)})}$$,其中$$x\in \mathcal{X}\subseteq R^n$$,$$y\in \mathcal{Y}={c_1, c_2,...,c_K}$$,$$X$$是定义在输入空间$$\mathcal{X}$$上的随机向量,$$Y$$是定义在输出空间$$\