具有线性目标函数的Python离散优化

时间:2018-05-09 15:20:04

标签: python optimization mathematical-optimization linear-programming pulp

我有一些要点(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而不是连续变量,所以我从纸浆开始。 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

我在这里看不到任何非线性。如果我理解正确的任务,你可以:

  • 介绍 aux-vars 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)
    • 警告:我们只是在暗示蕴涵(不等同);不一定对其他方向感兴趣
  • 为所有C(N,2)距离添加边界约束(相当于限制最大值;通用重构):
    • P[i,j] * DIST[i,j] <= max-dist(适用于所有i;适用于所有j)
    • 这是仿射约束(DIST&amp; max-dist是常数)

备注:就P(平1D与2D)和对所有i的维度而言,上述有些不正式;对于所有j 。详细信息取决于此决定以及是否删除了对称性。