public void GenerateOperations(List <Dictionary <long, Node> > nodesPerLevel, TransitionMatrix transitionMatrix, TransitionMatrixInput inputTransitionMatrix, MasterTableResourceCapability resourceCapabilities, XRandom rng) { Prepare(transitionMatrix, inputTransitionMatrix, rng); List <TEnumerator <M_ResourceCapability> > tools = resourceCapabilities.ParentCapabilities.Select(x => new TEnumerator <M_ResourceCapability>(x.ChildResourceCapabilities.ToArray())).ToList(); for (var i = 0; i < nodesPerLevel.Count - 1; i++) { foreach (var article in nodesPerLevel[i].Values) { var hierarchyNumber = 0; var currentWorkingMachine = inputTransitionMatrix.ExtendedTransitionMatrix ? DetermineNextWorkingMachine(0, rng) : rng.Next(tools.Count); var lastOperationReached = false; var operationCount = 0; var correction = inputTransitionMatrix.ExtendedTransitionMatrix ? 1 : 0; do { int duration; do { duration = _machiningTimeDistributions[currentWorkingMachine].Sample(); } while (duration == 0); hierarchyNumber += 10; var operation = new M_Operation { ArticleId = article.Article.Id, Name = "Operation " + (operationCount + 1) + " for [" + article.Article.Name + "]", Duration = duration, ResourceCapabilityId = tools[currentWorkingMachine].GetNext().Id, HierarchyNumber = hierarchyNumber }; article.Operations.Add(new Operation { MOperation = operation }); currentWorkingMachine = DetermineNextWorkingMachine(currentWorkingMachine + correction, rng); operationCount++; if (inputTransitionMatrix.ExtendedTransitionMatrix) { lastOperationReached = _matrixSize == currentWorkingMachine + 1; } else { lastOperationReached = article.WorkPlanLength == operationCount; } } while (!lastOperationReached); } } }
public void VerifyGeneratedData(TransitionMatrix transitionMatrix, List <Dictionary <long, Node> > nodesPerLevel, MasterTableResourceCapability capabilities) { var actualTransitionMatrix = new TransitionMatrix { Pi = new double[capabilities.ParentCapabilities.Count + 1, capabilities.ParentCapabilities.Count + 1] }; for (var i = 0; i < nodesPerLevel.Count - 1; i++) { foreach (var article in nodesPerLevel[i].Values) { var operationCount = 0; var lastCapPos = 0; do { var capPos = capabilities.ParentCapabilities.FindIndex(x => object.ReferenceEquals(x, article.Operations[operationCount].MOperation.ResourceCapability.ParentResourceCapability)); actualTransitionMatrix.Pi[lastCapPos, capPos]++; lastCapPos = capPos + 1; operationCount++; } while (operationCount < article.Operations.Count); actualTransitionMatrix.Pi[lastCapPos, capabilities.ParentCapabilities.Count]++; } } for (var i = 0; i <= capabilities.ParentCapabilities.Count; i++) { var sum = 0.0; for (var j = 0; j <= capabilities.ParentCapabilities.Count; j++) { sum += actualTransitionMatrix.Pi[i, j]; } for (var j = 0; j <= capabilities.ParentCapabilities.Count; j++) { actualTransitionMatrix.Pi[i, j] /= sum; } } var transitionMatrixGenerator = new TransitionMatrixGenerator(); ActualOrganizationDegree = transitionMatrixGenerator.CalcOrganizationDegree(actualTransitionMatrix.Pi, capabilities.ParentCapabilities.Count + 1); GeneratedOrganizationDegree = transitionMatrixGenerator.CalcOrganizationDegree(transitionMatrix.Pi, capabilities.ParentCapabilities.Count + 1); System.Diagnostics.Debug.WriteLine("################################# Generated work plans have an organization degree of " + ActualOrganizationDegree + " (transition matrix has " + GeneratedOrganizationDegree + ")"); }
public static MasterTableResourceCapability Initialize(MasterDBContext context, List <ResourceProperty> resourceProperties) { var resourceCapabilities = new MasterTableResourceCapability(); resourceCapabilities.CreateCapabilities(context, resourceProperties); var resources = new MasterTableResource(resourceCapabilities); resources.CreateModel(resourceProperties); resources.CreateResourceTools(resourceProperties); resources.SaveToDB(context); return(resourceCapabilities); }
/// <summary> /// /// </summary> /// <param name="context">Database context, the results are written to</param> /// <param name="resourceModelSize">Determines the number of resources for reach resource group </param> /// <param name="setupModelSize">Determines the number of possible setups for each resource group </param> /// <param name="operatorsModelSize">Add Operator that is required for setup</param> /// <param name="numberOfWorkersForProcessing">Add a required resource for Processing</param> /// <param name="secondResource">Add a second primary resource that is required for setup and processing</param> /// <returns></returns> public static MasterTableResourceCapability MasterTableResourceCapability(MasterDBContext context, ModelSize resourceModelSize, ModelSize setupModelSize, ModelSize operatorsModelSize, int numberOfWorkersForProcessing = 0, bool secondResource = false) { // requires Tools and Resources var resourceCapabilities = new MasterTableResourceCapability(); resourceCapabilities.InitBasicCapabilities(context); switch (setupModelSize) { case ModelSize.Small: resourceCapabilities.CreateToolingCapabilities(context, 2, 2, 2); break; case ModelSize.Medium: resourceCapabilities.CreateToolingCapabilities(context, 4, 4, 7); break; case ModelSize.Large: resourceCapabilities.CreateToolingCapabilities(context, 8, 8, 14); break; case ModelSize.TestModel: resourceCapabilities.CreateToolingCapabilities(context, 4, 4, 7); break; default: throw new ArgumentException(); } var resources = new MasterTableResource(resourceCapabilities); switch (resourceModelSize) { case ModelSize.Small: resources.InitSmall(context); break; case ModelSize.Medium: resources.InitMedium(context); break; case ModelSize.Large: resources.InitLarge(context); break; case ModelSize.XLarge: resources.InitXLarge(context); break; case ModelSize.TestModel: resources.InitMediumTest(context); break; default: throw new ArgumentException(); } var operatorModel = new int[] { 0, 0, 0 }; switch (operatorsModelSize) { case ModelSize.None: operatorModel = new int[] { 0, 0, 0 }; break; case ModelSize.Small: operatorModel = new int[] { 1, 0, 1 }; break; case ModelSize.Medium: operatorModel = new int[] { 1, 1, 1 }; break; default: throw new ArgumentException(); } resources.CreateResourceTools(setupTimeCutting: 10, setupTimeDrilling: 15, setupTimeAssembling: 20, operatorModel, numberOfWorkers: numberOfWorkersForProcessing, secondResource); resources.SaveToDB(context); return(resourceCapabilities); }
internal OperationData(ArticleData articles, MasterTableResourceCapability resourceCapability) { SawTools = new TEnumerator <M_ResourceCapability>( obj: resourceCapability.Capabilities.Single(x => x.Name.Equals(resourceCapability.CUTTING.Name)) .ChildResourceCapabilities.ToArray()); DrillTools = new TEnumerator <M_ResourceCapability>( obj: resourceCapability.Capabilities.Single(x => x.Name.Equals(resourceCapability.DRILLING.Name)) .ChildResourceCapabilities.ToArray()); AssemblyTools = new TEnumerator <M_ResourceCapability>( obj: resourceCapability.Capabilities.Single(x => x.Name.Equals(resourceCapability.ASSEMBLING.Name)) .ChildResourceCapabilities.ToArray()); BODENPLATTE_BOHREN = new M_Operation { ArticleId = articles.BODENPLATTE.Id, Name = "Bodenplatte bohren", Duration = 5, ResourceCapabilityId = DrillTools.GetNext().Id, HierarchyNumber = 10 }; BODENPLATTE_ZUSAMMENBAUEN = new M_Operation { ArticleId = articles.BODENPLATTE.Id, Name = "Bodenplatte zusammenbauen", Duration = 5, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 20 }; ABLAGE_ZUSAMMENBAUEN = new M_Operation { ArticleId = articles.ABLAGE.Id, Name = "Ablage zusammenbauen", Duration = 1, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 10 }; DECKPLATTE_BOHREN = new M_Operation { ArticleId = articles.DECKPLATTE.Id, Name = "Deckplatte bohren", Duration = 5, ResourceCapabilityId = DrillTools.GetNext().Id, HierarchyNumber = 10 }; SEITENWAND_BOHREN = new M_Operation { ArticleId = articles.SEITENWAND.Id, Name = "Seitenwand bohren", Duration = 5, ResourceCapabilityId = DrillTools.GetNext().Id, HierarchyNumber = 10 }; RÜCKWAND_ZUSAMMENBAUEN = new M_Operation { ArticleId = articles.RÜCKWAND.Id, Name = "Rückwand zusammenbauen", Duration = 1, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 10 }; SCHRANKTÜR_BOHREN = new M_Operation { ArticleId = articles.SCHRANKTÜR.Id, Name = "Schranktür bohren", Duration = 5, ResourceCapabilityId = DrillTools.GetNext().Id, HierarchyNumber = 10 }; SCHRANKTÜR_ZUSAMMENBAUEN = new M_Operation { ArticleId = articles.SCHRANKTÜR.Id, Name = "Schranktür zusammenbauen", Duration = 10, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 20 }; RAHMEN_ZUSAMMENBAUEN = new M_Operation { ArticleId = articles.RAHMEN.Id, Name = "Rahmen zusammenbauen", Duration = 10, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 10 }; RÜCKWAND_MONTIEREN = new M_Operation { ArticleId = articles.RAHMEN_MIT_RÜCKWAND.Id, Name = "Rückenwand montieren", Duration = 20, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 10 }; REGAL_DÜBEL_ANBRINGEN = new M_Operation { ArticleId = articles.REGAL.Id, Name = "Regal: Dübel anbringen", Duration = 5, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 10 }; REGAL_ABLAGEN_EINBAUEN = new M_Operation { ArticleId = articles.REGAL.Id, Name = "Regal: Ablagen einbauen", Duration = 5, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 20 }; SCHRANK_KLEIDERSTANGENHALTERUNGEN_ANBRINGEN = new M_Operation { ArticleId = articles.SCHRANK.Id, Name = "Schrank: Kleiderstangenhalterungen anbringen", Duration = 5, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 10 }; SCHRANK_KLEIDERSTANGE_EINBAUEN = new M_Operation { ArticleId = articles.SCHRANK.Id, Name = "Schrank: Kleiderstange einbauen", Duration = 2, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 20 }; SCHRANKTÜR_BEFESTIGEN = new M_Operation { ArticleId = articles.SCHRANK.Id, Name = "Schrank: Tür befestigen", Duration = 10, ResourceCapabilityId = AssemblyTools.GetNext().Id, HierarchyNumber = 30 }; }