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 machines
- Njobs
- Each jobs has processing time Tj
- J(i)is the subset of jobs assigned to machine- i
- 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 are
- int[][] jobsis a 2D array containing the jobs- jobs[i]is an array represents a job
- jobs[i][0]is the Job Id or name
- jobs[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 machine
- currentLoadis the sum of the processing times of the jobs currently assigned to the machine
- jobsis a 2D ArrayList containing the jobs currently assigned to the machine
- Machineclass overrides- compareTo()from the- Comparableinterface so that the `PriotityQueue is always has the smallest load machine at the top