public GanttChart(IDirectedGraph <INode> orderOperationGraph) { Dictionary <Id, List <Interval> > groups = new Dictionary <Id, List <Interval> >(); foreach (var graphNode in orderOperationGraph.GetNodes()) { IScheduleNode node = graphNode.GetNode().GetEntity(); if (node.GetType() != typeof(ProductionOrderOperation) && node.GetType() != typeof(PurchaseOrderPart)) { continue; } GanttChartBar ganttChartBar = new GanttChartBar(); ganttChartBar.operation = node.GetId().ToString(); ganttChartBar.operationId = node.GetId().ToString(); ganttChartBar.resource = DetermineFreeGroup(groups, new Interval(node.GetId(), node.GetStartTimeBackward(), node.GetEndTimeBackward())).ToString(); ; ganttChartBar.start = node.GetStartTimeBackward().GetValue().ToString(); ganttChartBar.end = node.GetEndTimeBackward().GetValue().ToString(); ganttChartBar.groupId = ganttChartBar.resource; AddGanttChartBar(ganttChartBar); } }
public void ScheduleForward() { Stack <INode> S = new Stack <INode>(); // d_0 = 0 foreach (var node in _orderOperationGraph.GetLeafNodes()) { IScheduleNode scheduleNode = node.GetEntity(); if (scheduleNode.IsReadOnly() == false && scheduleNode.GetStartTimeBackward().IsSmallerThan(_simulationInterval.GetStart())) { // implicitly the due/endTime will also be set accordingly scheduleNode.SetStartTimeBackward(_simulationInterval.GetStart()); S.Push(node); } else // no forward scheduling is needed { } } // while S nor empty do while (S.Any()) { INode i = S.Pop(); IScheduleNode iAsScheduleNode = (IScheduleNode)i.GetEntity(); INodes predecessors = _orderOperationGraph.GetPredecessorNodes(i); if (predecessors != null && predecessors.Any()) { foreach (var predecessor in predecessors) { IScheduleNode predecessorScheduleNode = predecessor.GetEntity(); // if predecessor starts before endTime of current d/p --> change that if (predecessorScheduleNode.IsReadOnly() == false && predecessorScheduleNode .GetStartTimeBackward().IsSmallerThan(iAsScheduleNode.GetEndTimeBackward())) { // COPs are not allowed to change if (predecessorScheduleNode.GetType() != typeof(CustomerOrderPart)) { // don't take getDueTime() since in case of a demand, // this will be the startTime, which is to early // This must be the maximum endTime of all childs !!! DueTime maxEndTime = iAsScheduleNode.GetEndTimeBackward(); foreach (var successor in _orderOperationGraph.GetSuccessorNodes( predecessor)) { DueTime successorsEndTime = successor.GetEntity().GetEndTimeBackward(); if (successorsEndTime.IsGreaterThan(maxEndTime)) { maxEndTime = successorsEndTime; } } predecessorScheduleNode.SetStartTimeBackward(maxEndTime); } } S.Push(predecessor); } } } }