コード例 #1
0
        internal AssemblySequence copy()
        {
            var copySequence = new AssemblySequence();

            copySequence.Subassemblies = new List <SubAssembly>(Subassemblies);
            return(copySequence);
        }
コード例 #2
0
        public AssemblyCandidate(candidate c)
        {
            activeRuleSetIndex = c.activeRuleSetIndex;
            graph = c.graph;
            foreach (var d in c.prevStates)
            {
                prevStates.Add(d);
            }
            foreach (var opt in c.recipe)
            {
                recipe.Add(opt);
            }
            foreach (var f in c.performanceParams)
            {
                performanceParams.Add(f);
            }
            foreach (var f in c.designParameters)
            {
                designParameters.Add(f);
            }
            foreach (var a in c.GenerationStatus)
            {
                GenerationStatus.Add(a);
            }

            Sequence = new AssemblySequence();
        }
コード例 #3
0
        private static void Allocation(AssemblySequence candidate)
        {
            StartingTimes = new Dictionary <string, double>();
            var WorkTimes       = new List <double>();
            var prevOverallTime = double.NaN;
            var maxWorkers      = new WorkersClass[] { };

            FollowingTime = new Dictionary <string, double>();
            BuildingFollowingTimeDictionary(candidate.Subassemblies[0], 0.0);
            PrecedingTasks = BuildPrecedingTaskDictionary(OptimalOrientation.SucTasks);
            if (Program.AvailableWorkers == 0)
            {
                Program.AvailableWorkers = int.MaxValue;
            }
            for (var numberofWorkers = 1; numberofWorkers <= Program.AvailableWorkers; numberofWorkers++)
            {
                var tasks2 = new List <TasksClass>();
                foreach (var taskname in OptimalOrientation.TaskTime.Keys)
                {
                    var task = new TasksClass
                    {
                        Name           = taskname,
                        PrecedingTask  = new List <string>(PrecedingTasks[taskname]),
                        SucceedingTask = new List <string>(OptimalOrientation.SucTasks[taskname]),
                        FollowingTime  = FollowingTime[taskname],
                        TaskTime       = OptimalOrientation.TaskTime[taskname]
                    };
                    tasks2.Add(task);
                }
                //tasks = tasks.OrderByDescending(t => t.FollowingTime).ToList();

                var worker = new WorkersClass[numberofWorkers];
                for (var i = 0; i < numberofWorkers; i++)
                {
                    worker[i] = new WorkersClass();
                }

                var counter = 0;
                while (counter < tasks2.Count) //checkPrecedingTasks(tasks)  /*tasks.Last().PrecedingTask.Count != 0*/)
                {
                    worker = worker.OrderBy(t => t.Time).ToArray();
                    tasks2 = tasks2.OrderBy(t => t.StartTime).ToList();
                    foreach (var sortedtask in tasks2)
                    {
                        if (sortedtask.PrecedingTask.Count == 0)
                        {
                            worker[0].Tasks.Add(sortedtask.Name);
                            worker[0].Time = sortedtask.TaskTime + Math.Max(sortedtask.StartTime, worker[0].Time); //sortedtask.StartTime; //instead of starttime, I must write maximum of start time or rorker time
                            worker[0].TasksTimes.Add(sortedtask.StartTime);

                            counter++;
                            sortedtask.StartTime = double.PositiveInfinity;
                            foreach (var tobedeleted in tasks2)
                            {
                                if (tobedeleted.PrecedingTask.Contains(sortedtask.Name))
                                {
                                    if (tobedeleted.StartTime < worker[0].Time)
                                    {
                                        tobedeleted.StartTime = worker[0].Time;
                                    }
                                    tobedeleted.PrecedingTask.Remove(sortedtask.Name);
                                }
                            }
                            break;
                        }
                    }
                }
                var OverallTime = worker.Max(w => w.Time);
                var ratio       = (prevOverallTime - OverallTime) / prevOverallTime;
                if (double.IsNaN(ratio) || ratio > 0.1)
                {
                    prevOverallTime = OverallTime;
                    WorkTimes.Add(OverallTime);
                }
                else
                {
                    maxWorkers = worker;
                    break;
                }
            }

            // Instruction Manual
            for (var i = 0; i < maxWorkers.Count(); i++)
            {
                //var t = i + 1;
                var worker = maxWorkers[i];
                //Console.WriteLine(" Worker " + t+" :");
                for (var j = 0; j < worker.Tasks.Count; j++)
                {
                    StartingTimes.Add(worker.Tasks[j], worker.TasksTimes[j]);
                    //Console.WriteLine("     At the time: " + worker.TasksTimes[j]);
                    //Console.WriteLine("         Task: " + worker.Tasks[j]);
                    //Console.WriteLine("         Footprint Face: " + reorientation[worker.Tasks[j]]);
                }
            }
            Console.WriteLine("Assembly tasks are assigned to " + maxWorkers.Length + " workers");
            //CheckValuesWithCandidate(candidate.f3, WorkTimes[0], candidate.f4, WorkTimes.Last());
            //while (candidate.performanceParams.Count > 3) candidate.performanceParams.RemoveAt(3);
            //candidate.performanceParams.AddRange(WorkTimes);
        }
コード例 #4
0
 internal static void Run(AssemblySequence solution)
 {
     Console.WriteLine("\n\nAssigning workers to the task....");
     //foreach (var c in solutions.Where(c => c != null))
     Allocation(solution);
 }
コード例 #5
0
 internal double EvaluateTimeOfLongestBranch(AssemblySequence assemblySequence)
 {
     return(assemblySequence.Subassemblies.Max(sub => MaxTimeDownTreeRecurse(sub)));
 }