Matlab - 优化两个流子约束与最大利润的混合

时间:2017-07-23 11:58:49

标签: excel matlab optimization

我正在尝试将一个非常简单的Excel移植到Matlab代码中(我对Excel Solver并不完全满意!)。我的问题是:

我有两种材料(比如A和B)及其属性(密度,粘度等)和价格,我将它们混合以获得第三种材料(比如说C),它们的属性是混合物(不一定是线性的)两者中的哪一个,如果它尊重某些限制(即密度最大X,粘度最大Y),可以以特定价格出售。我所拥有的功能是获取A和B的数量,它们的属性,价格,材料C限制和材料C价格。然后得出一个利润(即价格C *(数量A +数量B) - (价格A *数量A +价格B *数量B)),以及一个告诉我材料是否满足所有属性限制的指标C(基本上它比较限制和实际属性,如果正常则输出0,否则输出1 --->如果所有属性都被尊重,则该向量的平均值应为0)。

因此我有:

[profit,ok] = blend([qA,qB],[specA,specB],[pA,pB],[limits],pC)

我希望通过改变数量A和数量B来获得最大利润,即ok矢量为0且qA + qB小于指定的最大数量。真正的问题是将ok向量强加为0.我考虑在函数外部移植限制检查,但是我只能在函数计算出混合的属性后检查是否遵守限制,所以我不能把它外。这个问题有方法解决吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

您正在寻找的是nonlinear constrained optimization,最有可能的是fmincon

我担心,如果你打开你的功能以适应标准方案,这可能是最好的。顺便提一下,这是一件非常好的事情,因为这是表达这些问题的常用方法。 电话是

x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

您有两个参数,给出材料的数量,或者如果您将总数量标准化为1,您可以只使用一个参数x并在另一个方程式中将另一个表达为(1-x)。 /> 因此,您需要编写一个函数fun,它只根据参数计算利润。 然后将材料约束放入剩余参数中。您可以将所有约束放入ceq nonlcon的{​​{1}}返回,如解释here,以便在混合正常时返回零。

然而,更清晰,更高效的是使用Ab矩阵对所有线性约束进行编码。

有关详细信息,我需要您拥有的实际约束和功能。