123456789组成的3×3的矩阵的行列式最大的值是多少?
程序员文章站
2022-04-27 20:13:21
...
123456789怎样运算等于1? - abccsss 的回答
假定每个数字只能出现一次。
较简洁
以上用Matlab暴力破解(枚举种情形),暂未输出行列式相同的其他情形,貌似基本秒出。
matrix = Partition[#, 3] & /@ list;
answer = Det /@ matrix;
m = Max[answer];
pos = Flatten[Position[answer, m]];
matrix[[#]] & /@ pos 贴个毫无技术含量暴力程度max的python版。。。
9 4 2
3 8 6
5 1 7
很容易看出思路了。
1.所有数按大小在斜率为-1的对角线上依次排开。(即:987在一条对角线,654在一条,321在一条)很容易看出这是让正向数值最大的方法。
2.对于反向的对角线,排除主对角线之外的任意两个数之和相等,且乘积越大的,相应的主对角线元素越小。(也就是让三个乘积的最大值最小,然后最大的结果再和最小的数相配这样)
但是以上方法仅限于1~9的3x3矩阵,对于其它的矩阵不一定适用。
因为显然这种方法要求正向和负向都只有对角线(或平行于对角线),但是4x4的行列式就开始有拐弯了。。。
然后,我感觉还有三个漏洞,一是贪心法不一定保证正向最大,也不一定保证反向最小,更不一定保证正反向之差最大。(不一定都是漏洞,可能有的是恒成立的)
但是我感觉对3x3的非负矩阵来说,贪心在多数情况下是可以拿到最大值的。
PS:试了很多组数,都是这个解,然后又试了一组[1 2 3 4 5 6 7 8 100],显然答案发生了变化,因为100的权值比8和7大太多,所以负向的时候直接就把2和1给了100。那么这也就证明了贪心法确实有时候得不到最大值。 前面已经有了python,c和MMA的代码了,我来一发matlab的吧
直接9!个结果存下来刚正面,0优化
假定每个数字只能出现一次。
回复内容:
Mathematica代码较简洁
Det/@N@Range@9~Permutations~{9}~ArrayReshape~{9!,3,3}//Max
以上用Matlab暴力破解(枚举种情形),暂未输出行列式相同的其他情形,貌似基本秒出。
max_det = 0;
init_perm = reshape(1:9, [3, 3]);
all_perms = perms(1:9);
for i = 1:size(all_perms, 1)
matrix = all_perms(i, :);
matrix = reshape(matrix, [3, 3]);
det_value = det(matrix);
if det_value > max_det
max_det = det_value;
init_perm = matrix;
end
end
list = Permutations[Range[9], {9}];matrix = Partition[#, 3] & /@ list;
answer = Det /@ matrix;
m = Max[answer];
pos = Flatten[Position[answer, m]];
matrix[[#]] & /@ pos 贴个毫无技术含量暴力程度max的python版。。。
import itertools
import time
def max_matrix():
begin = time.time()
elements = [1, 2, 3, 4, 5, 6, 7, 8, 9]
maxdet = 0
maxmat = []
for i in itertools.permutations(elements, 9):
det = i[0] * i[4] * i[8] + i[1] * i[5] * i[6] + i[2] * i[3] * i[7] - i[2] * i[4] * i[6] - i[1] * i[3] * i[8] - i[0] * i[5] * i[7]
if(det > maxdet):
maxdet = det
maxmat = []
for j in range(0, 9):
maxmat.append(i[j])
print "|" + str(maxmat[0]) + " " + str(maxmat[1]) + " " + str(maxmat[2]) + "|"
print "|" + str(maxmat[3]) + " " + str(maxmat[4]) + " " + str(maxmat[5]) + "| = " + str(maxdet)
print "|" + str(maxmat[6]) + " " + str(maxmat[7]) + " " + str(maxmat[8]) + "|"
end = time.time()
print str(end - begin) + 's used.'
if __name__ == '__main__':
max_matrix()
题目应该改成1 2 3 ...n^2组成n阶行列式的最大值。并求最优解的时间复杂度才有意思。
C++:#include
#include
using namespace std;
int ans, a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int main() {
do
ans = max(ans, a[0] * (a[4] * a[8] - a[5] * a[7]) +
a[1] * (a[5] * a[6] - a[3] * a[8]) +
a[2] * (a[3] * a[7] - a[4] * a[6]));
while (next_permutation(a, a + 9));
printf("%d\n", ans);
}
把yellow的答案重排一下可得9 4 2
3 8 6
5 1 7
很容易看出思路了。
1.所有数按大小在斜率为-1的对角线上依次排开。(即:987在一条对角线,654在一条,321在一条)很容易看出这是让正向数值最大的方法。
2.对于反向的对角线,排除主对角线之外的任意两个数之和相等,且乘积越大的,相应的主对角线元素越小。(也就是让三个乘积的最大值最小,然后最大的结果再和最小的数相配这样)
但是以上方法仅限于1~9的3x3矩阵,对于其它的矩阵不一定适用。
因为显然这种方法要求正向和负向都只有对角线(或平行于对角线),但是4x4的行列式就开始有拐弯了。。。
然后,我感觉还有三个漏洞,一是贪心法不一定保证正向最大,也不一定保证反向最小,更不一定保证正反向之差最大。(不一定都是漏洞,可能有的是恒成立的)
但是我感觉对3x3的非负矩阵来说,贪心在多数情况下是可以拿到最大值的。
PS:试了很多组数,都是这个解,然后又试了一组[1 2 3 4 5 6 7 8 100],显然答案发生了变化,因为100的权值比8和7大太多,所以负向的时候直接就把2和1给了100。那么这也就证明了贪心法确实有时候得不到最大值。 前面已经有了python,c和MMA的代码了,我来一发matlab的吧
p=perms(1:9);
[n,~]=size(p);
z=zeros(n,1);
for i=1:n
z(i)=det(reshape(p(i,:),3,3));
end
max(z)
id=find(z==max(z));
for i=1:length(id)
disp(reshape(p(id(i),:),3,3));
end
对于三阶的穷举,可以不用det函数会比较简单:p = reshape(perms(1:9),'',3,3);
M = max(sum(prod(p,2),3)-sum(prod(p,3),2));
话题的语言还少个Mathematica,就我来吧直接9!个结果存下来刚正面,0优化
Det[Partition[#, 3]] & /@ Permutations[Range[9]] // Max
412
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
上一篇: html/css 两个div在同一行
下一篇: python爬虫时常用的库的相关介绍
推荐阅读
-
python3 题目 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
-
C_100_01有1、2、3、4这四个数字,能组成多少个互不相同且无重复数字的三位数,都是多少?
-
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?用C语言实现
-
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
-
php将一维数组转换为每3个连续值组成的二维数组 php遍历二维数组 php 定义二维数组 php二维数组添加元
-
php将一维数组转换为每3个连续值组成的二维数组 php遍历二维数组 php 定义二维数组 php二维数组添加元
-
php将一维数组转换为每3个连续值组成的二维数组,维数二维数组
-
将数组的值作为键,然后填充一个值组成新的数组,怎么做?以这个为例如何得到$a3?
-
123456789组成的3×3的矩阵的行列式最大的值是多少?
-
将数组的值作为键,然后填充一个值组成新的数组,怎么做?以这个为例如何得到$a3?
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论