我无法实现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;
}
}
}
}
}
我认为如果您创建一个类来保存进程信息,这将更容易
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美分的硬币
前期面试雄心满满面经总结的多,后期摆烂随缘面试,没咋总结,楼主尽量回忆回忆,废话不多说,直接上硬货吧。 以下面经包括但不限于图森,影石,科大讯飞,元戎启行,滴滴,卡尔动力,旷视,mmt,小米,小鹏,理想,小马,华为车bu等等。 slam基础 这里列出一些相关问题,答案见我基础知识里的总结,基本是全的,自己对号入座,我主要写问题延伸出来的需要掌握的知识点,视觉slam为主哈。 重投影为什么用归一化平
所以这是一个经典的问题,在一套硬币中找到一个假币,只使用一个称重天平。为了完整起见,这里有一个这样的问题的例子: 一个著名的例子有九个(或更少)物品,例如硬币(或球),它们的重量相同,除了一个,在这个例子中它比其他的更轻--一个假币(一个奇怪的球)。差别只有在秤上称重才能察觉--但只有硬币本身才能称重。仅用两个称重就能将假币隔离吗? 我们所处理的情况是,只有一枚硬币是假币,而且我们知道它是怎么回事
本文向大家介绍SMO算法实现?相关面试题,主要包含被问及SMO算法实现?时的应答技巧和注意事项,需要的朋友参考一下 选择原凸二次规划的两个变量,其他变量保持不变,根据这两个变量构建一个新的二次规划问题,这样将原问题划分为更小的子问题可以大大加快计算速度,而选择变量的方式是: 其中一个是严重违反KKT条件的一个变量 另一个变量是根据自由约束确定的