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",...