Esempio n. 1
0
        public OptimizedResult OptimizeRecursion()
        {
            //具体优化方案在此
            OptimizedResult result = RecursionMethodOptimize(this._tasks);

            return(result);
        }
Esempio n. 2
0
        public OptimizedResult Optimize()
        {
            //具体优化方案在此
            //至少计算windowSize*batchSize次
            OptimizedResult result = HeuristicMethodOptimize1(this._tasks, batchSize: 100,
                                                              refreshSize: 10, maxIterationCount: 2000, errorRatio: 0.05, eMatrixRatio: 1, selectDiffElement: 1);

            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// 递归的方式,O(M!)
        /// </summary>
        private OptimizedResult RecursionMethodOptimize(List <Task> tasks)
        {
            OptimizedResult result = new OptimizedResult();

            result.TimeCost = Double.MaxValue;
            IList <IList <IList <Task> > > taskMatrix = ParseTasks(tasks);

            int[][] selectedArray = new int[taskMatrix.Count][];
            for (int i = 0; i < taskMatrix.Count; i++)
            {
                selectedArray[i] = new int[taskMatrix[i].Count];
            }
            Task[] tasksArray = new Task[tasks.Count];
            DoRecursionByOptimize(taskMatrix, tasksArray, 0, selectedArray, result);
            return(result);
        }
Esempio n. 4
0
        public static void Main(string[] args)
        {
            Debugger.SetDebugMode(false);
            Debugger.SetWriteConsole(true);
            Scheduler schedulerTest = Scheduler.DefaultTestScheduler1();
            //schedulerTest.OutPutOriginalSequence();
            OptimizedResult result = null;

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            //result = schedulerTest.OptimizeRecursion();
            //Console.WriteLine("Finally time cost: " + result.TimeCost);
            //Console.WriteLine("Task sequence is : " + result.ToString());
            ////schedulerTest.OutputSequence(result.Tasks);
            //sw.Stop();
            //Console.WriteLine("Calculation taked " + sw.ElapsedMilliseconds);
            //Console.WriteLine(".................................");
            //sw.Restart();
            double[] xs = new double[100];
            for (int i = 0; i < 100; i++)
            {
                xs[i] = schedulerTest.Optimize().TimeCost;
            }
            double avg = xs.Average();
            double s   = Math.Sqrt(xs.Sum(d => Math.Pow(d - avg, 2)) / 100);

            Console.WriteLine(avg + "________" + s);
            result = schedulerTest.Optimize();
            Console.WriteLine("Finally time cost: " + result.TimeCost);
            Console.WriteLine("Task sequence is : " + result.ToString());
            //schedulerTest.OutputSequence(result.Tasks);
            sw.Stop();
            Console.WriteLine("Calculation taked " + sw.ElapsedMilliseconds);
            Console.WriteLine("Testing Schedule Algorithm...");
            Console.ReadKey();
        }
Esempio n. 5
0
 /// <summary>
 /// 递归执行者,结果存储于入参result
 /// </summary>
 private void DoRecursionByOptimize(IList <IList <IList <Task> > > tasks,
                                    Task[] tasksArray, int index,
                                    int[][] selectedArray,
                                    OptimizedResult result)
 {
     if (index == tasksArray.Length)
     {
         //计算
         double timeCost = CalculateSequence(tasksArray.ToList());
         if (result.TimeCost > timeCost)
         {
             result.Tasks    = tasksArray.ToList();
             result.TimeCost = timeCost;
             result.Counter  = 0;
         }
         else if (result.TimeCost == timeCost)
         {
             result.Counter++;
         }
         return;
     }
     for (int i = 0; i < selectedArray.Length; i++)
     {
         for (int j = 0; j < selectedArray[i].Length; j++)
         {
             if (selectedArray[i][j] < tasks[i][j].Count)
             {
                 tasksArray[index] = tasks[i][j][selectedArray[i][j]];
                 selectedArray[i][j]++;
                 DoRecursionByOptimize(tasks, tasksArray, index + 1, selectedArray, result);
                 selectedArray[i][j]--;
                 tasksArray[index] = null;
             }
         }
     }
 }
Esempio n. 6
0
        /// <summary>
        /// 启发式方式
        /// </summary>
        private OptimizedResult HeuristicMethodOptimize1(List <Task> tasks,
                                                         int batchSize, int refreshSize,
                                                         int maxIterationCount, double errorRatio,
                                                         double eMatrixRatio, double selectDiffElement)
        {
            OptimizedResult result = new OptimizedResult();

            result.TimeCost = Double.MaxValue;
            IList <IList <IList <Task> > > taskMatrix = ParseTasks(tasks);

            Task[] tasksArray = new Task[tasks.Count];
            Random random     = new Random();

            OptimizedResult[]      batchResult       = new OptimizedResult[(int)(batchSize * (1 - eMatrixRatio))];
            OptimizedResult[]      eBatchResult      = new OptimizedResult[(int)(batchSize * eMatrixRatio)];
            List <OptimizedResult> sortedList        = new List <OptimizedResult>(batchSize);
            ProbabilityMatrix      dProbablityMatrix = new ProbabilityMatrix(taskMatrix, tasks.Count);
            ProbabilityMatrix      eProbablityMatrix = new ProbabilityMatrix(taskMatrix, tasks.Count);
            String   output   = "{0}::当前最优:{1:0.00},平权--均值:{2:0.00}, 标准差:{3:0.00}。动态--均值:{4:0.00}, 标准差:{5:0.00}。";
            Debugger debugger = new Debugger();

            int batchIndex = 0;
            int iteration  = 0;

            while (maxIterationCount != -1 && iteration < maxIterationCount)
            {
                //计算一个,先搞平权的batch数量
                for (batchIndex = 0; batchIndex < eBatchResult.Length; batchIndex++)
                {
                    Tuple <int, int>[] selectArray = GenerateSequence(taskMatrix, tasksArray, random, eProbablityMatrix, selectDiffElement);
                    double             timeCost    = CalculateSequence(tasksArray.ToList());
                    iteration++;
                    OptimizedResult res = new OptimizedResult();
                    res.TimeCost             = timeCost;
                    res.Tasks                = tasksArray.ToList();
                    res.Selections           = selectArray;
                    eBatchResult[batchIndex] = res;
                    if (timeCost < result.TimeCost)
                    {
                        result.Counter    = 0;
                        result.Selections = res.Selections;
                        result.Tasks      = res.Tasks;
                        result.TimeCost   = res.TimeCost;
                    }
                    else if (timeCost == result.TimeCost)
                    {
                        result.Counter++;
                    }
                }
                for (batchIndex = 0; batchIndex < batchResult.Length; batchIndex++)
                {
                    Tuple <int, int>[] selectArray = GenerateSequence(taskMatrix, tasksArray, random, dProbablityMatrix, selectDiffElement);
                    double             timeCost    = CalculateSequence(tasksArray.ToList());
                    iteration++;
                    OptimizedResult res = new OptimizedResult();
                    res.TimeCost            = timeCost;
                    res.Tasks               = tasksArray.ToList();
                    res.Selections          = selectArray;
                    batchResult[batchIndex] = res;
                    if (timeCost < result.TimeCost)
                    {
                        result.Counter    = 0;
                        result.Selections = res.Selections;
                        result.Tasks      = res.Tasks;
                        result.TimeCost   = res.TimeCost;
                    }
                    else if (timeCost == result.TimeCost)
                    {
                        result.Counter++;
                    }
                }
                //计算并记录各项指标
                double avg  = batchResult.Length == 0 ? 0 : batchResult.Average(b => b.TimeCost);
                double s2r  = batchResult.Length == 0 ? 0 : Math.Sqrt(batchResult.Sum(b => Math.Pow(b.TimeCost - result.TimeCost, 2)) / batchResult.Length);
                double eAvg = eBatchResult.Length == 0 ? 0 : eBatchResult.Average(b => b.TimeCost);
                double eS2r = eBatchResult.Length == 0 ? 0 : Math.Sqrt(eBatchResult.Sum(b => Math.Pow(b.TimeCost - result.TimeCost, 2)) / eBatchResult.Length);
                debugger.StringAppend(iteration).StringAppend(" ")
                .StringAppend(result.TimeCost).StringAppend(" ")
                .StringAppend(eAvg).StringAppend(" ")
                .StringAppend(eS2r).StringAppend(" ")
                .StringAppend(avg).StringAppend(" ")
                .StringAppend(s2r).StringAppend(" ")
                .StringAppend("\n");
                Debugger.WriteLine(String.Format(output, iteration, result.TimeCost, eAvg, eS2r, avg, s2r));

                sortedList.Clear();
                sortedList.AddRange(eBatchResult);
                sortedList.AddRange(batchResult);
                sortedList.Sort(new OptimizedResultComparator());
                if (eMatrixRatio < 1)
                {
                    //更新概率矩阵
                    RefreshProbabilityMatrix(dProbablityMatrix, sortedList.Take(refreshSize).ToList());
                }
            }
            debugger.WriteTofile();
            return(result);
        }