如何在Python中将大型数据集与非线性优化求解器配合使用?

时间:2019-01-21 16:04:08

标签: python optimization location logistics

我正在尝试解决设施位置问题,那里有一组客户和一组潜在的设施位置。尽管传统问题是线性的,但我变换了一些约束,现在有了非线性问题。

我知道有一些针对python的非线性优化程序包,例如SciPy,但我不知道如何遍历大集合。我可以只使用for循环来计算总和吗?并按照下例中的说明,如何计算约束中的“对于I中的所有i”和“对于J中的所有j”?

目标: 最大值:Z = ∑_i ∑_j(d_i * p_ij * a_ij * y_j)

受制于: p_ij =(u_ij * a_ij * y_j)/(∑_j(u_ij * a_ij * y_j))∀i∈I,j∈J

y_j∈{0,1}∀j∈J

其中I是一组客户,J是一组潜在的设施地点。给出了d,a和u。 p和y由模型定义。

有人可以向我解释如何在SciPy中使用集合吗?或者,请向我发送一个示例代码,说明这种优化问题,以便了解其操作过程。

谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为scipy是到达这里的方式。相反,我建议您使用PuLPlink),它提供了一个接口,可将代数模型实质上转换为求解器可以理解的矩阵和向量。 PuLP与几种不同的求解器一起使用。或者,您可以使用Gurobi或CPLEX的专用软件包(gurobipydocplex)。无论如何,这些包都提供了功能来循环您要查询的类型。

此外,正如@Erwin Kalvelagen指出的那样,您的模型可以而且应该线性化:只需将约束的两边乘以分母即可。