使用 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 的本地安装,它可以在云上解决)。
事实上,我正在尝试实现非常简单的模型公式:
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 的本地安装,它可以在云上解决)。