在 Pulp Python 中制定 LP 的约束条件
Formulating constraints of a LP in Pulp Python
我有这个 LP 问题,我正尝试在 Python-3 中使用 PuLP 解决它。我能想到的一种选择是显式写入所有变量,但我想避免它。有什么方法可以让我在这个问题中使用 lists/dicts 吗? (我确实参考了 https://pythonhosted.org/PuLP/CaseStudies/a_sudoku_problem.html 哪里使用了字典,但不太理解整个解决方案)
假设wt{i,j,type}表示person[i]和[=28=之间的交易商品数量类型的]人[j]。
LP 问题:
(这里,cost{i,j} 是所有 (i,j) 对的已知配对成本。
受制于:
我将非常感谢任何帮助,因为我是优化和 python/pulp 的初学者。
'lists/dicts' 是一种在域上定义变量(索引变量)的方法。
LpVariable.dicts()
的 indexs
参数定义域 - 所提供集合的笛卡尔积。另请参阅 PuLP 文档 - LpVariable.
下面的代码示例不包含您的所有约束,但我相信您可以轻松填写其余的。约束 1(const1
和 const2
)通过 wt
变量的下限和上限来处理。
from pulp import LpProblem, LpVariable, LpMaximize, LpInteger, lpSum, value
prob = LpProblem("problem", LpMaximize)
# define 'index sets'
I = range(10) # [0, 1, ..., 9]
J = range(10)
T = range(3)
# define parameter cost[i,j]
cost = {}
for i in I:
for j in J:
cost[i,j] = i + j # whatever
# define wt[i,j,t]
const1 = 0 # lower bound for w[i,j,t]
const2 = 100 # upper bound for w[i,j,t]
wt = LpVariable.dicts(name="wt", indexs=(I, J, T), lowBound=const1, upBound=const2, cat=LpInteger)
# define assign[i,j]
assign = LpVariable.dicts(name="assign", indexs=(I, J))
# contraint
for i in I:
for j in J:
prob += assign[i][j] == lpSum(wt[i][j][t] for t in T), ""
# objective
prob += lpSum(cost[i,j] * assign[i][j] for i in I for j in J)
prob.solve()
for i in I:
for j in J:
for t in T:
print "wt(%s, %s, %s) = %s" % (i, j, t, value(wt[i][j][t]))
for i in I:
for j in J:
print "assign(%s, %s) = %s" % (i, j, value(assign[i][j]))
我有这个 LP 问题,我正尝试在 Python-3 中使用 PuLP 解决它。我能想到的一种选择是显式写入所有变量,但我想避免它。有什么方法可以让我在这个问题中使用 lists/dicts 吗? (我确实参考了 https://pythonhosted.org/PuLP/CaseStudies/a_sudoku_problem.html 哪里使用了字典,但不太理解整个解决方案)
假设wt{i,j,type}表示person[i]和[=28=之间的交易商品数量类型的]人[j]。
LP 问题:
(这里,cost{i,j} 是所有 (i,j) 对的已知配对成本。
受制于:
我将非常感谢任何帮助,因为我是优化和 python/pulp 的初学者。
'lists/dicts' 是一种在域上定义变量(索引变量)的方法。
LpVariable.dicts()
的 indexs
参数定义域 - 所提供集合的笛卡尔积。另请参阅 PuLP 文档 - LpVariable.
下面的代码示例不包含您的所有约束,但我相信您可以轻松填写其余的。约束 1(const1
和 const2
)通过 wt
变量的下限和上限来处理。
from pulp import LpProblem, LpVariable, LpMaximize, LpInteger, lpSum, value
prob = LpProblem("problem", LpMaximize)
# define 'index sets'
I = range(10) # [0, 1, ..., 9]
J = range(10)
T = range(3)
# define parameter cost[i,j]
cost = {}
for i in I:
for j in J:
cost[i,j] = i + j # whatever
# define wt[i,j,t]
const1 = 0 # lower bound for w[i,j,t]
const2 = 100 # upper bound for w[i,j,t]
wt = LpVariable.dicts(name="wt", indexs=(I, J, T), lowBound=const1, upBound=const2, cat=LpInteger)
# define assign[i,j]
assign = LpVariable.dicts(name="assign", indexs=(I, J))
# contraint
for i in I:
for j in J:
prob += assign[i][j] == lpSum(wt[i][j][t] for t in T), ""
# objective
prob += lpSum(cost[i,j] * assign[i][j] for i in I for j in J)
prob.solve()
for i in I:
for j in J:
for t in T:
print "wt(%s, %s, %s) = %s" % (i, j, t, value(wt[i][j][t]))
for i in I:
for j in J:
print "assign(%s, %s) = %s" % (i, j, value(assign[i][j]))