我要找出一个方阵的最大值。这个矩阵是对角线上有0的数据。行和列是成对的,所以重新排列矩阵是不建议的,也就是我在做比较分析。我翻转了一行和相应列中所有值的符号然后对矩阵求和。
我们可以改变行-列对的符号。例如,我们可以把+9换成-9,或者把-3换成+3。这样做的“规则”是转换
全部的
行-列
一对
这是我的标志。因此,第3列和第5列将与第3行和第5行一起切换符号。这意味着可能存在2^N个符号置换。11,11-1,11-1,11-1,11-1-1,1-1-1等等,就像在二进制中计数一样。
我想知道哪个[-1-1等]sudo二进制序列数组会导致矩阵的最大和。
现在,对于一个51 x 51的输入矩阵,这个过程预计在i7英特尔处理器上需要78年,在512核集群上需要222天。有没有关于如何优化或缩小范围的想法?可能有某种蒙特卡罗方法我可以实现,只是不确定从哪里开始。另外,我知道该程序无法处理这个51 x 2^51二进制矩阵(已达到变量限制)。我也可以用python写这篇文章(可能需要考虑集群需求),但我只是在寻找一些算法帮助。谢谢^_^
我有以下代码:
Z=5;
原始矩阵=(-1*(眼睛(Z)-1)).*randi([-10],Z);
N=长度(原始矩阵);
二进制矩阵=dec2bin(2^N-1:-1:0)-'0';
ONEPOS=find(二进制矩阵==0);
二进制矩阵(ONEPOS)=-1;
M=长度(二进制矩阵);
抽搐
结果=总和(sum (OriginalMatrix));
勾号=0;
tick2 = 0;
MatrixDumb=原始矩阵;
对于i=1:M
multrow=二元矩阵(i,:);
对于j=1:N
矩阵dumb(:,j)=原始矩阵(:,j)*multrow(j);
终止
对于k=1:N
MatrixDumb(k,:)=MatrixDumb(k,:)*multrow(k);
勾号=勾号+1;
终止
BigSum=sum(sum(MatrixDumb));
如果BigSum>结果
结果=大和;
指数=i;
终止
tick2=tick2+1;
终止
toc