2017-10-31 14 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

あなたの定式化の問題は、イテレータのバイナリ決定変数を含む '=='テストがモデル制約として認識されないことです。

この種の制約をモデル化する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) 

私は、この製剤はいえ、非常に効率的だとは思わない: はここにあなたの例のための可能な製剤です。

関連する問題