使用 Python API 在 CPLEX 中设置模型

Set up model in CPLEX using Python API

事实上,我正在尝试实现非常简单的模型公式:

min  sum_i(y_i*f_i) + sum_i(sum_j(x_ij*c_ij))
s.t.   sum_i(x_ij) = 1         for all j
             x_ij <= y_i       for all i,j
         x_ij, y_i are binary

但我根本无法弄清楚 Python API 是如何工作的。他们建议创建这样的变量:

model.variables.add(obj = fixedcost, 
                    lb = [0] * num_facilities, 
                    ub = [1] * num_facilities, 
                    types = ["B"] * num_facilities)

# Create one binary variable for each facility/client pair. The variables
# model whether a client is served by a facility.
for c in range(num_clients):
    model.variables.add(obj = cost[c], 
                        lb = [0] * num_facilities, 
                        ub = [1] * num_facilities, 
                        types = ["B"] * num_facilities)

# Create corresponding indices for later use
supply = []
for c in range(num_clients):
    supply.append([])
    for f in range(num_facilities):
        supply[c].append((c+1)*(num_facilities)+f)

# Constraint no. 1:
for c in range(num_clients):        
    assignment_constraint = cplex.SparsePair(ind = [supply[c][f] for f in \
                                                    range(num_facilities)],
                                             val = [1] * num_facilities)
    model.linear_constraints.add(lin_expr = [assignment_constraint],                    
                                 senses = ["L"], 
                                 rhs = [1])

对于这个限制,我不知道上面的变量是如何引用的,因为它只提到了列表的辅助列表。谁能向我解释这应该如何工作?问题很简单,我也知道如何用 C++ 做,但是 Python API 对我来说是一本合上的书。

问题是无容量设施位置问题,我想修改示例文件facility.py

编辑:约束 2 的一个想法是创建一维向量并使用向量加法来创建最终约束。但这告诉我这是 SparsePairs

不受支持的操作数
for f in range(num_facilities):
    index = [f]
    value = [-1.0]
    for c in range(num_clients):
        open_constraint = cplex.SparsePair(ind = index, val = value) + cplex.SparsePair(ind = [supply[c][f]], val = [1.0])
        model.linear_constraints.add(lin_expr=[open_constraint],
                                    senses = ["L"],
                                    rhs = [0])

Python API 在本质上比 C++/Concert API 更接近 C Callable Library。变量的索引从 0 到 model.variables.get_num() - 1 并且可以通过索引引用,例如,在创建约束时。它们也可以通过名称引用(add 方法有一个可选的 names 参数)。请参阅 VariablesInterface here 的文档(这是针对版本 12.5.1,鉴于您之前的 post,我相信您正在使用它)。

开始查看最简单的示例(如 lpex1.py(并阅读评论)可能会有所帮助。最后,我强烈建议在交互式 Python 提示符(又名 REPL)中使用 Python API。您可以在那里阅读帮助并输入内容以查看它们的作用。

您可能还想看一下 docplex 包。这是一个建立在 CPLEX Python API 之上的建模层(或者如果您没有安装 CPLEX 的本地安装,它可以在云上解决)。