约束满足问题(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!");
}
}
}