Python pulp MILP objective 添加合理约束后无效
Python pulp MILP objective nullified when a reasonable constraint is added
我正在实施已知有效的混合整数线性规划公式。但是,当添加其中一个约束时,objective 函数变为:
MAXIMIZE
0*__dummy + False
这是没有添加约束的公式,它按预期工作:
from pulp import *
words = ['close', 'near', 'intimate']
pairs = [u + '-' + v for u in words for v in words if u != v]
scores = {'close-intimate': 2.0,
'close-near' : 1.5,
'intimate-close' : -2.0,
'intimate-near' : -1.0,
'near-close' : -1.5,
'near-intimate' : 1.0}
C = sum(abs(scores[uv]) for uv in scores) * 10
############################################################
# milp
'''
initialize problem
'''
prob = LpProblem('-'.join(words), LpMaximize)
'''
initialize variables
'''
x = dict()
d = dict()
w = dict()
s = dict()
for uv in pairs:
w[uv] = LpVariable('w_' + uv, 0, 1, LpInteger )
s[uv] = LpVariable('s_' + uv, 0, 1, LpInteger )
d[uv] = LpVariable('d_' + uv, 0, 1, LpContinuous)
for u in words:
x[u] = LpVariable('x_' + u, 0, 1, LpContinuous)
'''
objective function
'''
objective = [ (w[ij] - s[ij]) * scores[ij] for ij in pairs ]
prob += lpSum(objective)
'''
constraints
'''
# d_ij = x_j - x_i
for ij in pairs:
[i,j] = ij.split('-')
prob += x[j] - x[i] == d[ij]
# d_ij - w_ij * C <= 0
for ij in pairs:
prob += d[ij] - w[ij] * C <= 0
# d_ij + (1 - w_ij) * C > 0
for ij in pairs:
prob += d[ij] + (1 - w[ij]) * C > 0
# d_ij + s_ij * C >= 0
for ij in pairs:
prob += d[ij] + s[ij] * C >= 0
此附加约束使 objective 函数无效:
# d_ij - (1 - sij) * C < 0
for ij in pairs:
prob += d[ij] - (1 - s[ij]) * C < 0
什么给了?
你似乎在使用“<”,而你应该使用“<=”。
与所有线性规划工具一样,PuLP 无法处理严格的不等式,因此请将您的约束更改为:
# d_ij - (1 - sij) * C < 0
for ij in pairs:
prob += d[ij] - (1 - s[ij]) * C <= 0
我正在实施已知有效的混合整数线性规划公式。但是,当添加其中一个约束时,objective 函数变为:
MAXIMIZE
0*__dummy + False
这是没有添加约束的公式,它按预期工作:
from pulp import *
words = ['close', 'near', 'intimate']
pairs = [u + '-' + v for u in words for v in words if u != v]
scores = {'close-intimate': 2.0,
'close-near' : 1.5,
'intimate-close' : -2.0,
'intimate-near' : -1.0,
'near-close' : -1.5,
'near-intimate' : 1.0}
C = sum(abs(scores[uv]) for uv in scores) * 10
############################################################
# milp
'''
initialize problem
'''
prob = LpProblem('-'.join(words), LpMaximize)
'''
initialize variables
'''
x = dict()
d = dict()
w = dict()
s = dict()
for uv in pairs:
w[uv] = LpVariable('w_' + uv, 0, 1, LpInteger )
s[uv] = LpVariable('s_' + uv, 0, 1, LpInteger )
d[uv] = LpVariable('d_' + uv, 0, 1, LpContinuous)
for u in words:
x[u] = LpVariable('x_' + u, 0, 1, LpContinuous)
'''
objective function
'''
objective = [ (w[ij] - s[ij]) * scores[ij] for ij in pairs ]
prob += lpSum(objective)
'''
constraints
'''
# d_ij = x_j - x_i
for ij in pairs:
[i,j] = ij.split('-')
prob += x[j] - x[i] == d[ij]
# d_ij - w_ij * C <= 0
for ij in pairs:
prob += d[ij] - w[ij] * C <= 0
# d_ij + (1 - w_ij) * C > 0
for ij in pairs:
prob += d[ij] + (1 - w[ij]) * C > 0
# d_ij + s_ij * C >= 0
for ij in pairs:
prob += d[ij] + s[ij] * C >= 0
此附加约束使 objective 函数无效:
# d_ij - (1 - sij) * C < 0
for ij in pairs:
prob += d[ij] - (1 - s[ij]) * C < 0
什么给了?
你似乎在使用“<”,而你应该使用“<=”。
与所有线性规划工具一样,PuLP 无法处理严格的不等式,因此请将您的约束更改为:
# d_ij - (1 - sij) * C < 0
for ij in pairs:
prob += d[ij] - (1 - s[ij]) * C <= 0