Cplex 参数笔记(Python API)

                                                                     Cplex 参数笔记(Python API)

最近一直做Cplex用于大规模实例的结果验证(与现有的算法和已经优化的算法进行对比);颇有一些感触,记录下来,以防遗忘。

首先是模型搭建:Cplex计算占内存极大,所以一定要把模型构建的最简单,变量能少则少,能用2个变量表示的,就不要用一堆向量来表示。约束条件越少越好(constraints memory = number of constraints(KB)),在写完后一定要看一下内存占用情况,否则就会出现几十G甚至上百G的占用,没有服务器的话,基本就可以直接GG了(当然,有服务器也不能这么乱用,毕竟时间还是越短越好,算法性能对比中运行时间也是很重要的一项)。

 

第二模型计算后,如果得到的结果不合理(包括无解/解越过限制条件)。那么就要重新检查自己的约束情况,看看是不是哪里出现了问题。如果实在找不出来1.可以写成LP文件,更方便检查;2.重新写一遍。

 

第三,解越过限制条件的处理方法:1.检查模型的约束条件;2.调整参数,这也是笔记想要重点讲的内容。(有不常用的以后再做更新)

参数设置中,可能常用的有以下几项:

Parameters

### 使用 CPLEX Python API 进行优化问题建模 CPLEX 是 IBM 开发的一个强大的优化工具,其支持多种编程语言接口,其中包括 Python 接口。通过 `cplex` 和 `docplex` 模块可以实现对复杂优化问题的建模和求解。 #### 1. 基于 `cplex` 模块的核心功能 `cplex` 模块提供了低级别的 API 来构建和解决优化问题。核心类为 `Cplex`,它允许用户定义目标函数、约束条件以及变量属性等[^1]。以下是主要的功能分类: - **变量管理**: 变量可以通过 `variables` 成员来添加或修改。 ```python from cplex import Cplex problem = Cplex() # 添加连续型变量 problem.variables.add(names=["x1", "x2"], obj=[1, 2], lb=[0, 0]) ``` - **线性约束**: 线性约束可通过 `linear_constraints` 方法设置。 ```python # 添加线性约束 x1 + x2 <= 5 problem.linear_constraints.add( lin_expr=[[["x1", "x2"], [1, 1]]], senses=["L"], rhs=[5] ) ``` - **二次约束**: 对于涉及平方项的约束,可使用 `quadratic_constraints`。 ```python # 添加二次约束 x1^2 + x2^2 <= 9 quad_constraint = { "lin_expr": [["x1", "x2"], [0, 0]], "quad_expr": [[["x1", "x2"], ["x1", "x2"]], [1, 1]], "sense": "L", "rhs": 9, } problem.quadratic_constraints.add(**quad_constraint) ``` - **目标函数设定**: 默认情况下,`obj` 参数用于指定目标函数系数。 ```python problem.objective.set_sense(problem.objective.sense.maximize) # 设置最大化目标 ``` #### 2. DoCplex 的高级抽象 虽然 `cplex` 模块提供灵活控制的能力,但对于初学者来说可能不够直观。因此推荐使用更高层次的封装库 `docplex.mp.model.Model`,它可以简化建模过程[^3]。 ##### 示例代码展示 下面是一个完整的例子,演示如何利用 Docplex 构造并求解一个简单的线性规划问题: ```python from docplex.mp.model import Model # 创建模型实例 model = Model(name='simple_lp') # 定义决策变量 x = model.continuous_var(name='x', lb=0) y = model.continuous_var(name='y', lb=0) # 设定目标函数 (Maximization Problem) model.maximize(x + 2 * y) # 加入约束条件 constraints = [ x + y <= 5, # 总资源不超过5单位 x >= 1 # 至少生产一件产品X ] for constraint in constraints: model.add_constraint(constraint) # 执行求解操作 solution = model.solve() if solution: print(f'Optimal Solution Found:') print(f'Objective Value: {solution.objective_value}') print(f'Decision Variables:\n{x.name}={x.solution_value}\n{y.name}={y.solution_value}') else: print('No feasible solution found.') ``` #### 3. 结果导出与分析 一旦完成计算,通常还需要进一步处理结果以便后续可视化或者存储至文件中。这里给出一段基于 Pandas 导出 CSV 文件的例子[^3]: ```python import pandas as pd # 将所有变量及其取值存入DataFrame结构 var_dict = {v.name: v.solution_value for v in model.iter_variables()} df = pd.DataFrame(list(var_dict.items()), columns=['Variable Name', 'Value']) # 输出到本地磁盘上的CSV文档 output_path = './results/opt_results.csv' df.to_csv(output_path, index=False) print(f'Result saved at path:{output_path}.') ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值