在数学模型的求解当中,常常会出现各式各样的数值问题,包括模型的求解结果不稳定、产生不合理的结果或者底层算法的表现与收敛性都不符合预期等问题,引起这些问题的原因很多种,其中,在建模时,对约束系数的精度处理(例如四舍五入)是一个常见的引起数值问题的原因。
我们在前面提到,模型预处理时,常常会考虑将约束两端的系数缩减,这里很可能会涉及到一个问题就是,如果系数缩减的倍数,并不是左右两端的公约数,此时有些模型可能会考虑是否四舍五入,很显然,约束系数四舍五入之后,这条约束是否还和原来的约束等价吗?或者说,在原模型的基础上,加上系数四舍五入之后的约束,模型还是原来的模型吗?
我们来看如下的例子:
x ? 6 y = 1 x-6y=1 x?6y=1,两边同时除以6,并和四舍五入保留三位小数,得到 0.333 x ? 2 y = 0.333 0.333x-2y=0.333 0.333x?2y=0.333,这两个约束貌似等价,如果对第二条约束移向后代入第一条约束,会得到什么呢?
y
=
0.1665
x
?
0.1665
y=0.1665x-0.1665
y=0.1665x?0.1665
x
?
6
×
(
0.1665
x
?
0.1665
)
=
1
→
0.001
x
=
0.001
x-6\times(0.1665x-0.1665)=1 \rightarrow 0.001x=0.001
x?6×(0.1665x?0.1665)=1→0.001x=0.001
当只考虑 x ? 6 y = 1 x-6y=1 x?6y=1时,只要 x , y x,y x,y 的值满足该约束就应该是个可行解,但同时考虑该约束的“等价”约束时,则可行解有且仅有一个 x = 1 , y = 0 x=1,y=0 x=1,y=0。这显然与原来的约束空间有差异,产生这种差异的来源是约束系数在缩减时使得约束产生了轻微的旋转。不论这种旋转多么轻微(精度多么高),两条约束就不再等价(不平行),因此,在建立数学模型时,应尽量避免约束系数的四舍五入操作,目标函数系数的精度缺失影响的是目标值,但约束系数的精度缺失会导致问题可能变得无解或得到非常不合理的解。