我有一些要点(N)。对于这些点,我有一个距离矩阵D(N * N)。我也有这些点A(1 * N)的属性数据。我想选择固定的点数(K),使得sum of attribute is maximum
,而选定点之间的距离介于范围(min_dis,max_dis)之间。
我尝试在Pulp中实现这个优化问题,N = 10,K = 3.
A = [300,436,234,11,23,897,439,56,123,432]
。
import pulp
import numpy as np
inds = range(10)
#create a vector x which will only accept value 0,1
x = pulp.LpVariable.dicts('x', inds, lowBound = 0,upBound = 1,cat = pulp.LpInteger)
my_lp_problem = pulp.LpProblem("My LP Problem", pulp.LpMaximize)
#sum of x should be equal to no of points I want (which is 3)
my_lp_problem += sum([x[store] for store in inds]) == 3
#maximize dot product A.x (which would be sum of attributes)
my_lp_problem += sum([A[point] * x[point] for point in inds])
但是我无法将约束放在距离矩阵上。这将是这样的:
np.multiply(x,D).max() < max_dis and np.multiply(x,D).min() > min_dis
因为我无法找到如何在纸浆中使用max(),min()和矩阵乘法的东西。我所理解的是,它具有线性目标函数,而约束不是线性的。我也研究了scipy.optimize
但是因为x只能包含0和1而不是连续变量,所以我从纸浆开始。
任何帮助表示赞赏!
答案 0 :(得分:0)
我在这里看不到任何非线性。如果我理解正确的任务,你可以:
P[i,j] in {0,1}
S[i] = 1
)&amp; 选择了点j IMPLIES P[i,j] = 1
C(N,2)
P[i,j] >= S[i] + S[j] - 1
(适用于所有i;适用于所有j)P[i,j] * DIST[i,j] <= max-dist
(适用于所有i;适用于所有j)备注:就P(平1D与2D)和对所有i的维度而言,上述有些不正式;对于所有j 。详细信息取决于此决定以及是否删除了对称性。