【难题解决】整数规划问题

一、问题

前情提要:实习中遇到了自动配板的最优化配置问题,在这里简单总结整理下。

具体描述:给定一次多元多项不等式,求满足条件的一组解。

举个例子,给定不等式:

6 x + 7 y + 8 z < = 15 6x+7y+8z<=15 6x+7y+8z<=15
0 < = x < = 2 0<=x<=2 0<=x<=2
0 < = y < = 1 0<=y<=1 0<=y<=1
0 < = z < = 1 0<=z<=1 0<=z<=1

在上述条件的约束下,求一组整数解,满足max { 6x+7y+8z }。

二、解决

2.1 方法1:Cplex工具求解

1、Cplex简介

Cplex是IBM公司开发一款商业版的优化引擎。当然也有免费版,不过有规模限制,不能求解规模过大问题。

2、优势

  • 解决一些非常困难的行业问题;
  • 求解速度非常快;
  • 提供超线性加速功能的优势。
    Cplex加持下,使得Matlab对于大规模问题及线性规划效率得到飞跃性提升。

3、安装

  • 包—百度云
    链接:https://pan.baidu.com/s/1AQZlSwxaYMmw4-ReXhl1vg
    提取码:6tm8

  • 安装步骤:略

4、Java调用CPLEX包进行计算

  • S1:新建工程,添加package。

  • S2:配置加载Cplex包
    1)右击项目build pathConfigure Build Path…
    1

    2)LibrariesAdd External JARS选择XX…\cplex\lib\cplex.jar
    2

    3)添加Cplex动态运行库。右击项目–>build path–>Configure Build Path…–> Libraries–> Native library location–>Edit–>XX…\cplex\bin\x64_win64–>Apply and Close
    3

  • S3:求解线性规划模型

		max x1+2x2+3x3
	s.t.
		-x1+x2+x3<=20
		x1-3x2+x3<=30
		0<=x1<=40
  • S4:完整代码实现
package com.dfh.test;

import ilog.cplex.IloCplex;
import ilog.concert.*;

public class TestCplex2 {
   

	public static void main(String[] args) {
   
//		max x1+2x2+3x3
//	s.t.
//		-x1+x2+x3<=20
//		x1-3x2+x3<=30
//		0<=x1<=40
		
//		1. 使用 IloCplex 类新建一个 cplex 类。
//		2. 使用 IloNumVar 定义求解变量。
//		3. 使用 addMaximize 或addMinimize 定义求解目标。
//		4. 使用 addLe 添加约束条件.
//		5. 使用 solve() 方法求解。
//		6. 使用 IloNumExpr 定义中间变量。		
		try {
   

	      IloCplex cplex = new IloCplex(); // creat a model
	      int[] lb = {
   0, 0, 0};
	      int[] ub = {
   400, Integer.MAX_VALUE, Integer.MAX_VALUE};
	      IloNumVar[] x = cplex.intVarArray(3, lb, ub);
	      
	      int[] objvals = {
   15, 16, 25};
	      cplex.addMaximize(cplex.scalProd(x, objvals));
	      cplex.addLe(cplex.scalProd(x, objvals), 2555);

	      if (cplex.solve()) {
   
	        cplex.output().println("Solution status = " + cplex.getStatus());
	        cplex.output()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值