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() # 用于将一个列表中的元素打乱