本文整理汇总了C#中Heap.PopRoot方法的典型用法代码示例。如果您正苦于以下问题:C# Heap.PopRoot方法的具体用法?C# Heap.PopRoot怎么用?C# Heap.PopRoot使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Heap
的用法示例。
在下文中一共展示了Heap.PopRoot方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetBasePlan
public List<PlanStep> GetBasePlan(IEnumerable<Resource> resources, IEnumerable<Job> jobs, IEnumerable<double[]> dependencyValues)
{
//Initialization
var dataContainer = new SchedulingDataContainer(resources, jobs, dependencyValues);
var plan = new List<PlanStep>();
var unfinishedJobs = new LinkedList<Job>(dataContainer.Jobs);
var resArr = resources.ToArray();
var resourcesForStep = new Resource[resArr.Length];
int stepNumber = 1;
//Repeat while we have unfinished jobs
while (unfinishedJobs.Count> 0)
{
//Set up resources per step
for (int r = 0; r < resArr.Length; r++) resourcesForStep[r] = resArr[r].DeepCopy();
//Select jobs we can plan
var jobsPossibleToExecute = unfinishedJobs.Where(j => j.CanStart()).ToList();
//Put to heap with greed comparer
var jobHeap = new Heap<Job>(jobsPossibleToExecute, jobsPossibleToExecute.Count(), new JobGreedyComparer());
var jobsForStep = new List<RunningJob>();
do
{
//Take first
var jobToExecute = jobHeap.PopRoot();
//Check we can plan it
//and compute intensity
var maxIntensity = CalcMaxPossibleIntensity(jobToExecute, resourcesForStep);
if (maxIntensity > 0)
{
//Start job
jobToExecute.State = JobState.Started;
//calc spended resources, remaining resources and time
foreach (var resource in resourcesForStep)
{
var jobResourceDependency = jobToExecute.ResourceDependencies.FirstOrDefault(d => d.Resource.Number == resource.Number);
if (jobResourceDependency != null)
resource.Value -= jobResourceDependency.Value*maxIntensity;
}
var time = jobToExecute.RemainingVolume/maxIntensity;
jobsForStep.Add(new RunningJob(jobToExecute, maxIntensity, time,
plan.LastOrDefault()!=null?plan.LastOrDefault().TimeEnd:0));
}
//Repeat while we have some jobs
//TODO: Optimize, maybe we don't need to check all jobs
} while (jobHeap.Count>0);
var stepTime = jobsForStep.Min(j => j.RunTime);
var startTime = (plan.Count > 0) ? plan.Last().TimeEnd : 0;
//Create PlanStep at this moment
var step = new PlanStep(jobsForStep, startTime, stepTime + startTime, stepNumber++);
//Compute all jobs to finish
foreach (var runningJob in jobsForStep)
{
if (runningJob.RunTime.FloatEquals(stepTime))
{
runningJob.JobReference.State = JobState.Finished;
runningJob.JobReference.RemainingVolume = 0;
unfinishedJobs.Remove(runningJob.JobReference);
}
else
{
var completed = runningJob.Intencity*stepTime;
runningJob.JobReference.RemainingVolume -= completed;
runningJob.RunTime = step.TimeDelta;
}
}
//Memorize job progress
plan.Add(step);
}
return plan;
}