Approximation Algorithm for the NP-Complete problem of balancing job loads on machines. (Could be applied to processes management on a CPU). Does not guarantee an optimal solution, but instead, a solution is within a factor of 1.5 of the optimal solution.
Midentical machinesNjobs- Each jobs has processing time Tj
J(i)is the subset of jobs assigned to machinei- The load of machine
iis Li = sum of the processing times for the jobs on that machine
Makespan = the maximum of the loads on the machines (the machine with the largest load)
Goal: Minimize the Makespan
Assign each job to a machine to minimize makespan
There are mn different assignments of n jobs to m machines, which is exponential
The greedy solution runs in polynomial time and gives a solution no more than 1.5 times the optimal makespan
Proof involves complicated sigma notation and can be found in the references
Sort jobs by largest processing time 1st & keep assigning jobs to the machine with the smallest load

- O(n log n) for sorting jobs by processing time
- O(n log m) for Greedy Balance & assigning jobs to machines
- O(n log n) + O(n log m)
- ⇒ O(n log n)
Machine ID's are meaningless since machines are identical, they're created for readability.
But the algorithm still creates the job assignments on the machines according to the greedy strategy
int machineCountparameter is how many machines there areint[][] jobsis a 2D array containing the jobsjobs[i]is an array represents a jobjobs[i][0]is the Job Id or namejobs[i][1]is the Processing time
- Unlike the pseudocode, the jobs assigned to a machine are inside the
Machineobject in the Priority Queue - 1st Creates
Mmachines with unique Id's - Then loop over the jobs and assigns the job with the longest processing time to the machine with the smallest current load
- Java's Priority Queue doesn't really have an
IncreaseKey()method so the same effect is achieved by removing the machine from the Queue, updating the Machine'scurrentLoadand then adding the Machine back to the Queue
- Java's Priority Queue doesn't really have an
Machineclass represents a machine- Some Important Parts of a Machine
idis the ID or name of the machinecurrentLoadis the sum of the processing times of the jobs currently assigned to the machinejobsis a 2D ArrayList containing the jobs currently assigned to the machineMachineclass overridescompareTo()from theComparableinterface so that the `PriotityQueue is always has the smallest load machine at the top





