我先来抛砖吧,
设对应的未知数是x11,x12,x21,x22,x23,x31,x32,x33,各自与行列的位置对应,条件方程有六个,分别对应三行与三列,如果用穷举法,大概的组合有21^8之多,大约300多亿,非常耗时。不过,幸好这些条件方程是相互联系的,因此,可以用替换法来缩减,每一个条件方程式缩减一个变量,最终可以用5个条件方程缩减5个变量,变成下面的等式:
x22*x32-(4+x22*(9-x31-x32))/x31=5
保留下来需要穷举的变量只有三个,循环量大概21^2*20,约8000多个,这么少的循环,即便是R语言,都表示毫无压力。代码如下:
- result <- matrix(ncol = 8)
- colnames(result) <- c("x11", "x12", "x21", "x22", "x23", "x31", "x32", "x33")
- for (x22 in 0:20) {
- for (x31 in 1:20) {
- for (x32 in 0:20) {
- if(x22*x32-(4+x22*(9-x31-x32))/x31==5)
- result <- rbind(result, c(9-x22*x32,13+x22*x32-9,4+x22*(9-x31-x32),x22,9-x32-x31,x31,x32,x31+x32-4))
- else next
- }
- }
- }
复制代码结果出来后,还需要把NA值和其他变量不符合0-20条件的行去除,
- result <- result[-1,] #去除第一列空值
- result <- result[apply(result,1,min)>=0,]
- result
- x11 x12 x21 x22 x23 x31 x32 x33
- 2 11 4 1 0 2 7 5
复制代码整个过程在R上的运行速度非常快,在我的i3电脑上都只需要大概11毫秒,因此,我也懒得再去优化了。