【求解器】| Java调用CPLEX求解MIP设置初始解

【求解器】| Java调用CPLEX求解MIP设置初始解

作者:刘兴禄,清华大学,清华大学深圳国际研究生院,清华-伯克利深圳学院,博士在读

用到的函数

  • addMIPStart(IloNumVar[] vars, double[] values)
    在这里插入图片描述

具体案例

考虑下面一个非常简单的整数规划模型

max ⁡ ∑ i = 1 10 x i s . t . x i ⩽ 1 , ∀ i = 1 , ⋯   , 10 , 0 ⩽ x i ⩽ 100 , ∀ i = 1 , ⋯   , 10 , x i ∈ Z , ∀ i = 1 , ⋯   , 10. \begin{aligned} \max \quad &\sum_{i=1}^{10} x_i \\ s.t. \quad& x_i \leqslant 1, && \forall i = 1, \cdots, 10, \\ &0 \leqslant x_{i} \leqslant 100,&& \forall i = 1, \cdots, 10, \\ &x_{i} \in \mathbb{Z}, && \forall i = 1, \cdots, 10. \end{aligned} maxs.t.i=110xixi1,0xi100,xiZ,i=1,,10,i=1,,10,i=1,,10.

下面是具体的代码中,我们设置 x i = 1 , ∀ i = 1 , ⋯   , 10 x_i = 1, \forall i = 1, \cdots, 10 xi=1,i=1,,10.

/*
 author: Liu Xinglu 
 institute: Tsinghua University
 date: 2023-3-16
*/

package Test;

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

public class Main {
	public static void main(String[] args) throws IloException {
		int num = 10;
		IloCplex cplex = new IloCplex();
		IloNumVar[] x = new IloNumVar[num];
		double[] initSol = new double[num]; 
		
		
		for(int i = 0; i < num; i++) {
//			x[i] = cplex.numVar(0, 10000);
			x[i] = cplex.intVar(0, 10000);
			initSol[i] = 1.0;
		}
		
		IloNumExpr obj = cplex.numExpr();
		for(int i = 0; i < num; i++) {
			obj = cplex.sum(obj, x[i]);
		}
		
		cplex.addMaximize(obj);
		
		for(int i = 0; i < num; i++) {
			IloNumExpr expr = cplex.numExpr();
			expr = cplex.sum(expr, x[i]);
			cplex.addLe(expr, 1);
		}
		
		
		cplex.addMIPStart(x, initSol);
		cplex.exportModel("MyTestModel.lp");
		cplex.solve();
		System.out.println(cplex.getObjValue());
	}
}

运行结果如下

1 of 1 MIP starts provided solutions.
MIP start 'm1' defined initial solution with objective 10.0000.
Tried aggregator 1 time.
MIP Presolve eliminated 10 rows and 10 columns.
All rows and columns eliminated.
Presolve time = 0.00 sec. (0.00 ticks)

Root node processing (before b&c):
  Real time             =    0.00 sec. (0.02 ticks)
Parallel b&c, 16 threads:
  Real time             =    0.00 sec. (0.00 ticks)
  Sync time (average)   =    0.00 sec.
  Wait time (average)   =    0.00 sec.
                          ------------
Total (root+branch&cut) =    0.00 sec. (0.02 ticks)
10.0

可以看到,设置成功了。日志中出现了下面的信息:

1 of 1 MIP starts provided solutions.
MIP start 'm1' defined initial solution with objective 10.0000.

这就说明设置初始解成功。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于流水车间调度问题的求解,可以使用python-mip库来实现。python-mip是一个基于MIP(Mixed Integer Programming,混合整数规划)的数学优化库,它可以用来决各种优化问题。 在流水车间调度问题,我们需要考虑各个工序的顺序和时间,以及机的可用性等因素,以最小化总的完成时间或最大化生产效率为目标。 以下是一个简单的示例代码,使用python-mip库来求解流水车间调度问题: ```python from mip import Model, xsum, minimize, ConstrsGenerator # 定义工序数量、机数量和工序时间 num_jobs = 3 num_machines = 2 job_times = [[2, 3], [4, 2], [3, 1]] # 创建模型 m = Model() # 创建变量 x = [[m.add_var(var_type='B') for _ in range(num_machines)] for _ in range(num_jobs)] # 创建约束条件 for j in range(num_jobs): m.add_constr(xsum(x[j][k] for k in range(num_machines)) == 1) # 每个工序只能在一个机上执行 for k in range(num_machines): m.add_constr(xsum(x[j][k] * job_times[j][k] for j in range(num_jobs)) <= 8) # 每个机的总执行时间不能超过8 # 定义目标函数 m.objective = minimize(xsum(x[j][k] * job_times[j][k] for j in range(num_jobs) for k in range(num_machines))) # 求解模型 m.optimize() # 输出结果 print('Optimal schedule:') for j in range(num_jobs): for k in range(num_machines): if x[j][k].x >= 0.99: print(f'Job {j+1} on machine {k+1}') ``` 在上述代码,我们首先定义了工序数量、机数量和每个工序在每台机上的执行时间。然后创建模型,并创建变量和约束条件。最后定义目标函数为最小化总的执行时间,并求解模型。 这是一个简单的示例,实际的流水车间调度问题可能更加复杂,需要根据具体情况进行调整和扩展。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值