ortools

 

https://www.5axxw.com/questions/content/pblw0t

最为重要:
https://bbs.huaweicloud.com/blogs/167519
https://blog.csdn.net/weixin_42608414/article/details/110447228
https://blog.csdn.net/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://stackoom.com/question/3rCz0/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8or-tools%E4%BB%85%E4%BD%BF%E7%94%A8%E4%B8%80%E4%B8%AA%E6%95%B4%E6%95%B0%E5%8F%98%E9%87%8F%E6%9D%A5%E8%AE%A1%E7%AE%97argmax

 

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值