public OptimizedResult OptimizeRecursion() { //具体优化方案在此 OptimizedResult result = RecursionMethodOptimize(this._tasks); return(result); }
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); }
/// <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); }
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(); }
/// <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; } } } }
/// <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); }