2017-10-31 18 views
0

최적화 문제를 해결하기 위해 Python API를 사용하고 있습니다. 상호 거리를 최대화하기 위해 크기 N (예 : 10)의 이진 변수 집합을 찾습니다. 이렇게하려면 다음을 조합했습니다.CPLEX - 행렬 하위 집합의 최소값 얻기

최소 거리를 최대화하기 위해 목적 함수를 수정하고 싶습니다. 나는 다음과 같이이 지정하려고하면, 나는 오류로 실행 :

# minimum within clique 
clique_min = im.min(adj_mat.loc[i, j] for i in adj_mat.index for j in adj_mat.index if b[i] == 1 and b[j] == 1) 
im.add_kpi(clique_min, 'clique_min') 

TypeError: cannot convert a constraint to boolean: acc_num_NC_015394 == 1

어떻게 올바르게 제약 조건을 지정해야합니까? 이것은이 SO과 관련이있는 것으로 보이지만 내 문제는 python API에만 해당됩니다.

답변

1

이터레이터의 이진 결정 변수가 포함 된 '=='테스트는 모델 제약으로 인식되지 않습니다.

이러한 종류의 제약 조건을 모델링하는 한 가지 방법은 표시기 제약 조건을 사용하는 것입니다.

bij_ind = im.binary_var_matrix(matrix.index.values, matrix.index.values, name='ind_') 
clique_min = im.continuous_var(name='clique_min') 
for i in matrix.index: 
    for j in matrix.index: 
     im.add(bij_ind[i, j] == im.min(b[i], b[j])) 
     im.add_indicator(bij_ind[i, j], clique_min <= adj_mat.loc[i, j]) 

im.add_kpi(clique_min, 'clique_min') 
im.maximize(clique_min) 

나는이 제제는하지만 매우 효율적이라고 생각하지 않습니다 : 는 여기에 귀하의 예를 들어 가능한 공식이다.