【问题标题】:How to optimize min and max to find highest score sum如何优化最小值和最大值以找到最高分总和
【发布时间】:2021-04-07 03:38:44
【问题描述】:

这个问题涉及找到两个最小-最大标准过滤器来生成数据集中的最高分数总和。

我有一个数据集,有 3 列。 x, y, score,超过 100 万行。

x y score
3.6 1.2 -5
4.2 1.2 -4
1.2 30.2 1
2.9 6.8 6
3.1 5.8 7
0.1 15.8 7

数据可能有也可能没有相关性。

我想在 x 和 y 上找到一个最小/最大值的标准过滤器,它可以为我提供最高可能的分数总和。

这就是查询在 SQL 中的样子。

SELECT SUM(score) 
FROM mytable
WHERE
x > xmin AND x < xmax AND
y > ymin AND y < ymax

我正在寻找的是 xmin、xmax、ymin och ymax 的最佳值

需要什么样的优化方法来解决这个问题?实现的具体情况如何?

(最好使用 Java 或 postgres sql 来实现。)

【问题讨论】:

  • 您可能应该查看 GIST 索引。
  • 由于这是一个可能通过线性规划实现的优化问题,因此请考虑研究导入 Postgres 表的数据科学解决方案(R、Python、Matlab、SAS 等)。
  • 感谢您的回答。我会研究 GIST 索引。
  • @Parfait 你有这种优化问题的经验吗?您建议使用什么优化算法?
  • 你有负分吗?否则只需使用x/ymin=-infinity, x/ymax=+infinity

标签: java sql postgresql optimization mathematical-optimization


【解决方案1】:

没那么容易。这是我的 MIP 模型:

minimize sum(i, selected(i)*score(i))
x(i) <= xmin + M*(xBetween(i)+xAbove(i))
x(i) >= xmax - M*(xBetween(i)+xBelow(i))
x(i) >= xmin - M*xBelow(i)
x(i) <= xmax + M*xAbove(i)
y(i) <= ymin + M*(yBetween(i)+yAbove(i))
y(i) >= ymax - M*(yBetween(i)+yBelow(i))
y(i) >= ymin - M*yBelow(i)
y(i) <= ymax + M*yAbove(i)
xBetween(i)+xAbove(i)+xBelow(i)=1
yBetween(i)+yAbove(i)+yBelow(i)=1
selected(i) <= xBetween(i)
selected(i) <= yBetween(i)
selected(i) >= xBetween(i)+yBetween(i)-1
xmin <= xmax
ymin <= ymax
xBetween(i),xAbove(i),xBelow(i) ∈ {0,1}
yBetween(i),yAbove(i),yBelow(i) ∈ {0,1}
selected(i) ∈ {0,1}

常数 M 是足够大的数字(我使用了 x 或 y 数据的范围)。

用一些随机数,我得到:

----     37 VARIABLE z.L                   =       30.940  objective

----     44 PARAMETER data  data + results

                      x           y       score      x.betw      y.betw    selected

i1                1.717       6.611      -8.972
i2                8.433       7.558      -9.880
i3                5.504       6.274      -1.975
i4                3.011       2.839       0.398       1.000       1.000       1.000
i5                2.922       0.864       2.578       1.000       1.000       1.000
i6                2.241       1.025      -5.485                   1.000
i7                3.498       6.413      -2.078       1.000
i8                8.563       5.453      -4.480                   1.000
i9                0.671       0.315      -6.953
i10               5.002       7.924       8.726
i11               9.981       0.728      -1.547                   1.000
i12               5.787       1.757      -7.307                   1.000
i13               9.911       5.256      -2.279                   1.000
i14               7.623       7.502      -2.507
i15               1.307       1.781      -4.630                   1.000
i16               6.397       0.341       8.967
i17               1.595       5.851      -6.221                   1.000
i18               2.501       6.212      -4.050       1.000
i19               6.689       3.894      -8.509                   1.000
i20               4.354       3.587      -1.973                   1.000
i21               3.597       2.430      -7.966                   1.000
i22               3.514       2.464      -2.322                   1.000
i23               1.315       1.305      -3.518                   1.000
i24               1.501       9.334      -6.157
i25               5.891       3.799      -7.753                   1.000
i26               8.309       7.834       1.931
i27               2.308       3.000       0.229       1.000       1.000       1.000
i28               6.657       1.255      -9.099                   1.000
i29               7.759       7.489       5.662
i30               3.037       0.692       8.915       1.000       1.000       1.000
i31               1.105       2.020       1.929                   1.000
i32               5.024       0.051       2.147
i33               1.602       2.696      -2.750                   1.000
i34               8.725       4.999       1.881                   1.000
i35               2.651       1.513       3.597       1.000       1.000       1.000
i36               2.858       1.742       0.132       1.000       1.000       1.000
i37               5.940       3.306      -6.815                   1.000
i38               7.227       3.169       3.138                   1.000
i39               6.282       3.221       0.478                   1.000
i40               4.638       9.640      -7.512
i41               4.133       9.936       9.734
i42               1.177       3.699      -5.438                   1.000
i43               3.142       3.729       3.513       1.000       1.000       1.000
i44               0.466       7.720       5.536
i45               3.386       3.967       8.649       1.000       1.000       1.000
i46               1.821       9.131      -5.975
i47               6.457       1.196      -4.057                   1.000
i48               5.607       7.355      -6.055
i49               7.700       0.554      -5.073
i50               2.978       5.763       2.930       1.000       1.000       1.000
range(data)       9.516       9.885      19.614
min(solution)     2.241       0.554
max(solution)     3.498       5.851

【讨论】:

  • 非常感谢您的回答。我不熟悉 MIP 模型,但我正在尝试理解您的代码。是否可以用伪代码或每行上方的 cmets 来解释你在做什么?
  • 这里没有代码。这些是数学方程式。这更像是一个概念证明:我们可以通过一些努力开发一个(线性)混合整数规划(MIP)模型来解决这个问题。但是对于第一个数学优化模型来说,这有点太多了。并非所有问题都会产生简单的小型模型。您可能想研究元启发式算法,例如遗传算法。这些更接近于编程代码,对于具有计算机科学背景的开发人员来说更容易理解。
  • 好吧。我明白。我看到您还提供了一个带有输入和输出的结果表。这是 MIP 模型的结果吗?您使用什么类型的求解器来生成解决方案?
  • 我使用了 GAMS+CPLEX。我确实确保不使用特殊设施(例如指标约束)。所以,这个模型可以用任何 MIP 求解器来求解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 2012-02-10
  • 2017-04-22
相关资源
最近更新 更多