一同事托我帮忙算一道计算题,并给我发了一张截图

problem

已知三个产品A、B、C的原价,和购买若干这三类产品所花的总金额,求一组合适的折扣和购买台数,使得所花费金额和账目上的总金额相同,并且要求折扣必须是小于1的一位小数,台数也不能超过20台。

假设产品A、B、C的折扣分别为 $ d_A,d_B,d_C $,所购买的台数分别为 $n_A,n_B,n_C$,于是可以解如下方程

\[40872 \cdot d_A \cdot n_A + 22200 \cdot d_A \cdot n_A + 8224.8 \cdot d_A \cdot n_A = 352191.2\]

显然,找到一个此方程的可行解,问题就解决了!

那么问题又来了,如何求解这一个多元二次方程呢? 我那个同事说:可以试凑啊,先定下折扣再凑出台数,简简单单。 这样不仅挺耗时间的,而且如果这个方程只有少数几个可行解,那得试到什么时候了,更何况这个方程可能无解,再怎么试凑也没用。

真的就没有省时省力的方法了吗?

可以将上述问题看作是如下最优化问题:

\[\min |40872 \cdot d_A \cdot n_A + 22200 \cdot d_A \cdot n_A + 8224.8 \cdot d_A \cdot n_A - 352191.2|\]

满足如下约束条件

$ 0<d_A,d_B,d_C<1$ , 且为1位小数; $ 0<n_A,n_B,n_C<20$ , 且为整数。

根据构建的最优化问题,我们就可以用电脑替我们解决问题了。

这里使用标准粒子群算法求解此优化问题。用Matlab执行main.m,若干次后得出最优的折扣和台数如下表

  原价 折扣 台数 金额
A产品 40872 0.6 4 98092.8
B产品 22200 0.7 10 155400
C产品 8224.8 0.8 15 98697.6
      总计 352190.4

显然这个多元方程在要求的自变量的可行域内是无解的,只能求出一个近似解。这使得求出的总金额与要求的总金额相差0.8元。