JAVA spring boot中使用google的ortools(算法包)
1、Google 的ortools 的网站,里面有简单的使用和样例
https://developers.google.cn/optimization/install/java?hl=zh-cn
2、在pom.xml中加入google的ortools算法依赖
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-java</artifactId>
<version>9.7.2996</version>
</dependency>
3、需要在插件依赖中加入google的ortools算法依赖,必须加入此内容
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<requiresUnpack>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-linux-x86-64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-darwin-x86-64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-win32-x86-64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-linux-aarch64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-darwin-aarch64</artifactId>
</dependency>
</requiresUnpack>
</configuration>
</plugin>
4、在java代码中的使用,我用的是背包算法(SCIP),以下代码为样例且算法不做详细讲解
import com.google.ortools.Loader;
import com.google.ortools.linearsolver.MPConstraint;
import com.google.ortools.linearsolver.MPObjective;
import com.google.ortools.linearsolver.MPSolver;
import com.google.ortools.linearsolver.MPVariable;
public static void main(String[] args) {
Loader.loadNativeLibraries();
// [START solver]
// Create the linear solver with the SCIP backend.
MPSolver solver = MPSolver.createSolver("SCIP");
if (solver == null) {
System.out.println("Could not create solver SCIP");
return;
}
// [END solver]
// [START variables]
double infinity = java.lang.Double.POSITIVE_INFINITY;
// x and y are integer non-negative variables.
MPVariable x1 = solver.makeIntVar(1.0, infinity, "x1"); // Required=Yes
MPVariable x2 = solver.makeIntVar(0.0, infinity, "x2");
MPVariable x3 = solver.makeIntVar(0.0, infinity, "x3");
MPVariable x4 = solver.makeIntVar(0.0, infinity, "x4");
System.out.println("Number of variables = " + solver.numVariables());
// [END variables]
// [START constraints]
// -10*x1 -8*x2 <= -11 -- AI+AO
MPConstraint c0 = solver.makeConstraint(-infinity, -11, "c0");
c0.setCoefficient(x1, -10);
c0.setCoefficient(x2, -8);
c0.setCoefficient(x3, 0);
c0.setCoefficient(x4, 0);
// -10*x1 -8*x2 -8*x3 <= -22 -- AI+AO+DI =U+DI
MPConstraint c1 = solver.makeConstraint(-infinity, -22, "c1");
c1.setCoefficient(x1, -10);
c1.setCoefficient(x2, -8);
c1.setCoefficient(x3, -8);
c1.setCoefficient(x4, 0);
// -4*x1 -8*x4 <= -6 -- DO
MPConstraint c2 = solver.makeConstraint(-infinity, -6, "c2");
c2.setCoefficient(x1, -4);
c2.setCoefficient(x2, 0);
c2.setCoefficient(x3, 0);
c2.setCoefficient(x4, -8);
// -4*x1 -4*x2 <= -6 -- 4~20mA
MPConstraint c3 = solver.makeConstraint(-infinity, -6, "c3");
c3.setCoefficient(x1, -4);
c3.setCoefficient(x2, -4);
c3.setCoefficient(x3, 0);
c3.setCoefficient(x4, 0);
/*
// -1*x1 <= -1 -- Required
MPConstraint c4 = solver.makeConstraint(-infinity, -1, "c4");
c4.setCoefficient(x1, -1);
c4.setCoefficient(x2, 0);
c4.setCoefficient(x3, 0);
c4.setCoefficient(x4, 0);
*/
// x2 +x3 +x4 <= 5 -- total Count
MPConstraint c5 = solver.makeConstraint(-infinity, 5, "c5");
c5.setCoefficient(x1, 0);
c5.setCoefficient(x2, 1);
c5.setCoefficient(x3, 1);
c5.setCoefficient(x4, 1);
// -14*x1 -8*x2 -8*x3 -8*x4 <= -13 -- AI+AO+DI+DO
MPConstraint c6 = solver.makeConstraint(-infinity, -30, "c6");
c6.setCoefficient(x1, -14);
c6.setCoefficient(x2, -8);
c6.setCoefficient(x3, -8);
c6.setCoefficient(x4, -8);
System.out.println("Number of constraints = " + solver.numConstraints());
// [END constraints]
// [START objective]
// Min x + 10 * y. -- Value
MPObjective objective = solver.objective();
objective.setCoefficient(x1, 1000);
objective.setCoefficient(x2, 50);
objective.setCoefficient(x3, 20);
objective.setCoefficient(x4, 50);
objective.setMinimization();
// [END objective]
// [START solve]
final MPSolver.ResultStatus resultStatus = solver.solve();
// [END solve]
// [START print_solution]
if (resultStatus == MPSolver.ResultStatus.OPTIMAL) {
System.out.println("Solution:");
System.out.println("Objective value = " + objective.value());
System.out.println("x1 = " + x1.solutionValue());
System.out.println("x2 = " + x2.solutionValue());
System.out.println("x3 = " + x3.solutionValue());
System.out.println("x4 = " + x4.solutionValue());
} else {
System.err.println("The problem does not have an optimal solution!");
}
// [END print_solution]
// [START advanced]
System.out.println("\nAdvanced usage:");
System.out.println("Problem solved in " + solver.wallTime() + " milliseconds");
System.out.println("Problem solved in " + solver.iterations() + " iterations");
System.out.println("Problem solved in " + solver.nodes() + " branch-and-bound nodes");
// [END advanced]
}
5、遇到的问题
5.1、该算法在Windows上可以正常运行,但在Linux/mac上不能正常运行,报错的内容如下:
5.2、原因为:Spring boot打包后未加载到该依赖,在Spring boot 打包时,加上以下代码,就能加载到依赖,可以正常使用算法
<configuration>
<requiresUnpack>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-linux-x86-64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-darwin-x86-64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-win32-x86-64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-linux-aarch64</artifactId>
</dependency>
<dependency>
<groupId>com.google.ortools</groupId>
<artifactId>ortools-darwin-aarch64</artifactId>
</dependency>
</requiresUnpack>
</configuration>
5.3、至此问题解决,感谢一下努力的自己,奖励个鸡腿,<(^-^)> 我最棒
奥,对了,今天冬至,大家别忘了吃饺子,可不要冻耳朵哦~~