JAVA spring boot中使用google的ortools(算法包)

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、至此问题解决,感谢一下努力的自己,奖励个鸡腿,<(^-^)> 我最棒

奥,对了,今天冬至,大家别忘了吃饺子,可不要冻耳朵哦~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值