use*_*280 6 algorithm linear-equation rounding
我的问题是我有一个矩阵,其中所有行的总和,以及所有列的总和为零.所有数字都舍入为x小数.
然后我将整个矩阵乘以0到1之间的数字(例如1/6)并将所有数字四舍五入为x小数.现在我无法确定行和列的总和是否为零.我希望在最小可能的调整(或至少非常小的调整)下,总和再次为零
是否存在可以解决此类问题的算法?
示例(非常简单):矩阵:
200 -200 0
400 400 -800
-600 -200 800
Run Code Online (Sandbox Code Playgroud)
round2((1/6)*矩阵)
33.33 -33.33 0
66.67 66.67 -133.33
-100 -33.33 133.33
Run Code Online (Sandbox Code Playgroud)
这不是一个解决方案;只是对您想要实现的目标进行更数学的描述(不判断这是否是正确的做法):
由于您将所有数字四舍五入为 x 位小数,因此我们可以将这些数字视为整数(只需将它们乘以 10^x)。
现在,您正在尝试解决以下问题:
给定矩阵
A11+Adj11 A12+Adj12 ... A1n+Adj1n
A21+Adj21 A22+Adj22 ... A2n+Adj2n
A31+Adj31 A32+Adj32 ... A3n+Adj3n
... ... ... ...
Am1+Adjm1 Am2+Adjm2 ... Amn+Adjmn
Run Code Online (Sandbox Code Playgroud)
其中 A11..Amn 是常量整数,
查找整数 Adj11...Adjmn
最小化总和(abs(Adjxy))
(或者也许您更喜欢:最小化总和((Adjxy)^ 2)
须遵守:
- for each row m: Adjm1+Adjm2+...+Adjmn = - (Am1+Am2+...+Amn)
- for each col n: Adj1n+Adj2n+...+Adjmn = - (A1n+A2n+...+Amn)
Run Code Online (Sandbox Code Playgroud)
这是一个整数规划问题,有 m*n 个变量和 m+n 个约束。您尝试最小化的函数不是线性的。
恐怕这个问题绝非小事。我相信你最好将其发布在https://math.stackexchange.com/