基于Matlab动态规划的二维矩阵最大和路
交易利他主义者 我试图在NxN的二维方阵中找到从左上角(0,0)到右下角(N-1,N-1)的最大和路径。我可以从点(I,j)移动到(I+1,j),(I,j+1),(I+1,j+1),(I-1,j),(I,j-1),(I-1,j-1),(I+1,j-1)和(I-1,j+1)的任意8个可能的方向,如果可能的方向在矩阵尺寸范围内。矩阵的所有元素都是正的,元素中没有重复 我在MATLAB中尝试了以下方法,得到了奇怪的结果,即从可能的8个方向中只得到两个方向。 另外,如果我能得到矩阵中任意点的最大和路径,这也会很有帮助基于Matlab动态规划的二维矩阵最大和路,matlab,max,dynamic-programming,Matlab,Max,Dynamic Programming,交易利他主义者 我试图在NxN的二维方阵中找到从左上角(0,0)到右下角(N-1,N-1)的最大和路径。我可以从点(I,j)移动到(I+1,j),(I,j+1),(I+1,j+1),(I-1,j),(I,j-1),(I-1,j-1),(I+1,j-1)和(I-1,j+1)的任意8个可能的方向,如果可能的方向在矩阵尺寸范围内。矩阵的所有元素都是正的,元素中没有重复 我在MATLAB中尝试了以下方法,得到了奇怪的结果,即从可能的8个方向中只得到两个方向。 另外,如果我能得到矩阵中任意点的最大和路径,
%% Main Dynamic Programming
A=int8(100*round((rand(5,5)),2)); % Cost Matrix
dp=zeros(size(A)); % Secondary matrix for keeping track of the costwhile
% traversing
direction=[1 1;0 1;1 0;-1 -1; -1 1;1 -1;-1 0;0 -1];% 8 possible move
for i=1:length(A)
for j=1:length(A)
neighbor_points=zeros(length(direction),2);
cost=zeros(1,length(direction));
current_point=[i j];
for n=1:length(direction)
neighbor_points(n,:)=current_point+direction(n,:);
neighborX =neighbor_points(n,1);
neighborY =neighbor_points(n,2);
if(neighborX >=1 && neighborX <=size_grid && neighborY
>=1 && neighborY <=size_grid)
cost(n)=dp(neighborX, neighborY);
end
end
[~,ind]=max(cost);
dp(i,j)=A(i,j)+dp(neighbor_points(ind,1),neighbor_points(ind,2));
fprintf('dp(%d,%d) is updated to %f.\n',i,j,dp(i,j));
end
end
%% Back Tracking from end point to start point
ii=1;
end_point=[length(A) length(A)];
Traject(ii,:)=end_point;
current_point=end_point;
while ii>0
ii=ii+1;
back_track=dp(current_point(1),current_point(2))-
A(current_point(1),current_point(2));
k=find(abs(dp-back_track)<10^-6) ;
[i, j] = ind2sub(size(A),k);
new_point=[i j];
disp(back_track)
%disp(new_point)
Traject(ii,:)=new_point;
if new_point(1)==1 && new_point(2)==1
break
end
current_point=new_point;
end
Trajectory=Traject;
%%主动态编程
A=int8(100*轮((兰特(5,5)),2));%成本矩阵
dp=零(尺寸(A));%用于跟踪成本的二次矩阵
%穿越
方向=[11;01;10;-1-1;-11;1-1;-10;0-1];%8可能的行动
对于i=1:长度(A)
对于j=1:长度(A)
相邻点=零(长度(方向),2);
成本=零(1,长度(方向));
当前_点=[i j];
对于n=1:长度(方向)
相邻_点(n,:)=当前_点+方向(n,:);
neighborX=相邻点(n,1);
邻域=邻域_点(n,2);
如果(neighborX>=1&&neighborX=1&&neighborY 0
ii=ii+1;
返回轨道=dp(当前点(1),当前点(2))-
A(当前_点(1)、当前_点(2));
k=find(abs(dp-back_track)“奇怪的结果”不是一个明确定义的问题。请给我们一个可再现的问题,示例输入和预期输出,而不是随机输入和未指定的输出。由于我的解释不好,我只朝两个方向移动(I,j+1)和(I+1,j-1)我尝试了不同的成本矩阵,但没有任何帮助。嗨,Wolfie,我编辑了这篇文章并附上了一张图片以方便使用。最长路径问题是NP难问题。我不希望任何O(n^2)算法来解决它。你能提供O(n^3)算法的伪代码吗