约束满足问题(Constraint Satisfaction Problem, CSP)的Java实现(五)工作安排问题Job constraint problem

约束满足问题(Constraint Satisfaction Problem, CSP)的Java实现(五)工作安排问题Job constraint problem

工作约束定义

import java.util.List;

public class JobShopConstraint extends AbstractConstraint<String,Integer>{
    int durationTime;
    int durationTime1;
    int durationTime2;
    String type = "default";
    public JobShopConstraint(List<String> vars, int time, String targetType){
        variableList = vars;
        durationTime = time;
        type = targetType;
    }

    public JobShopConstraint(List<String> vars, int time1, int time2, String targetType){
        variableList = vars;
        durationTime1 = time1;
        durationTime2 = time2;
        type = targetType;
    }

    @Override
    boolean satisfied(AbstractAssignment<String,Integer> assignment){
        String day1 = variableList.get(0);
        String day2 = variableList.get(1);
        if(!assignment.hasVariable(day1)||(!assignment.hasVariable(day2))){
            return true;
        }
        int T1 = assignment.getDomain(variableList.get(0));
        int T2 = assignment.getDomain(variableList.get(1));
        if(type.equals("default")){
            return T1 + durationTime <= T2;
        }
        else{
            return (T1 + durationTime1 <= T2) || (T2 + durationTime2 <= T1);
        }
    }
}

测试类

import java.util.*;

public class JobShopConstraintTest {
    public static void main(String[] args) throws Exception {
        List<String> variables = new ArrayList<>(Arrays.asList("J1", "J2", "J3", "J4", "J5", "J6", "J7"));
        Map<String, List<Integer>> domains = new HashMap<>();

        for(int i=0;i<variables.size();i++){
            domains.put(variables.get(i), new ArrayList<>());
            for(int j=0;j<5;j++){
                domains.get(variables.get(i)).add(j+i*4);
            }
        }

        BaseCSP<String, Integer> csp = new BaseCSP<>(variables, domains);

        csp.addConstraint(new JobShopConstraint(new ArrayList<String>(Arrays.asList("J1","J2")), 5, "default"));
        csp.addConstraint(new JobShopConstraint(new ArrayList<String>(Arrays.asList("J2","J3")), 5, "default"));
        csp.addConstraint(new JobShopConstraint(new ArrayList<String>(Arrays.asList("J3","J4")), 5, "default"));
        csp.addConstraint(new JobShopConstraint(new ArrayList<String>(Arrays.asList("J4","J5")), 5, "default"));
        csp.addConstraint(new JobShopConstraint(new ArrayList<String>(Arrays.asList("J5","J6")), 5, "default"));
        csp.addConstraint(new JobShopConstraint(new ArrayList<String>(Arrays.asList("J6","J7")), 5, "default"));


        AbstractAssignment<String, Integer> ass = csp.backTrackingSearch();
        if (ass != null) {
            ass.display();
        }
        else{
            System.out.println("No solution!");
        }
    }
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class JobTestClass {
    public static void main(String[] args) throws Exception {
        String fileName = "Job.txt";
        File file = new File(fileName);
        List<String> fileString = new ArrayList<>();
        try {
            Scanner sc = new Scanner(file);
            while (sc.hasNextLine()) {
                fileString.add(sc.nextLine());
            }
            sc.close();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if(fileString.size()==0){
            System.out.println("NO DATA FOUND IN THE FILE!");
            return;
        }
        List<String> variables = new ArrayList<>();
        Map<String,Integer> durations = new HashMap<>();
        List<Integer> domains = new ArrayList<>();
        Map<String, List<Integer>> variableDomains = new HashMap<>();
        List<JobShopConstraint> jobShopConstraints = new ArrayList<>();
        int start = 0;
        int maxDuration = 0;
        boolean startGetOtherConstraints = false;
        for(int i=1;i<fileString.size();i++){
            if(i==1){
                variables.addAll(Arrays.asList(fileString.get(i).split(" ")));
            }
            else if(!startGetOtherConstraints){
                List<String> wordList = new ArrayList<>(Arrays.asList(fileString.get(i).split(" ")));
                if(!variables.contains(wordList.get(0))){
                    int temp = 0;
                    try {
                        temp = Integer.parseInt(wordList.get(0));
                    }
                    catch (NumberFormatException e){
                        e.printStackTrace();
                    }
                    maxDuration = temp;
                    startGetOtherConstraints = true;
                    //update variable domains
                    for(String variable:variables){
                        variableDomains.put(variable,new ArrayList<>());
                        for(int k=start;k<=maxDuration-durations.get(variable);k++){
                            variableDomains.get(variable).add(k);
                        }
                    }
                }
                if(!startGetOtherConstraints){
                    int temp = 0;
                    try {
                        temp = Integer.parseInt(wordList.get(1));
                    }
                    catch (NumberFormatException e){
                        e.printStackTrace();
                    }
                    durations.put(wordList.get(0), temp);
                }
            }
            else{
                List<String> wordList = new ArrayList<>(Arrays.asList(fileString.get(i).split(" ")));
                if(wordList.get(1).equals("before")){
                    JobShopConstraint constraint = new JobShopConstraint(new ArrayList<>(Arrays.asList(wordList.get(0), wordList.get(2))),
                            durations.get(wordList.get(0)), "default");
                    jobShopConstraints.add(constraint);
                }
                else{
                    JobShopConstraint constraint = new JobShopConstraint(new ArrayList<>(Arrays.asList(wordList.get(0), wordList.get(2))),
                            durations.get(wordList.get(0)), durations.get(wordList.get(2)), "disjoint");
                    jobShopConstraints.add(constraint);
                }
            }
        }
//        BaseCSP<String,Integer> csp = new BaseCSP<>(variables, variableDomains);
//        SimpleCSP<String,Integer> csp = new SimpleCSP<>(variables, variableDomains);
        ClassicCSP<String,Integer> csp = new ClassicCSP<>(variables, variableDomains);
        csp.addOderAlgorithm(new MRV<>());
        csp.addOderAlgorithm(new DegreeHeuristic<>());
        csp.addInferenceAlgorithm(new AC3<>());
        for(JobShopConstraint jobShopConstraint:jobShopConstraints){
            csp.addConstraint(jobShopConstraint);
        }
        AbstractAssignment<String, Integer> ass = csp.backTrackingSearch();
        if(ass!=null){
            ass.display();
        }
        else{
            System.out.println("No solution!");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值