流水作业调度问题分析过程比较复杂,不过网上可以搜到一大片,基本相同,但普遍都没有对应动态规划的编码。这里对于原理分析就不进行赘述,直接上动态规划解法的代码。

package test;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by saishangminzhu on 2018/12/5.
 */
public class FlowShopScheduling {
    public static void main(String[] arg) {
        new FlowShopScheduling().start();
    }

    /**
     * T(N,0)=min{ai+T(N-{i},bi)}
     * T(S,t)=min{ai+T(S-{i},bi+max{t-ai,0})}
     */
    public void start(){
        int result=0;
        List<Task> taskList=new ArrayList<>();
        taskList.add(new Task("J0",2,5));
        result=methodT(taskList,0);
        System.out.println(result);
        taskList.add(new Task("J1",4,2));
        result=methodT(taskList,0);
        System.out.println(result);
        taskList.add(new Task("J2",3,3));
        result=methodT(taskList,0);
        System.out.println(result);
        taskList.add(new Task("J3",6,1));
        result=methodT(taskList,0);
        System.out.println(result);
        taskList.add(new Task("J4",1,7));
        result=methodT(taskList,0);
        System.out.println(result);
    }

    /**
     * 求列表的最小值
     * @param list
     * @return
     */
    public int min(List<Integer> list){
        int min=list.get(0);
        for (int i=1;i<list.size();i++){
            if (min>list.get(i)){
                min=list.get(i);
            }
        }
        return min;
    }

    /**
     * 任务i对应的T方法
     * @param taskList
     * @param t
     * @param taski
     * @return
     */
    public int methodTi(List<Task> taskList,int t,Task taski){
        List<Task> taskListNotTaski=new ArrayList<>();
        taskListNotTaski.addAll(taskList);
        taskListNotTaski.remove(taski);
        if (taskListNotTaski.size()==0){
            return taski.getA()+taski.getB()+max(t-taski.getA(),0);
        }
        int result=taski.getA()+methodT(taskListNotTaski,taski.getB()+max(t-taski.getA(),0));
        return result;
    }

    /**
     * 主方法T
     * @param taskList
     * @param t
     * @return
     */
    public int methodT(List<Task> taskList,int t){
        List<Integer> resultList=new ArrayList<>();
        for (Task task:taskList){
            resultList.add(methodTi(taskList,t,task));
        }
        return min(resultList);
    }

    /**
     * 求两数的最大值
     * @param a
     * @param b
     * @return
     */
    public int max(int a,int b){
        return a>b==true?a:b;
    }

}
class Task{
    private String name;
    private int a;
    private int b;

    public Task(String name, int a, int b) {
        this.name = name;
        this.a = a;
        this.b = b;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }
}