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); }