2015-04-05 115 views
-6

我需要在随机均匀分布日期的月份中生成任务。例如,10人到10个任务,以便日期间隔不少于两天。周末和假期不得使用。基本上均匀随机分布的多元性与附加条件的多样性 - 人x月的日期。建议,我可以在哪里看到算法。算法矩阵中元素的均匀分布

+0

@ChaitanyaGadkari谢谢你,我已经解决了我的问题。 – SergS 2015-04-16 11:50:03

回答

0

一般决定。但是,我必须说,我不喜欢的一个决定,但没有比这更好的想法。参数如下:tasksPerMonth - 每月工作的数量,distanceBetweenTasks - 两个相邻工作之间的最小距离,isTasksInWeekend - 考虑周末,分钟是否从这一天开始(由于各种原因,这可能不是每月的第一天),listOfDays - 最初为空,节假日 - 假期和休息日,workdaysInMonth - 工作日清单,随机 - 空Random()。其余的,我认为,在原则上,很明显,功能代码如下所示OptimizationTheDistributionOfTasks

 public void GenerateRandomTasks(int tasksPerMonth, int distanceBetweenTasks, bool isTasksInWeekend, int minDay, List<int> listOfDays, List<int> holidays, List<int> workdaysInMonth, Random random) 
{ 
    if (tasksPerMonth == 0) 
     tasksPerMonth = 1; 
    var daysInMonth = workdaysInMonth.Count + holidays.Count; 
    var tasksDaysInMonth = !isTasksInWeekend ? workdaysInMonth.Count : daysInMonth; 
    for (int i = 0; i < tasksPerMonth; i++) 
    { 
     int maxDayInPeriod; 
     if (i < tasksPerMonth - 1) 
     { 
      maxDayInPeriod = minDay + tasksDaysInMonth/tasksPerMonth; 
      if (!isTasksInWeekend && holidays.Contains(maxDayInPeriod)) 
       maxDayInPeriod = workdaysInMonth.First(v => v > maxDayInPeriod); 
     } 
     else 
     { 
      maxDayInPeriod = daysInMonth; 
      if (!isTasksInWeekend && holidays.Contains(maxDayInPeriod)) 
       maxDayInPeriod = workdaysInMonth.Last(); 
     } 

     if (minDay > maxDayInPeriod) 
      minDay = maxDayInPeriod; 

     var day = random.Next(minDay, maxDayInPeriod); 

     if ((isTasksInWeekend != true && holidays.Contains(day))) 
      day = OptimizationTheDistributionOfTasks(minDay, maxDayInPeriod, listOfDays, day, holidays); 

     if (day > daysInMonth) 
      day = daysInMonth; 

     listOfDays.Add(day); 
     minDay = maxDayInPeriod; 
     if (minDay <= day + distanceBetweenTasks) 
      minDay = day + distanceBetweenTasks + 1; 
    } 
} 

方法OptimizationTheDistributionOfTasks:

 private int OptimizationTheDistributionOfTasks(int minDay, int maxDay, List<int> listDays, int day, List<int> holidays) 
{ 
    var listOfDays = new List<DaysForTaskPlan>(); 
    for (int k = minDay; k <= maxDay; k++) 
    { 
     var tempCountDays = listDays.Count(d => k == d); 
     if (!holidays.Contains(k)) 
      listOfDays.Add(new DaysForTaskPlan(k, tempCountDays)); 
    } 
    if (listOfDays.Any()) 
    { 
     day = listOfDays.First(p => p.AmountDays == listOfDays.Min(z => z.AmountDays)).CurrDay; 
    } 
    listOfDays.Clear(); 
    return day; 
} 

祝所有