我正在尝试解决设施位置问题,那里有一组客户和一组潜在的设施位置。尽管传统问题是线性的,但我变换了一些约束,现在有了非线性问题。
我知道有一些针对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中使用集合吗?或者,请向我发送一个示例代码,说明这种优化问题,以便了解其操作过程。
谢谢!
答案 0 :(得分:0)
我不认为scipy
是到达这里的方式。相反,我建议您使用PuLP
(link),它提供了一个接口,可将代数模型实质上转换为求解器可以理解的矩阵和向量。 PuLP
与几种不同的求解器一起使用。或者,您可以使用Gurobi或CPLEX的专用软件包(gurobipy
和docplex
)。无论如何,这些包都提供了功能来循环您要查询的类型。
此外,正如@Erwin Kalvelagen指出的那样,您的模型可以而且应该线性化:只需将约束的两边乘以分母即可。