【问题标题】:CPLEX - getting minimum of a matrix subsetCPLEX - 获取矩阵子集的最小值
【发布时间】:2017-10-31 04:37:37
【问题描述】:

我正在使用 Python API 来 cplex 解决优化问题:找到大小为 N(例如 10)的二进制变量集以最大化它们的相互距离。为此,我整理了以下内容:

 matrix = pd.read_csv("matrix.csv", index_col=0)

 # declare integer variables
 im = Model(name='max_weight_clique')
 b = im.binary_var_dict(matrix.index.values)

 # define objective function
 clique_weight = im.sum(b[i] * b[j] * (matrix.loc[i, j] + matrix.loc[j, i])
                             for i, j in itertools.combinations(matrix.index, 2))
 # add to key performance indicators
 im.add_kpi(clique_weight, 'clique_weight')

 # set size of clique
 im.add_constraint(im.sum(b) == 10)

 im.maximize(clique_weight)

我想修改我的目标函数,改为最大化最小距离。当我尝试将其指定为以下内容时,我遇到了错误:

# 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:无法将约束转换为布尔值:acc_num_NC_015394 == 1

我应该如何正确指定这个约束?这似乎与 SO 有关,但我的问题是特定于 python API。

【问题讨论】:

    标签: python cplex docplexcloud


    【解决方案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)
    

    我不认为这个公式很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2021-02-14
      • 2021-07-13
      相关资源
      最近更新 更多