0

我正在尝试解决设施位置问题,我有一组客户和一组潜在的设施位置。虽然,传统问题是线性的,但我转换了一些约束,现在我遇到了一个非线性问题。

我知道 python 有非线性优化包,例如 SciPy,但我不明白我应该如何迭代大型集合。我可以只使用for循环来计算总和吗?以及如何在以下示例中说明约束中的“for all i in I”和“for all j in 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 中使用集合吗?或者,请给我发送一个包含此类优化问题的示例代码,以便我了解它是如何完成的。

谢谢!

4

1 回答 1

0

我不认为scipy是去这里的方式。相反,我建议您使用PuLP( link ),它提供了一个接口,可以将您的代数模型本质上转换为求解器可以理解的矩阵和向量。PuLP与几个不同的求解器一起工作。或者,您可以使用 Gurobi 或 CPLEX 的专用包 (gurobipydocplex)。在任何情况下,这些包都提供了执行您所询问的类型的循环的功能。

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

于 2019-05-03T23:32:08.527 回答