-6
我需要在随机均匀分布日期的月份中生成任务。例如,10人到10个任务,以便日期间隔不少于两天。周末和假期不得使用。基本上均匀随机分布的多元性与附加条件的多样性 - 人x月的日期。建议,我可以在哪里看到算法。算法矩阵中元素的均匀分布
我需要在随机均匀分布日期的月份中生成任务。例如,10人到10个任务,以便日期间隔不少于两天。周末和假期不得使用。基本上均匀随机分布的多元性与附加条件的多样性 - 人x月的日期。建议,我可以在哪里看到算法。算法矩阵中元素的均匀分布
一般决定。但是,我必须说,我不喜欢的一个决定,但没有比这更好的想法。参数如下: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;
}
祝所有
@ChaitanyaGadkari谢谢你,我已经解决了我的问题。 – SergS 2015-04-16 11:50:03