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

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

前言

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

1、 cplex和docplex

简单来说都是cplex的API,在python项目调用中,docplex更简洁,与python的接口更多一些,更加容易理解。以下内容都是基于docplex进行的。

2、例子

例子介绍
列子图解

2.1声明各参数:

优化问题就是针对特定目标、一组约束和一组决策变量的问题。
在上述优化例子中,n、m、a、c、l、u、b等都是输入参数,是已知的参数。
假设有10*5个决策变量xij,10行5列。


# 首先实现定义各参数,包括变量和变量约束等
import random
n = 10
m = 5
set_I = range(1, n+1)
set_J = range(1, m+1)
# 随意生成目标决策变量权值,设置为已知权值
c = {(i,j): random.normalvariate(0,1) for i in set_I for j in set_J}
# 随意生成条件决策变量权值,设置为已知权值
a = {(i,j): random.normalvariate(0,5) for i in set_I for j in set_J}
#l字典约束决策变量的下界
l = {(i,j): random.randint(0,10) for i in set_I for j in set_J}
#u字典约束决策变量的上界
u = {(i,j): random.randint(10,20) for i in set_I for j in set_J}
# 随机生成条件约束规则右值
b = {j: random.randint(0,30) for j in set_J}
# 此处random函数看  3.总结 处标注毕节


上述实现了对各参数、约束条件以及变量声明
有助于我们在下面方便添加到优化器中。

2.2导入运筹优化库

import docplex.mp.model as cpx
opt_model = cpx.Model(name="MIP Model")

2.3定义决策变量

在上一步,我们得到了名为opt_model的模型对象。接下来,我们就需要在其中添加决策变量。
值得注意的一点: 在python字典中储存决策变量是标准的,其中字典键是决策变量,值是决策变量对象。
(一个决策变量有三个主要属性定义:类型;上界;下界。本例将决策变量的类型默认为连续型。
注:变量类型:
连续的 = ‘C’
二元的 = ‘B’
整数 = ‘I’
semi_integer = ‘N’
semi_continuous = ‘S’)

#决策变量的定义
# if x is Continuous
x_vars  = 
{(i,j): opt_model.continuous_var(lb=l[i,j], ub= u[i,j],
                                 name="x_{0}_{1}".format(i,j)) 
for i in set_I for j in set_J}

# if x is Binary
x_vars  = 
{(i,j): opt_model.binary_var(name="x_{0}_{1}".format(i,j)) 
for i in set_I for j in set_J}

# if x is Integer
x_vars  = 
{(i,j): opt_model.integer_var(lb=l[i,j], ub= u[i,j],
                              name="x_{0}_{1}".format(i,j)) 
for i in set_I for j in set_J}

2.4实现约束条件

# <= constraints,小于等于
constraints = {j : 
opt_model.add_constraint(
ct=opt_model.sum(a[i,j] * x_vars[i,j] for i in set_I) <= b[j],
ctname="constraint_{0}".format(j))
    for j in set_J}

# >= constraints
constraints = {j : 
opt_model.add_constraint(
ct=opt_model.sum(a[i,j] * x_vars[i,j] for i in set_I) >= b[j],
ctname="constraint_{0}".format(j))
    for j in set_J}

# == constraints
constraints = {j : 
opt_model.add_constraint(
ct=opt_model.sum(a[i,j] * x_vars[i,j] for i in set_I) == b[j],
ctname="constraint_{0}".format(j))
    for j in set_J}

2.5实现目标函数

目标函数是一个线性表达。

objective = opt_model.sum(x_vars[i,j] * c[i,j] 
                          for i in set_I 
                          for j in set_J)

# for maximization(求最大值)             
opt_model.maximize(objective)

# for minimization(求最小值)
opt_model.minimize(objective)

2.6求解模型

# solving with local cplex
opt_model.solve()

# solving with cplex cloud
opt_model.solve(url="your_cplex_cloud_url", key="your_api_key")

2.7打印结果

# 打印得到的最小值
print(objective)
# 打印实现目标的决策变量值
print(x_vars)

3.总结

以上就是本次例子学习的整个学习过程,初次接触,很多地方理解的都不是很正确。
标注笔记:
random.random()# 用于生成一个0到1的随机符点数: 0 <= n < 1.0
random.uniform(a,b) # 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。
random.randint(a,b,size) # 用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b。size是表示生成总共多少个数。若size=2,则表示该数组里有2个元素。
random.randrange() # 从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, … 96, 98]序列中获取一个随机数
random.shuffle() # 用于将一个列表中的元素打乱

4.引用

https://zhuanlan.zhihu.com/p/124422566

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值