Python+cplex运筹优化学习笔记(一)

Python+cplex运筹优化学习笔记(一)

前言

首先呢,说明一下,本文只是自己在学习过程中运用到的例子,然后规整总结一下,随便写写自己所做的一些笔记。小白学习,有不对的地方还望大家批评指正。

1、例子介绍

# The MIP problem solved in this example is:
#
#   object(目标函数):Maximize  x1 + 2 x2 + 3 x3 + x4

#   Subject to(约束):
#    r1:  - x1 +   x2 + x3 + 10 x4 <= 20
#    r2:    x1 - 3 x2 + x3         <= 30
#    r3:           x2      - 3.5x4  = 0

#   Bounds(决策变量范围):
#     0 <= x1 <= 40
#     0 <= x2
#     0 <= x3
#     2 <= x4 <= 3
#   Integers(x4为整数):
#      x4

2.代码详解

import cplex
from cplex.exceptions import CplexError

# 首先实现定义各参数,包括变量和变量约束等
# 用来在之后方便地添加到优化器里面

# obj 指的是objective 意为目标,
# 也就是要优化的目标(函数x1 + 2 x2 + 3 x3 + x4 的最大值)的系数参数
my_obj = [1.0, 2.0, 3.0, 1.0]

# ub Upper Bound,上界,分别表示x1,x2,x3,x4的上界,infinity就是无穷大
#一个决策变量有三个主要属性定义:类型;上界;下界
# (计算机类无穷大是有穷的,所以这个数可以事先修改为一个很大的数如 cplex.infinity = 2147483647
my_ub = [40.0, cplex.infinity, cplex.infinity, 3.0]

# lb Lower Bound,下界,同上理
my_lb = [0.0, 0.0, 0.0, 2.0]

# 变量类型,详见https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.cplex.help/refpythoncplex/html/cplex._internal._subinterfaces.VarTypes-class.html
# ctrlF搜索Class Variables即可
# 分别表示4各变量的变量类型,C表示Continuous 连续值(浮点数),I表示Integer
# 变量类型: 连续的 = 'C'  二元的 = 'B'  	整数 = 'I'  	semi_integer = 'N' 	semi_continuous = 'S'
my_ctype = "CCCI"

# 给4个变量起个名字
my_colnames = ["x1", "x2", "x3", "x4"]

# 约束规则
# rows是约束集的左值,数组类型
# 每一个元素为一条约束规则,也为一个数组类型,包含2个元素,前者为约束变量的名称列表,后者为系数关系
my_rows = [[["x1", "x2", "x3", "x4"], [-1.0, 1.0, 1.0, 10.0]],
           [["x1", "x2", "x3"], [1.0, -3.0, 1.0]],
           [["x2", "x4"], [1.0, -3.5]]]

# rhs是约束规则集的右值
my_rhs = [20.0, 30.0, 0.0]

# 约束规则集的左右值关系,详见https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.cplex.help/refcallablelibrary/cpxapi/getsense.html
# L表示小于等于,E表示等于
my_sense = "LLE"

# 给各条约束规则起名字
my_rownames = ["r1", "r2", "r3"]

try:
    # 实例化一个cplex优化器
    prob = cplex.Cplex()

    # 求解的目标为目标函数的最大值
    prob.objective.set_sense(prob.objective.sense.maximize)

    # 添加变量:变量在目标函数里的系数,变量的上下界,变量类型,名称
    prob.variables.add(obj=my_obj, lb=my_lb, ub=my_ub, types=my_ctype,
                       names=my_colnames)

    # 添加约束:约束左值,等式/不等式符号,右值,名称
    prob.linear_constraints.add(lin_expr=my_rows, senses=my_sense,
                                rhs=my_rhs, names=my_rownames)

    # 求解
    prob.solve()

    # 显示最优情况下的变量值
    x = prob.solution.get_values()
    print("目标:",x)

    # 显示最优情况下的目标值
    objective_value = prob.solution.get_objective_value()
    print('objective_value:',objective_value)


except CplexError as exc:
    print("exc:",exc)


3.总结

以上就是本次例子学习的整个学习过程,初次接触,很多地方理解的都不是很正确。

4.引用

CPLEX Python入门–从简单的CplexPythonAPI详解到简单的DoCplex建模

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值