JSFiddle - React, Tailwind, and code Playground
by Ian Sadovy
HTML
<h3>Workers</h3>
<table id="workersTable" border="1" width="50%"></table>
<h3>Shedule</h3>
<table id="scheduleTable" border="1" width="100%"></table>
<br/>
<button onclick="generateSchedule()">Generate Schedule</button>
JavaScript
var workers = [
{ name: "Worker 1", shiftsCount: 0 },
{ name: "Worker 2", shiftsCount: 0 },
{ name: "Worker 3", shiftsCount: 0 },
{ name: "Worker 4", shiftsCount: 0 },
{ name: "Worker 5", shiftsCount: 0 },
];
var scheduleTemplate = [
{ day: "MON", shifts: [ { id: "m_m", name: "9:00 - 17:00", workers:[] } ] },
{ day: "TUE", shifts: [ { id: "t_m", name: "9:00 - 17:00", workers:[] } ] },
{ day: "WED", shifts: [ { id: "w_m", name: "9:00 - 17:00", workers:[] } ] },
{ day: "THU", shifts: [ { id: "th_m", name: "9:00 - 17:00", workers:[] } ] },
{ day: "FRI", shifts: [ { id: "f_m", name: "9:00 - 17:00", workers:[] } ] },
{ day: "SAT", shifts: [ { id: "st_m", name: "9:00 - 17:00", workers:[] } ] },
{ day: "SUN", shifts: [ { id: "sn_m", name: "9:00 - 17:00", workers:[] } ] }
];
printWorkers(workers);
printSchedule(scheduleTemplate);
var needWorkers = 3;
function generateSchedule() {
var avgWorkerShifts = scheduleTemplate.length * needWorkers / workers.length;
console.log("avgWorkerShifts", avgWorkerShifts);
var workersPool = [];
for (var i = 0; i < workers.length; i++) {
for (var j = 0; j < avgWorkerShifts - 1; j++) {
workersPool.push(workers[i]);
}
}
var weekPoolLength = scheduleTemplate.length * needWorkers;
var i = 0;
while (workersPool.length < weekPoolLength) {
workersPool.push(workers[i % workers.length]);
i++;
}
for (var i = 0; i < 100; i++) {
console.log("Iteration " + i);
generateVariant(workersPool.slice(), scheduleTemplate);
if (validateSchedule(scheduleTemplate)) {
break;
}
}
console.log(scheduleTemplate);
printWorkers(workers);
printSchedule(scheduleTemplate);
}
function generateVariant(workersPool, scheduleTemplate) {
workersPool = shuffle(workersPool);
var weekPoolLength = scheduleTemplate.length * needWorkers;
//console.log("weekPoolLength",...