Algorithm 已求解-从受最大化约束的矩阵中查找列最大元素
我有一个nxn平方矩阵Algorithm 已求解-从受最大化约束的矩阵中查找列最大元素,algorithm,matlab,matrix,constraints,Algorithm,Matlab,Matrix,Constraints,我有一个nxn平方矩阵a由随机正数组成。我有一个函数需要最大化(为了简单起见,考虑它是所有输入),它的输入是矩阵的每一列中的一个元素。约束条件是这些输入的位置应该不同。例如,N=5 A = 0.43207 0.53996 0.68063 0.70952 0.6297 0.9656 0.72609 0.88174 0.50072 0.41381 0.47571 0.99
a
由随机正数组成。我有一个函数需要最大化(为了简单起见,考虑它是所有输入),它的输入是矩阵的每一列中的一个元素。约束条件是这些输入的位置应该不同。例如,N=5
A =
0.43207 0.53996 0.68063 0.70952 0.6297
0.9656 0.72609 0.88174 0.50072 0.41381
0.47571 0.99827 0.061184 0.93099 0.88015
0.98318 0.42879 0.56813 0.3835 0.0039668
0.30498 0.30033 0.76003 0.80426 0.84147
best =
4 3 2 1 5
bestA =
0.98318 0.99827 0.88174 0.70952 0.84147
现在我正在检查所有可能的组合。但随着矩阵大小的增加,例如N=10,搜索空间变为10!这对我的要求来说太贵了。我试图对矩阵进行排序并寻找模式,但我被困在排序后出现重复的情况中
>> [Asorted,I] = sort(A,1,'descend')
Asorted =
0.98318 0.99827 0.88174 0.93099 0.88015
0.9656 0.72609 0.76003 0.80426 0.84147
0.47571 0.53996 0.68063 0.70952 0.6297
0.43207 0.42879 0.56813 0.50072 0.41381
0.30498 0.30033 0.061184 0.3835 0.0039668
I =
4 3 2 3 3
2 2 5 5 5
3 1 1 1 1
1 4 4 2 2
5 5 3 4 4
有什么算法或直觉我可以遵循吗
我用的是MATLAB,但你可以用任何流行的编程语言来解释
编辑:矩阵已给定,随机生成。主要目标是最大化我上面提到的给定函数的输出,并找出输出最大的那些输入
编辑2:上述示例的示例MATLAB代码
N=5;
A=兰特(N,N)
梳子=烫发(1:N);
Sbest=-1;
i=1时:尺寸(梳,1)
x=梳子(i,:);
S=0;
对于i=1:N
S=S+A(x(i),i);
结束
如果S>Sbest
Sbest=S;最佳=x;
结束
结束
最好的
[Asorted,I]=排序(A,1,'down')
解决方案:正如@㪞עדברקן在评论中指出的,这可以使用匈牙利算法解决。一些资源是,关于算法,我怀疑可能有必要通过所有组合来找到最好的,即暴力。我不确定是否有任何图论算法直接适用于这个问题,但也许一些修改后的算法可以工作 从加速的角度来看,也许您可以通过将内部
for
循环替换为sum
来加速,即
for i=1:size(combs,1)
x = combs(i,:);
S = sum(A(((1:N)-1)*N + x));
if S > Sbest
Sbest=S;
best = x;
end
end
我不完全理解这个问题——你是在试图写一个函数来创建这样的随机矩阵吗?或者你得到了这样的随机矩阵,你想从中计算一些东西?@FangQ我已经在问题中添加了信息,你所说的“需要最大化的函数”是什么意思?最大化什么?你能定义你的目标函数吗?我假设您提供的函数用于生成矩阵。你是否在构造一个随机矩阵,以某种方式使一个度量最大化?在计算输入和的情况下,问题是gragh算法。这不是分配问题的一个例子,我们可以使用?我也认为没有必要遍历所有的梳。如果可能的话,我要的是一个算法。如果代码只停留在MATLAB中,那么您建议的加速效果很好,但在其他平台上则毫无用处。@titusarmah99我不确定
CVX
是否有助于解决此类优化问题。如果你知道的话,也许你可以试试看。我来看看。虽然我已经申请了一些。但它们都是次优算法。我想要一些能给出最好结果的具体算法result@titusarmah99也许你可以试试匹配对
,这是MATLAB的一个内置函数,可以解决线性赋值问题。我用的是R2018a,所以我没有,不过还是谢谢你。有很多实现