Cplex +Python下的整数规划实例(附代码)

本文章参考gurobi使用系列之一——gurobi+Python的实例使用(简单整数规划)_过尽的风的博客-CSDN博客

进行编写,该文章描述了使用gurobi+python的算例,本文章针对相同问题使用Cplex求解器进行求解。

其他示例:

Cplex +Python下的虚拟电厂智能调度实例(附代码)-CSDN博客

(多用户)Cplex +Python下的虚拟电厂智能调度实例(附代码)-CSDN博客


本代码使用docplex进行编写,如果没有docplex,使用以下命令进行安装

pip install docplex

问题描述:

一、模型

变量:

创建0,1变量x_{ijk},表示时段i在影厅j是否播放电影k

参数:

rate_{ik}表示时段i电影k的上座率

all_{jk}表示电影k在影厅j满座时的收益

约束条件:

1、每部电影至少放映一次

        \displaystyle \sum_{i\in I,j\in J } x_{ijk}\geq 1,\forall k\in K

2、每个影厅每个时段只能放映一部电影

\displaystyle \sum_{k\in K} x_{ijk}= 1,\forall i\in I,\forall j\in J

目标函数

如何排片全天的收益最大

max\left ( \sum_{i\in I,j\in J,k\in K}x_{ijk}*rate_{ik}*all_{jk} \right )

二、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)

三、求解结果

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值