C# 矩阵中元素均匀分布的算法
我需要在随机均匀分布的日期月份生成任务。例如,对于10人到10项任务,日期间隔不少于两天。不得使用周末和节假日。元素在多重性中的基本均匀随机分布,附加条件是多重性-人x月的日期。建议,我可以在哪里观看算法。通常是以某种方式决定的。然而,我必须说,一个决定我不喜欢,但没有更好的不能想。参数如下:tasksPerMonth-每月的作业数,任务之间的距离-两个相邻作业之间的最小距离,isTasksInWeekend-考虑是否周末,minDay-从这一天开始(出于各种原因,这可能不是一个月的第一天),listOfDays-最初为空,假日-休假和假日列表,workdaysInMonth-工作日列表,随机-空随机()。其余的,我认为,原则上,很清楚,函数代码如下所示优化任务的分布C# 矩阵中元素均匀分布的算法,c#,algorithm,C#,Algorithm,我需要在随机均匀分布的日期月份生成任务。例如,对于10人到10项任务,日期间隔不少于两天。不得使用周末和节假日。元素在多重性中的基本均匀随机分布,附加条件是多重性-人x月的日期。建议,我可以在哪里观看算法。通常是以某种方式决定的。然而,我必须说,一个决定我不喜欢,但没有更好的不能想。参数如下:tasksPerMonth-每月的作业数,任务之间的距离-两个相邻作业之间的最小距离,isTasksInWeekend-考虑是否周末,minDay-从这一天开始(出于各种原因,这可能不是一个月的第一天),l
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;
}
}
public void GenerateRandomTasks(int tasksPerMonth,int desk之间的距离,bool istask sinweekend,int minDay,List listOfDays,List holidays,List workdays sinmonth,Random Random)
{
如果(tasksPerMonth==0)
tasksPerMonth=1;
var daysInMonth=workdaysInMonth.Count+假日.Count;
var tasksDaysInMonth=!istaskssinweekend?workdaysInMonth。计数:daysInMonth;
对于(int i=0;iv>maxDayInPeriod);
}
其他的
{
maxDayInPeriod=daysInMonth;
如果(!istaskssinweekend&holidays.Contains(maxDayInPeriod))
maxDayInPeriod=workdaysInMonth.Last();
}
如果(minDay>maxDayInPeriod)
minDay=maxDayInPeriod;
var day=随机。下一个(minDay,maxDayInPeriod);
if((isTasksInWeekend!=true&&holidays.Contains(day)))
day=任务分布的优化(minDay、maxDayInPeriod、日期列表、day、节假日);
如果(天>天/月)
日=月内的日;
添加(天);
minDay=maxDayInPeriod;
如果(minDay p.AmountDays==listOfDays.Min(z=>z.AmountDays)).CurrDay;
}
listOfDays.Clear();
回归日;
}
祝大家好运@chaitangayagadkari谢谢,我已经解决了我的问题。
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;
}