本文章参考gurobi使用系列之一——gurobi+Python的实例使用(简单整数规划)_过尽的风的博客-CSDN博客
进行编写,该文章描述了使用gurobi+python的算例,本文章针对相同问题使用Cplex求解器进行求解。
其他示例:
Cplex +Python下的虚拟电厂智能调度实例(附代码)-CSDN博客
(多用户)Cplex +Python下的虚拟电厂智能调度实例(附代码)-CSDN博客
本代码使用docplex进行编写,如果没有docplex,使用以下命令进行安装
pip install docplex
问题描述:
一、模型
变量:
创建0,1变量,表示时段i在影厅j是否播放电影k
参数:
表示时段i电影k的上座率
表示电影k在影厅j满座时的收益
约束条件:
1、每部电影至少放映一次
2、每个影厅每个时段只能放映一部电影
目标函数
如何排片全天的收益最大
二、Python代码
from docplex.mp.model import Model
# 8部电影
# 7个影厅
# 8个时段
I = list(range(8)) # 时段
J = list(range(7)) # 影厅
K = list(range(8)) # 电影
seat_j = [118, 86, 116, 85, 156, 142, 156]
# 一行为一个影厅,一列为一部电影
price_jk = [[60, 60, 65, 60, 65, 90, 60, 65],
[65, 65, 85, 75, 60, 75, 85, 80],
[60, 70, 75, 80, 75, 80, 80, 75],
[65, 65, 80, 75, 80, 75, 75, 80],
[60, 65, 65, 60, 75, 80, 80, 75],
[60, 65, 65, 80, 75, 75, 80, 75],
[60, 60, 75, 80, 75, 70, 60, 75]]
# 一行为一个时段,一列为一部电影
rate_ik = [[0.50, 0.55, 0.45, 0.50, 0.60, 0.46, 0.55, 0.45],
[0.42, 0.43, 0.41, 0.43, 0.45, 0.30, 0.53, 0.36],
[0.58, 0.63, 0.67, 0.64, 0.70, 0.64, 0.54, 0.57],
[0.62, 0.67, 0.70, 0.65, 0.75, 0.64, 0.53, 0.66],
[0.65, 0.65, 0.73, 0.68, 0.75, 0.74, 0.67, 0.72],
[0.66, 0.69, 0.78, 0.78, 0.78, 0.75, 0.74, 0.70],
[0.67, 0.92, 0.87, 0.87, 0.75, 0.59, 0.68, 0.68],
[0.67, 0.92, 0.87, 0.87, 0.75, 0.59, 0.68, 0.68]]
# 计算满座的票房二维列表,lt_all
all_jk = [[0 for col in K] for row in J]
for j in J:
for k in K:
all_jk[j][k] = price_jk[j][k] * seat_j[j]
# 创建模型
m = Model(name="ass_mov")
# 创建变量.第i个时段在第j个影厅放映第k部电影
x = m.binary_var_cube(I, J, K, name="x")
# 创建目标函数
m.maximize(m.sum(x[i, j, k] * rate_ik[i][k] * all_jk[j][k]
for i in I for j in J for k in K))
# 创建约束条件
# 每部电影至少放映一次
for k in K:
m.add_constraint(m.sum(x[i, j, k] for i in I for j in J) >= 1)
# 每个时段每个影厅只能放映一部电影
for i in I:
for j in J:
m.add_constraint(m.sum(x[i, j, k] for k in K) == 1)
# 求解规划模型
m.solve()
# 输出结果
result = [[0 for col in J] for row in I]
# 得到排片矩阵
for i in I:
for j in J:
for k in K:
if x[i, j, k].solution_value == 1:
result[i][j] = k + 1
# 得到最大收益值
max_get = sum(
x[i, j, k].solution_value * rate_ik[i][k] * all_jk[j][k]
for i in I for j in J for k in K
)
# 打印最大收益值,和排片矩阵
print('最大收益为:', max_get)
print('最佳排片方法:')
print('\n影厅j|', J)
print('-'*28)
for idx, l in enumerate(result):
print(f'时段{idx}|', l)