MATLAB 优化算法:从 Excel 表格中找到数据之和最大且路径最短的路径
非常抱歉之前的回答没有满足您的需求。以下是基于您的新问题重新实现的 MATLAB 代码,以找到满足条件的路径:
% 读取 Excel 表格数据
data = xlsread('your_file.xlsx', 'Sheet1'); % 假设数据在第一个 sheet 中
% 定义起点和终点坐标
start_point = [91, 20];
end_point = [1, 140];
% 定义矩阵大小
matrix_size = size(data);
% 创建矩阵用于存储每个点的累计数据之和
sum_matrix = zeros(matrix_size(1), matrix_size(2));
% 创建矩阵用于存储路径上的点数
count_matrix = inf(matrix_size(1), matrix_size(2));
count_matrix(start_point(1), start_point(2)) = 0;
% 计算累计数据之和和途径的点数
for i = start_point(1):matrix_size(1)
    for j = start_point(2):matrix_size(2)
        
        if i == start_point(1) && j == start_point(2)
            sum_matrix(i, j) = data(i, j);
            continue; % 跳过起始点
        end
        
        % 计算上方和左方的路径
        if i > start_point(1) && j > start_point(2)
            sum_val1 = sum_matrix(i-1, j) + data(i, j);
            sum_val2 = sum_matrix(i, j-1) + data(i, j);
            if sum_val1 > sum_val2
                sum_matrix(i, j) = sum_val1;
                count_matrix(i, j) = count_matrix(i-1, j) + 1;
            else
                sum_matrix(i, j) = sum_val2;
                count_matrix(i, j) = count_matrix(i, j-1) + 1;
            end
        elseif i > start_point(1)
            sum_matrix(i, j) = sum_matrix(i-1, j) + data(i, j);
            count_matrix(i, j) = count_matrix(i-1, j) + 1;
        elseif j > start_point(2)
            sum_matrix(i, j) = sum_matrix(i, j-1) + data(i, j);
            count_matrix(i, j) = count_matrix(i, j-1) + 1;
        end
        
    end
end
% 输出路径上的点数和数据之和
disp(['路径上的点数:', num2str(count_matrix(end_point(1), end_point(2)) - count_matrix(start_point(1), start_point(2)))]);
disp(['路径上的数据之和:', num2str(sum_matrix(end_point(1), end_point(2)) - sum_matrix(start_point(1), start_point(2)))]);
% 获取路径上的点的坐标
path = [end_point];
current_point = end_point;
while true
    if current_point(1) > start_point(1) && current_point(2) > start_point(2)
        if sum_matrix(current_point(1)-1, current_point(2)) > sum_matrix(current_point(1), current_point(2)-1)
            current_point = [current_point(1)-1, current_point(2)];
        else
            current_point = [current_point(1), current_point(2)-1];
        end
    elseif current_point(1) > start_point(1)
        current_point = [current_point(1)-1, current_point(2)];
    elseif current_point(2) > start_point(2)
        current_point = [current_point(1), current_point(2)-1];
    else
        break;
    end
    path = [current_point; path];
end
% 调整路径的坐标为实际坐标
path = path + repmat(start_point - [1, 1], size(path, 1), 1);
% 输出途径的点的坐标
disp('途径的点的坐标:');
disp(path);
在这个示例中,我们首先从 Excel 表格中读取数据,并定义起点和终点的坐标。然后,我们创建了两个矩阵 sum_matrix 和 count_matrix,分别用于存储每个点的累计数据之和和途径的点数。
接下来,我们使用动态规划算法计算每个点的累计数据之和和途径的点数。我们遍历所有可能的路径,并选择累计数据之和最大且途径的点数最少的路径。
然后,我们输出路径上的点数和数据之和,并使用回溯的方法获取路径上的点的坐标。最后,我们根据起点的坐标调整路径的坐标为实际坐标,并输出途径的点的坐标。
请注意,这段代码假设您的 Excel 数据已经存储在 data 变量中,并且数据在矩阵中的行列顺序与 Excel 表格中的顺序相同。
希望这次回答能够满足您的需求,如有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/NPD 著作权归作者所有。请勿转载和采集!