https://www.5axxw.com/questions/content/pblw0t
最为重要:
https://bbs.huaweicloud.com/blogs/167519
https://blog.youkuaiyun.com/weixin_42608414/article/details/110447228
https://blog.youkuaiyun.com/weixin_42608414/article/details/109556196
https://developers.google.cn/optimization/install/java/source_windows?hl=zh-tw
https://github.com/google/or-tools/blob/stable/ortools/sat/samples/SimpleSatProgram.java
https://bbs.huaweicloud.com/blogs/195974
https://github.com/google/or-tools/blob/stable/ortools/sat/samples/SolveAndPrintIntermediateSolutionsSampleSat.java
https://developers.google.cn/optimization/install/java/source_windows?hl=zh-tw
https://github.com/google/or-tools/blob/stable/ortools/sat/samples/SimpleSatProgram.java
https://zhuanlan.zhihu.com/p/55869908
CpModel model = new CpModel();
T [][] jobs_data=new T[][]{{new T(0,3),new T(1,2),new T(2,2)},
{new T(0,2),new T(2,1),new T(1,4)},
{new T(1,4),new T(2,3)}};
//流水线数量,一个machine可以任务一个班级
int machinesCount = 0;
//最长的用时
int horizon = 0;
//job,可以认为:job==teacher
for(T[] job:jobs_data){
for(T task : job){
if(task.machine>machinesCount){
machinesCount = task.machine;
horizon+=task.span;
}
}
}
machinesCount = machinesCount+1;
TaskType[][] allTasks = new TaskType[3][3];
List<IntervalVar>[] machineToIntervals = new List[3];
int machine = 0;
int duration = 0;
String suffix = null;
List<IntVar> ends = new ArrayList<>();
for(int j=0;j<jobs_data.length;j++){
for(int t=0;t<jobs_data[j].length;t++){
machine = jobs_data[j][t].machine;
duration = jobs_data[j][t].span;
suffix= "_"+j+"_"+t;
IntVar startVar = model.newIntVar(0, horizon, "start" + suffix);
IntVar endVar = model.newIntVar(0, horizon, "end" + suffix);
IntervalVar intervalVar = model.newIntervalVar(startVar,duration,endVar,"end" + suffix);
allTasks[j][t] = new TaskType(startVar,endVar,intervalVar);
machineToIntervals[machine].add(intervalVar);
ends.add(endVar);
}
}
for(List<IntervalVar> lst :machineToIntervals){
model.addNoOverlap((IntervalVar[])lst.toArray());
}
for(int j=0;j<jobs_data.length;j++) {
for (int t = 0; t < jobs_data[j].length; t++) {
model.addLessOrEqual(allTasks[j][t].start,allTasks[j][t+1].end);
}
}
IntVar objVar = model.newIntVar(0, horizon, "makespan");
model.addMaxEquality(objVar, (IntVar[])ends.toArray());
model.minimize(objVar);
// CpSolver();
CpSolver solver = new CpSolver();
CpSolverStatus status = solver.solve(model);
// Check that the problem has an optimal solution.
if (status != CpSolverStatus.OPTIMAL) {
System.err.println("The problem does not have an optimal solution!");
return;
}
// Instantiate the data problem.
final DataModel data = new DataModel();
int totalValue = 0;
for (int i = 0; i < data.numItems; ++i) {
totalValue = totalValue + data.bVals[i];
}
CpModel model = new CpModel();
IntVar[][] x = new IntVar[data.numItems][data.numBins];
for (int i = 0; i < data.numItems; ++i) {
for (int b = 0; b < data.numBins; ++b) {
x[i][b] = model.newIntVar(0, 1, "x_" + i + "_" + b);
}
}
// Main variables.
// Salary and bVal variables.
IntVar[] salary = new IntVar[data.numBins];
IntVar[] bVal = new IntVar[data.numBins];
for (int b = 0; b < data.numBins; ++b) {
salary[b] = model.newIntVar(0, data.binCapacities[b], "load_" + b);
bVal[b] = model.newIntVar(0, totalValue, "value_" + b);
}
// Links salary and bval with x.
int[] sizes = new int[data.numItems];
for (int i = 0; i < data.numItems; ++i) {
sizes[i] = data.salaries[i];
}
for (int b = 0; b < data.numBins; ++b) {
IntVar[] vars = new IntVar[data.numItems];
for (int i = 0; i < data.numItems; ++i) {
vars[i] = x[i][b];
}
model.addEquality(LinearExpr.scalProd(vars, data.salaries), salary[b]);
model.addEquality(LinearExpr.scalProd(vars, data.bVals), bVal[b]);
}
//How do I add my Constraints... obviously need to remove the each item in 1 bin code
// Each item can be in at most one bin.
// Place all items.
for (int i = 0; i < data.numItems; ++i) {
IntVar[] vars = new IntVar[data.numBins];
for (int b = 0; b < data.numBins; ++b) {
vars[b] = x[i][b];
}
model.addLessOrEqual(LinearExpr.sum(vars), 1);
}
// Maximize sum of load.
model.maximize(LinearExpr.sum(bVal));
CpSolver solver = new CpSolver();
CpSolverStatus status = solver.solve(model);
System.out.println("Solve status: " + status);
if (status == CpSolverStatus.OPTIMAL || status == CpSolverStatus.FEASIBLE) {
printSolution(data, solver, x, salary, bVal);
}