Java中的作业调度问题

时间:2010-12-12 20:01:34

标签: java algorithm scheduling

我正在写一个问题来解决工作时间表,但我很难理解如何。

The Wood Shop积压了世界着名摇椅的订单(每张订单1把椅子)。有几个 制作手工Baber摇椅的步骤(例如,切割木片,组装,打磨,涂抹污渍, 并应用清漆)。

制作椅子所需的总时间为1周。但是,由于椅子的销售方式不同 地区和各种市场,每个订单的利润额可能不同。此外,还有一个相关的截止日期 每个订单。公司只有在截止日期前才能获利;否则,利润为0.

编写一个程序,确定最大化利润的订单的最佳时间表。输入文件将 包含一个或多个测试用例。测试用例中的第一行将包含一个整数n(0 n 1000),表示 待处理的订单数量。

n的值为0表示输入文件的结尾。 接下来的n行每行包含3个正整数。第一个整数i是订单号。

给定的所有订单号 测试用例是独一无二的第二个整数表示从现在到i截止日期的周数 日 订购。该 第三个整数表示如果满足i的截止日期,公司将获得的利润额 日 顺序。

我要求的是如何解决此问题的算法。

对于输入文件中的每个测试用例,输出文件应输出一行,报告由此产生的利润额 以最佳顺序完成订单。

Example Input File (sched.in)
7
1 3 40
2 1 35
3 1 30
4 3 25
5 1 20
6 3 15
7 2 10
4
3054 2 30
4099 1 35
3059 2 25
2098 1 40
0
Example Output File (sched.out)
100
70

4 个答案:

答案 0 :(得分:2)

有很多方法可以解决工作车间的问题。首先阅读维基百科条目,然后选择一本关于算法设计的好书。你的教授可能会推荐一个。我怀疑动态编程是解决这个问题的好方法,但也会有其他方法。

这是一个难题,所以不要指望一个简单的答案。许多人仍在研究如何有效地解决这个问题。

答案 1 :(得分:1)

您的问题的假设不完整。要知道你每周可以做多少把椅子。也许你可以一次完成所有工作。但是我们假设你只能做一个。解决方案是这样的。

根据Cameron Skinner的非常聪明的评论,我改变了对此的回答:

public class tarea
{         
    List<input> datas = new ArrayList<input>();

     class input
     {
         public int profit;
         public int deadline;
         public int index1;
         public int index2;
         public int sum() {return index1+index2;}
        /**
         * @param profit
         * @param deadline
         */
        public input(int deadline, int profit)
        {
            super();
            this.profit = profit;
            this.deadline = deadline;
        } 

     }


     public void readData1()
     {
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(1,1));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
         this.datas.add(new input(10,1000));
     }


     public void readData2()
     {/*
         3 40
         2 1 35
         3 1 30
         4 3 25
         5 1 20
         6 3 15
         7 2 10 */

         this.datas.add(new input(3,40));
         this.datas.add(new input(1,35));
         this.datas.add(new input(1,30));
         this.datas.add(new input(3,25));
         this.datas.add(new input(1,20));
         this.datas.add(new input(3,15));
         this.datas.add(new input(2,10));
     }

     public void readData3()
     {/*
     2 30
     4099 1 35
     3059 2 25
     2098 1 40*/

         this.datas.add(new input(2,30));
         this.datas.add(new input(1,35));
         this.datas.add(new input(2,25));
         this.datas.add(new input(1,40));
     }



     @SuppressWarnings("unchecked")
    public void sortbyprofit(List<input> datas)
     {
         Collections.sort(datas, new Comparator() {

            public int compare(Object o1, Object o2)
            {
                if(((input)(o1)).profit < ((input)(o2)).profit)
                    return 1;
                else if(((input)(o1)).profit == ((input)(o2)).profit)
                    return 0;
                else return -1;
            }});
     }

     @SuppressWarnings("unchecked")
     public void sortbydeadline(List<input> datas)
      {
          Collections.sort(datas, new Comparator() {

             public int compare(Object o1, Object o2)
             {
                 if(((input)(o1)).deadline > ((input)(o2)).deadline)
                     return 1;
                 else if(((input)(o1)).deadline == ((input)(o2)).deadline)
                     return 0;
                 else return -1;
             }});
      }


     @SuppressWarnings("unchecked")
     public void sortbySum(List<input> datas)
      {
          Collections.sort(datas, new Comparator() {

             public int compare(Object o1, Object o2)
             {
                 if(((input)(o1)).sum() > ((input)(o2)).sum())
                     return 1;
                 else if(((input)(o1)).sum() == ((input)(o2)).sum())
                     return 0;
                 else return -1;
             }});
      }


    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {
        tarea tsk = new tarea();
        //tsk.readData1();
        //tsk.readData2();
        tsk.readData3();


        while (tsk.datas.size() > 0)
        {
            //sort by profit
            tsk.sortbyprofit(tsk.datas);
            int idx0 = 1;
            //assign index
            for (input data : tsk.datas)
            {
                data.index1 = idx0;
                idx0++;
            }

            //sort by deadline
            tsk.sortbydeadline(tsk.datas);
            int idx2 = 1;
            for (input data : tsk.datas)
            {
                data.index2 = idx2;
                idx2++;
            }

            //sort by sum and profit
            tsk.sortbySum(tsk.datas);

            List<input> tmpdatas = new ArrayList<input>();
            int valsum = tsk.datas.get(0).sum();
            for (input data : tsk.datas)
            {
                if (data.sum() == valsum)
                    tmpdatas.add(data);
            }            
            tsk.sortbyprofit(tmpdatas);

            //get the first one as result
            input thedata = tmpdatas.get(0);

            System.out.println("result ===> " + thedata.profit);

            tsk.datas.remove(thedata);
            tmpdatas = new ArrayList<input>();
            for (input data : tsk.datas)
            {
                data.deadline--;
                if (data.deadline > 0)
                    tmpdatas.add(data);
            }
            tsk.datas = tmpdatas;
        }


    }


}

答案 2 :(得分:1)

欢迎来到NP完整规划问题的精彩世界。一旦扩展,就无法在我们的生命周期中找到最佳解决方案。但这并不重要,你只需要在给定的时间内找到最佳解决方案(击败人类规划者和其他软件程序)。

不要自己编写这些算法(除非您是具有多年经验的专家)。使用专门解决这些问题的现成库,例如:

答案 3 :(得分:0)

好的,Java不是问题所在。考虑算法,而不是专注于语言。

这种“味道”就像有dynamic programming解决方案的东西,但是从这个方面我推断你是一个初学者,所以一个详尽的搜索可能更容易订单数量合理。在详尽的搜索中,您只需列出每个可能的订单并保存最有利可图的订单。