聚类问题约束报错:CPLEX无法提取表达式求排查
问题分析与修正
错误原因
你的第一个约束确实存在下标错误:
- 变量
x的定义是dvar boolean x[M,N];,即第一个维度是聚类类别(M范围),第二个维度是样本(N范围) - 原约束中
x[i,k]和x[j,k]的下标顺序颠倒了,i和j是样本(属于N),不能作为x的第一个维度下标,超出了M的范围,导致CPLEX无法解析表达式。
数学模型(中文翻译)
目标函数:最小化 Z
约束条件:
- 对任意样本i、j,以及任意聚类k:若样本i和j都属于聚类k,则两点间距离d(i,j) ≤ Z
- 每个样本j必须且只能属于一个聚类
修正后的OPL代码
range N=1..10; range M=1..2; float distance[N,N]=...; dvar boolean x[M,N]; dvar float+ Z; minimize Z; subject to { // 修正下标顺序:x[k,i]表示样本i属于聚类k forall(i in N, j in N, k in M) distance[i,j]*x[k,i] + distance[i,j]*x[k,j] - Z <= distance[i,j]; forall(j in N) sum(k in M)x[k,j]==1; }
你也可以进一步简化第一个约束,让逻辑更贴合数学模型且提升计算效率:
forall(i in N, j in N, k in M) distance[i,j]*(x[k,i] + x[k,j] - 1) <= Z;
内容的提问来源于stack exchange,提问作者Cmrs
相关产品推荐
相关产品推荐

