当前位置: 首页>>代码示例>>C#>>正文


C# Heap.PopRoot方法代码示例

本文整理汇总了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;
        }
开发者ID:Mistrall,项目名称:Solvation,代码行数:76,代码来源:JobPlanBuilder.cs


注:本文中的Heap.PopRoot方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。