【问题标题】:Minimize optimization with constraints from multiple sets of options使用来自多组选项的约束来最小化优化
【发布时间】:2017-09-12 18:50:38
【问题描述】:

我正在寻找一种方法,通过从每个组都包含选项的大型数据集中为每个组选择一个选项来最小化具有多个约束的成本。该数据集由大约 100 个组组成,每个组有 200 个选项。

以下是优化条件列表、数据示例以及结果应该是什么。在小数据集上,我只是遍历了所有组合,但对于实际的大数据集,这将花费很长时间。我研究了 SciPy Optimize Minimize,但这似乎不合适。是否存在可用于找到最低成本的优化框架?如果没有,用 Python 解决它的好方法是什么?

条件

  • 每组只有一个选项
  • 最小化总成本
  • A 的总和必须小于 10
  • B 之和必须小于 12

数据集

+-------+--------+-----+-----+-------+
| Group | Option |  A  |  B  | Costs |
+-------+--------+-----+-----+-------+
|     1 |      1 |  10 |   0 |    10 |
|     1 |      2 |   0 |   0 |    21 |
|     1 |      3 |   0 |   7 |    15 |
|     2 |      1 |   8 |   0 |     8 |
|     2 |      2 |   0 |   0 |    34 |
|     2 |      3 |   0 |   5 |    18 |
|     3 |      1 |   9 |   0 |     9 |
|     3 |      2 |   0 |   0 |    20 |
|     3 |      3 |   0 |   6 |     7 |
+-------+--------+-----+-----+-------+

结果

+-------+--------+
| Group | Option |
+-------+--------+
|     1 |      1 |
|     2 |      3 |
|     3 |      3 |
+-------+--------+
Total costs: 35
Sum A: 10
Sum B: 11

【问题讨论】:

  • 你的python是否以任何方式使用SQL?
  • 欢迎来到 StackOverflow。请阅读How to Ask,并附上您尝试过的详细信息,并更具体地说明您的问题/问题是什么。
  • @JacobIRR 是的,数据集存储在 MariaDB 数据库中。
  • @Antimony 谢谢你的建议。我已经编辑了我的帖子,希望现在更清楚。
  • @roganjosh 我添加了我的问题,我将研究组合优化。谢谢你的建议。

标签: python optimization constraints minimization


【解决方案1】:

这是使用 CVXPY (http://www.cvxpy.org/en/latest/index.html) 的解决方案。 我排列了数据,使得 A、B、成本是矩阵,列 i 代表组 i 的选项。

import cvxpy as cvx
import numpy as np

A = np.array([[10,8,9],[0,0,0],[0,0,0]])
B = np.array([[0,0,0],[0,0,0],[7,5,6]]) 
cost = np.array([[10,21,15],[8,34,18],[9,20,7]]).T

choices = cvx.Int(3,3)
constraints = [cvx.sum_entries(choices[:,i]) == 1 for i in range(3)] + [cvx.sum_entries(cvx.mul_elemwise(A,choices)) <= 10] + [cvx.sum_entries(cvx.mul_elemwise(B,choices)) <= 12] + [choices >= 0, choices <= 1]
objective = cvx.Minimize(cvx.sum_entries(cvx.mul_elemwise(cost,choices)))
prob = cvx.Problem(objective,constraints)
prob.solve()

print(int(round(prob.value)))
print(np.matrix(prob.variables()[0].value.round(),dtype = np.int))

由于某种原因,输出值仍然是浮点数,所以我将它们转换回整数。

【讨论】:

  • 感谢您的详细回复!它工作得很好。对于大型数据集,使用 GLPK_MI 求解器大约需要 50 秒。我仍在研究如何加快速度。
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2021-09-27
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多