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.
M
identical machinesN
jobs- Each jobs has processing time Tj
J(i)
is the subset of jobs assigned to machinei
- The load of machine
i
is 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 machineCount
parameter is how many machines there areint[][] jobs
is 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
Machine
object in the Priority Queue - 1st Creates
M
machines 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'scurrentLoad
and then adding the Machine back to the Queue
- Java's Priority Queue doesn't really have an
Machine
class represents a machine- Some Important Parts of a Machine
id
is the ID or name of the machinecurrentLoad
is the sum of the processing times of the jobs currently assigned to the machinejobs
is a 2D ArrayList containing the jobs currently assigned to the machineMachine
class overridescompareTo()
from theComparable
interface so that the `PriotityQueue is always has the smallest load machine at the top