2016-12-12 4 views
0

나는 알려진 것으로 알려진 혼합 정수 선형 프로그래밍 공식을 구현 중입니다. 그러나 제약 중 하나는 목적 함수를 첨가하면된다 :합리적인 제약 조건이 추가되면 Python 펄프 MILP 목표가 무효화됩니다.

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 

이 추가 제약은 목적 함수를 무효 : 여기서

MAXIMIZE 
0*__dummy + False 

가 의도 한대로 동작 추가 제약없이 제형이다

# d_ij - (1 - sij) * C < 0 
for ij in pairs: 
    prob += d[ij] - (1 - s[ij]) * C < 0 

무엇을 제공합니까?

답변

1

'< ='을 사용해야 할 때 '<'을 사용하는 것 같습니다.

# d_ij - (1 - sij) * C < 0 
for ij in pairs: 
    prob += d[ij] - (1 - s[ij]) * C <= 0 
: 모든 선형 프로그래밍 도구 펄프처럼

그래서 당신의 제약 조건을 변경하십시오, 엄격한 불평등을 처리 할 수 ​​없습니다