首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求矩阵子集的最小值

求矩阵子集的最小值
EN

Stack Overflow用户
提问于 2017-10-31 04:37:37
回答 1查看 433关注 0票数 0

我正在使用Python来解决一个优化问题:找到一组大小为N(例如10)的二进制变量,以使它们之间的距离最大化。为了做到这一点,我提出了以下几点:

代码语言:javascript
复制
 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)

我想修改我的目标函数,而不是,最大限度的距离。当我试图将其指定为以下内容时,会遇到一个错误:

代码语言:javascript
复制
# 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的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-01 10:30:43

您的公式中的问题是,迭代器中包含二进制决策变量的“==”测试不被认为是模型约束。

对这种约束进行建模的一个选择是使用指示符约束。下面是您的示例的一个可能的公式:

代码语言:javascript
复制
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)

我不认为这个配方是非常有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47027994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档