跳转到内容

GLPK/Java

来自维基教科书,自由的教科书

Java 是一种面向对象的应用程序编程语言。

GLPK for Java

[编辑 | 编辑源代码]
GLPK for Java 附带了一系列示例。GmplSwing.java演示了回调和终端输出重定向的使用。

GLPK for Java 使用 SWIG 为其 Java 语言绑定生成代码。此绑定在 GNU 通用公共许可证下发布。

GLPK for Java 可通过 Debian 包获取libglpk-java, 也可用于 Ubuntu。Windows 二进制文件作为 GLPK for Windows 项目的一部分提供。

Windows 和符合 POSIX 标准的系统(包括所有 Linux 发行版)的 Makefile 可用于在其他系统上手动构建。如果您选择此选项,则需要事先安装 GLPK 和 SWIG。

GLPK for Java 文件doc/glpk-java.pdf包含简短描述。实际示例可以在以下位置找到:examples/java目录。有关各个方法的使用,请参考doc/glpk.pdfGLPK 源代码发行版。

编译和运行

[编辑 | 编辑源代码]

以下是一个最小的 Java 类。将其保存为文件 Test.java

import org.gnu.glpk.GLPK;
public class Test {
  public static void main(String[] args) {
    System.out.println( GLPK.glp_version());
  }
}

然后在 64 位 Windows 下编译此类

"%JAVA_HOME%\bin\javac" -classpath "C:\Program Files\GLPK\glpk-4.47\w64\glpk-java.jar" Test.java

或在 Linux 下编译它

$JAVA_HOME/bin/javac -classpath /usr/local/share/java/glpk-java.jar Test.java

在 64 位 Windows 上运行结果文件

java -Djava.library.path="C:\Program Files\GLPK\glpk-4.47\w64" -classpath "C:\Program Files\GLPK\glpk-4.47\w64\glpk-java.jar";. Test

或在 Linux 上运行该文件(文件路径可能需要调整以匹配您的安装)

java -Djava.library.path=/usr/local/lib/jni \
-classpath /usr/local/share/java/glpk-java.jar:. \
Test

输出将是您的 GLPK 版本号,例如:4.47。

与 Eclipse 结合使用

[编辑 | 编辑源代码]
Eclipse 中需要的项目属性设置

要将 GLPK for Java 与 Eclipse 结合使用,需要将 GLPK for Java jar 库添加到项目属性中。此外,还需要在此设置本机 DLL 库的路径。(见截图)。

Java 线性优化包装器

[编辑 | 编辑源代码]

Java 线性优化包装器 为 GLPK for Java API 提供了一个更直观的接口。列和行可以通过名称和索引直接访问。

列的创建方法如下

Problem p = new Problem().
    setName("Cutting Stock");
// x(i,j) : x pieces of product j are cut from stock i
for (int i = 0; i < stock.length; i++) {
    for (int j = 0; j < product.length; j++) {
    p.column("x", i, j).
        type(Problem.ColumnType.INTEGER).
        bounds(0.0, null);
    }
}

行的创建和填充方法如下

// demand(j) = sum( x(i,j) )
for (int j = 0; j < product.length; j++) {
    p.row("demand", j).bounds(demand[j], demand[j]);
    for (int i = 0; i < stock.length; i++) {
        p.row("demand", j).
            add(1.0, "x", i, j);
    }
}

您可以使用 Subversion 下载代码

svn checkout http://www.xypron.de/svn/linopt/ linopt

在您的 Maven 项目中使用此库时,请在您的 pom.xml 中输入以下存储库和依赖项(根据需要调整版本号)。

    <repositories>
        <repository>
            <id>XypronRelease</id>
            <name>Xypron Release</name>
            <url>http://rsync.xypron.de/repository</url>
            <layout>default</layout>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>de.xypron.linopt</groupId>
            <artifactId>linopt</artifactId>
            <version>1.10</version>
        </dependency>
    </dependencies>

使用 Maven 进行测试时,可能需要指示 GLPK for Java 共享库(.so 或 .dll)的安装路径。

mvn clean install -DargLine='-Djava.library.path=/usr/local/lib/jni:/usr/lib/jni'

exec:java 目标可能需要在 MAVEN_OPTS 中指示 GLPK for Java 共享库的安装路径,例如

export MAVEN_OPTS="-Djava.library.path=/usr/local/lib/jni:/usr/lib/jni"
mvn exec:java

Java ILP 为多个线性规划求解器(包括 GLPK)提供 Java 接口。它是根据 GNU 宽通用公共许可证 (LGPL) 许可的。与 GLPK 的链接使用 GLPK for Java。

主页 http://javailp.sourceforge.net/ 提供了示例代码。根据主页,GLPK ≥ 4.43 受支持。

开发似乎已经停止。最后一次代码更新是在 2012-08-02。

OptimJ 是一种基于 Java 的建模语言和优化环境。OptimJ 可与多种商业和非商业求解器结合使用,包括 GLPK,并提供多种许可、免费下载和购买安排。OptimJ 来自法国巴黎的软件公司 Ateji

开发似乎已经停止。最新版本可追溯到 2011 年。

Java Native Access

[编辑 | 编辑源代码]

Java Native Access (JNA) 可用于从 Java 调用共享本机库。项目主页是 https://github.com/twall/jna

使用 JNA 存在以下缺点

  • GLPK 库中发生的错误将终止主进程。
  • 回调无法使用。

以下示例使用 JNA 显示 GLPK 库版本号。

// file GlpkVersion.java

import com.sun.jna.Library;
import com.sun.jna.Native;

public class GlpkVersion {
        /**
         * Interface of the GLPK library.
         */
        public interface Glpk extends Library {
                Glpk INSTANCE = (Glpk) Native.loadLibrary("glpk", Glpk.class);
                String glp_version();
        }

        public static void main(String[] args) {
                System.out.println(Glpk.INSTANCE.glp_version());
        }
}

使用以下命令编译和运行

javac -classpath /usr/share/java/jna.jar GlpkVersion.java
java -classpath .:/usr/share/java/jna.jar GlpkVersion

根据您的 JNA 安装路径调整类路径。

过时的接口

[编辑 | 编辑源代码]

GLPK 3.3 提供了由 Yuri Victorovich 编写的 Java 语言绑定。此绑定在版本 4.7 中从官方 GLPK 发行版中删除,因为当时还没有 GNU GPL 兼容的 Java 实现。现在第三方项目为 GLPK 提供了 Java 绑定。

Björn Frank 发布了 GLPK 4.8 Java 接口。它不再维护,也不能与当前版本的 GLPK 结合使用。特别是,用户报告称在 64 位 Linux 系统上部署时,浮点运算存在错误。

华夏公益教科书