Skip to main content

Greedy algorithms for Job Scheduling



In this programming problem and the next you'll code up the greedy algorithms from lecture for minimizing the weighted sum of completion times..This file describes a set of jobs with positive and integral weights and lengths. It has the format
[number_of_jobs]
[job_1_weight] [job_1_length]
[job_2_weight] [job_2_length]
...
For example, the third line of the file is "74 59", indicating that the second job has weight 74 and length 59. You should NOT assume that edge weights or lengths are distinct.
Your task in this problem is to run the greedy algorithm that schedules jobs in decreasing order of the difference (weight - length). This algorithm is not always optimal. IMPORTANT: if two jobs have equal difference (weight - length), you should schedule the job with higher weight first. Beware: if you break ties in a different way, you are likely to get the wrong answer. You should report the sum of weighted completion times of the resulting schedule --- a positive integer --- in the box below.

Sol:
we will compute weighted sum with the following formula :
And our goal is to minimize that function:

our task in this problem is to run the greedy algorithm that schedules jobs in decreasing order of the difference (weight - length) . In code this implemented in the following way:

Algo is straight forward, we make  a job with  length, weight and  difference (weight - length). then we keep all the jobs in a list and sorted them in non- decreasing order. If two jobs have same difference we break the tie by choosing a job with higher weight. This tie breaking is achieved by implementing Comparable in Job class.


 public int compareTo(Object o) {  
           // TODO Auto-generated method stub  
     Job          jobOther=(Job)o;  
            int delta= jobOther.getDifference().intValue()-this.difference.intValue() ;  
             if(delta==0){  
                  delta=this.weight.intValue()-jobOther.getWeight().intValue();  
                  return delta;  
             }  
           return delta;  
      }  





   
Source code of above problem is available in the following link along with input file that contains 10,000 jobs with different weights and lengths.

Note:

I am  prone to  typo; please report them and I will try to update the posts accordingly.



Comments

Post a Comment

Popular posts from this blog

Integer comparison using == gets tricky between -128 to 127.

Integer i=45;                                                                                                                                   Integer k=45;         System.out.println("i.hashcode= "+i.hashCode());         System.out.println("k.hashcode= "+k.hashCode());         System.out.println(i==k);         System.out.println(i.equals(k)); Out Put: i.hashcode= 45 k.hashcode= 45 true true Great, it seems work fine! now change the value of i=k=201.         Integer i=201;     ...
You are given four integers 'a', 'b', 'y' and 'x', where 'x' can only be either zero or one. Your task is as follows: If 'x' is zero assign value 'a' to the variable 'y', if 'x' is one assign value 'b' to the variable 'y'. You are not allowed to use any conditional operator (including ternary operator).  Possible Solutions: 1. y = (1 - x) * a + x * b; 2.y = a ^ ((a ^ b) & (x))