Example #1
0
        public async Task <ActionResult <AllocationResult> > Post([FromBody] AllocationTask allocationTask)
        {
            if (allocationTask == null)
            {
                return(BadRequest());
            }

            var nodesCount = allocationTask.Weights.Length;

            var nodeNumber = 1;

            var nodes = new List <Job>();

            var tasksGraph = new TaskGraph();

            foreach (var nodeWeight in allocationTask.Weights)
            {
                var node = new Job(nodeNumber, nodeWeight);
                nodes.Add(node);
                tasksGraph.AddTask(node);
                nodeNumber++;
            }

            for (int i = 0; i < nodesCount; i++)
            {
                for (int j = 0; j < nodesCount; j++)
                {
                    if (allocationTask.JobRelations[i][j] == 0)
                    {
                        continue;
                    }
                    var parentJob = nodes[i];
                    var childJob  = nodes[j];
                    var weight    = allocationTask.JobRelations[i][j];

                    childJob.AddParent(parentJob, weight);
                    parentJob.AddChild(childJob, weight);
                }
            }

            var jobsSorter = new CriticalPathByTime();

            var jobsOrder = jobsSorter.GetJobOrder(tasksGraph);


            var allocationResult = new AllocationResult()
            {
                JobSorting = jobsOrder.Select(jobsOrder => jobsOrder.Id).ToArray()
            };


            var processorCount = allocationTask.ProcessorRelations.Length;

            var processors = new List <Processor>();

            var computingSystem = new ComputingSystem();

            for (var i = 0; i < processorCount; i++)
            {
                var processor = new Processor(i + 1);
                processors.Add(processor);
                computingSystem.AddProcessor(processor);
            }

            for (int i = 0; i < processorCount; i++)
            {
                for (var j = 0; j < processorCount; j++)
                {
                    var weight = allocationTask.ProcessorRelations[i][j];
                    if (weight == 0)
                    {
                        continue;
                    }

                    var parentProc = processors[i];
                    var childProc  = processors[j];

                    parentProc.AddChild(childProc, weight);
                    childProc.AddParent(parentProc, weight);
                }
            }

            var sorter         = new ProcessorSorter();
            var processorOrder = sorter.SortProcessors(computingSystem);

            allocationResult.ProcessorSorting = processorOrder.Select(p => p.Id).ToArray();

            var tactNumber    = 1;
            var allocatedJobs = new List <Allocation>();

            var ticksDesc = createInitialTickState(tasksGraph, computingSystem);

            Debug.Write(string.Format("Tick {0}", tactNumber));

            while (allocatedJobs.Count < tasksGraph.Count())
            {
                Debug.Write(string.Format("Tick {0}", tactNumber));

                if (!ticksDesc.TryGetValue(tactNumber, out TickState tickState))
                {
                    System.Console.Write("Tick info not found");
                    continue;
                }

                while (tickState.ReadyJobs.Any() && tickState.ReadyProcessors.Any())
                {
                    var allocation = processTick(ticksDesc, tactNumber, processorOrder, jobsOrder.ToList(), allocatedJobs);
                }
                tactNumber++;

                addTickState(ticksDesc, tactNumber, new List <Job>(tickState.ReadyJobs), new List <Processor>(tickState.ReadyProcessors));
            }

            var schedule = new int [allocatedJobs.Max(j => j.Finish)][];

            for (var i = 0; i < schedule.Length; i++)
            {
                schedule[i] = new int[computingSystem.Count()];
            }


            foreach (var allocation in allocatedJobs)
            {
                for (var i = allocation.Start; i <= allocation.Finish; i++)
                {
                    schedule[i - 1][allocation.Processor.Id - 1] = allocation.Job.Id;
                }
            }

            allocationResult.Allocations = schedule.ToArray();

            return(allocationResult);
        }