c# - Algorithm uniform distribution of elements in the matrix -
c# - Algorithm uniform distribution of elements in the matrix -
i need generate tasks in month of date of random uniform distribution. example, 10 people 10 tasks dates spaced not less 2 days. weekends , holidays not used. uniform random distribution of elements in multiplicity additional status multiplicity - people x dates of month. suggest, can watch algorithm.
in general decided somehow. however, must say, decision not like, nil improve not think. parameters follows: taskspermonth - number of jobs per month, distancebetweentasks - minimum distance between 2 adjacent jobs, istasksinweekend - take business relationship whether or not weekend, minday - starting day (for various reasons, may not first day of month), listofdays - empty, holidays - list of days off , holidays, workdaysinmonth - list of working days, random - empty random (). rest, think, in principle, clear, function code shown below 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; (int = 0; < 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; } }
method optimizationthedistributionoftasks:
private int optimizationthedistributionoftasks(int minday, int maxday, list<int> listdays, int day, list<int> holidays) { var listofdays = new list<daysfortaskplan>(); (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(); homecoming day; }
good luck all
c# algorithm
Comments
Post a Comment