docplex python入门实例,学习资源
docplex python入门实例,学习资源
1. docplex学习资源
- 个人感觉docplex的语言对于python更友好
- IBM® Decision Optimization CPLEX® Modeling for Python: 这是docplex官方网站,提供了很多学习资源,下图标注了里面一些有用的链接
其中新手入门一个建模实例推荐子链接Creating a MP model in a nutshell, 里面详细介绍了如何在Jupyter notebook里面建立一个完整的线性规划模型,也可以在Pycharm中迁移。
下面是我个人应用的一个建模实例,大家可以关注一下解决冲突约束的代码部分,在别的博文中提到的较少。当然我的方法也比较简单,感觉还不是最佳方案。
2. 建模实例
b
a
p
b_a^p
bap: path-link相关矩阵
B
B
B的元素,矩阵的行对应path,列对应link
3. 代码
from docplex.mp.model import Model
from docplex.mp.conflict_refiner import ConflictRefiner
from docplex.mp.conflict_refiner import ConflictRefinerResult
import numpy as np
# 构建路径-路段相关矩阵
path = 20
link = 20
relevance = np.zeros((path,link))
# list记录每条path对应的link序列,list[i]表示第i条path
list = [[1,11,14,18,20],
[2,35,14,18,20],
[2,36,20],
[1,11,14,19,31],
[1,11,15,29,31],
[1,12,25,29,31],
[1,12,26,37],
[2,35,14,19,31],
[2,35,15,29,31],
[1,11,14,18]]
for i in range(path):
for j in list[i]:
relevance[i][j-1]=1
print(relevance)
# 定义模型变量下标
links = [i for i in range(1,link+1)]
# 定义模型类型
mdl = Model('IP')
# 定义变量
x = mdl.binary_var_dict(links, name='x')
print(x[1]) # 注意,x[1]=x_1, 而不是x[0]=x_1
# 定义目标函数
mdl.minimize(mdl.sum(x[j] for j in links))
# 定义约束函数
num = 1 # 约束下标
for i in range(path):
for k in range(i+1,path):
mdl.add_constraint(mdl.sum(x[j + 1] * abs(relevance[i, j] - relevance[k, j]) for j in range(link)) >= 1, 'c' + str(num))
num+=1
for i in range(path):
mdl.add_constraint(mdl.sum(x[j+1] * relevance[i, j] for j in range(link)) >= 1, 'c' + str(num))
num+=1
# 检查冲突约束,返回conflicts
conflicts = ConflictRefiner().refine_conflict(mdl)
result = ConflictRefinerResult(conflicts)
result.display()
# # 移除冲突约束,具体情况由上一步检查结果决定
# list = ['c11','c14'] # 手动输入(目前没找到其他方法)
# for item in list:
# mdl.remove_constraint(item)
# 求解模型
solution = mdl.solve()
print(solution)