这样做假账真的刑吗
一同事托我帮忙算一道计算题,并给我发了一张截图
已知三个产品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元。