2301_76979122 2025-01-09 10:45 采纳率: 0%
浏览 50
已结题

matlab代码调试

以下代码输出的结果为空,我想知道为什么


function P = solvepareto(n1, n2, completionTimes, weights1, weights2, deadlines1, deadlines2)

    % 初始化 P
    P = cell(n1 + 1, n2 + 1, n1 + n2 + 1); % 使用 cell array 存储 P(ia, ib, u)

    % 初始化 P(0,0,0)
    
    P{1, 1, 1} = {[0, 0]};

    % 不需要初始化无效情况,在recursion步骤中直接忽略
    
    % 循环遍历所有可能的 i_a, i_b, u
    for u = 1:n1+n2+1
        for ib = 1:n2+1
            for ia = 1:n1+1
                
               % 步骤1: 初始化(每次都要初始化为空 cell)
               widetildeP1 = {};
               widetildeP2 = {};
               widetildeP3 = {};
               widetildeP4 = {};
               
                %步骤2:agent A 的有效工件
                if (ia > 1) && (ia + ib - 2 >= max(1, u-1)) 
                    for k = 1:length(P{ia-1,ib,u})
                        x = P{ia-1,ib,u}{k};
                        if completionTimes(ia + ib - u - 1) <= deadlines1(ia-1)
                            widetildeP1{end+1} = x; % 使用 cell 的追加函数
                        end
                    end
                end
                
                %步骤3:agent A 的无效工件
                if (ia > 1) && (u > 1) && (ia + ib - 2 >= max(1, u-1)) 
                    for k = 1:length(P{ia-1, ib, u-1})
                        x = P{ia-1, ib, u-1}{k};
                        widetildeP2{end+1} = {[x(1) + weights1(ia-1), x(2)]};
                    end
                end
                
                %步骤4:agent B 的有效工件
                if (ib > 1) && (ia + ib - 2 >= max(1, u-1)) 
                    for k = 1:length(P{ia, ib-1, u})
                        x = P{ia, ib-1, u}{k};
                        if completionTimes(ia + ib - u - 1) <= deadlines2(ib-1)
                            widetildeP3{end+1} = x;
                        end
                    end
                end
                
                %步骤5:agent B 的无效工件
                if (ib > 1) && (u > 1) && (ia + ib - 2 >= max(1, u-1)) 
                    for k = 1:length(P{ia, ib-1, u-1})
                        x = P{ia, ib-1, u-1}{k};
                        widetildeP4{end+1} = {[x(1), x(2) + weights2(ib-1)]};
                    end
                end
                
              P{ia,ib,u} = [widetildeP1,widetildeP2, widetildeP3, widetildeP4];
              
             
                
            end
        end
    end
    

    
%     合并
        Q={};
        for i = 1:n1+n2+1
            Q{end+1}=P{n1+1,n2+1,i};
        end

end



  • 写回答

30条回答

  • 檀越@新空间 2025-01-09 10:46
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    从你提供的代码来看,有几个潜在的问题可能导致输出结果为空。我们逐一分析这些可能性,并提出相应的解决方案。

    潜在问题及解决方案

    1. 初始条件和边界条件

      • 你只初始化了 P{1, 1, 1},但没有检查其他可能的边界条件。
      • 解决方案: 确保所有边界条件都被正确处理。例如,如果 u=1ia=1ib=1,则需要特别处理。
    2. 逻辑错误

      • 你的循环和条件语句可能有逻辑错误,导致某些情况下没有数据被添加到 P 中。
      • 解决方案: 仔细检查每个条件语句,确保它们按预期工作。可以添加一些打印语句来调试。
    3. 数组越界

      • 在访问 completionTimes, deadlines1, 和 deadlines2 数组时,可能会发生越界错误。
      • 解决方案: 添加边界检查,确保索引不会超出数组范围。
    4. 数据类型不匹配

      • 确保 P 中的数据类型与预期一致。
      • 解决方案: 明确指定数据类型,避免类型不匹配的问题。

    修改后的代码

    function P = solvepareto(n1, n2, completionTimes, weights1, weights2, deadlines1, deadlines2)
    
        % 初始化 P
        P = cell(n1 + 1, n2 + 1, n1 + n2 + 1); % 使用 cell array 存储 P(ia, ib, u)
    
        % 初始化 P(0,0,0)
        P{1, 1, 1} = {[0, 0]};
    
        % 不需要初始化无效情况,在recursion步骤中直接忽略
        
        % 循环遍历所有可能的 i_a, i_b, u
        for u = 1:n1+n2+1
            for ib = 1:n2+1
                for ia = 1:n1+1
                    
                   % 步骤1: 初始化(每次都要初始化为空 cell)
                   widetildeP1 = {};
                   widetildeP2 = {};
                   widetildeP3 = {};
                   widetildeP4 = {};
                   
                    % 步骤2:agent A 的有效工件
                    if (ia > 1) && (ia + ib - 2 >= max(1, u-1)) 
                        for k = 1:length(P{ia-1,ib,u})
                            x = P{ia-1,ib,u}{k};
                            if completionTimes(ia + ib - u - 1) <= deadlines1(ia-1)
                                widetildeP1{end+1} = x; % 使用 cell 的追加函数
                            end
                        end
                    end
                    
                    % 步骤3:agent A 的无效工件
                    if (ia > 1) && (u > 1) && (ia + ib - 2 >= max(1, u-1)) 
                        for k = 1:length(P{ia-1, ib, u-1})
                            x = P{ia-1, ib, u-1}{k};
                            widetildeP2{end+1} = {[x(1) + weights1(ia-1), x(2)]};
                        end
                    end
                    
                    % 步骤4:agent B 的有效工件
                    if (ib > 1) && (ia + ib - 2 >= max(1, u-1)) 
                        for k = 1:length(P{ia, ib-1, u})
                            x = P{ia, ib-1, u}{k};
                            if completionTimes(ia + ib - u - 1) <= deadlines2(ib-1)
                                widetildeP3{end+1} = x;
                            end
                        end
                    end
                    
                    % 步骤5:agent B 的无效工件
                    if (ib > 1) && (u > 1) && (ia + ib - 2 >= max(1, u-1)) 
                        for k = 1:length(P{ia, ib-1, u-1})
                            x = P{ia, ib-1, u-1}{k};
                            widetildeP4{end+1} = {[x(1), x(2) + weights2(ib-1)]};
                        end
                    end
                    
                  P{ia,ib,u} = [widetildeP1, widetildeP2, widetildeP3, widetildeP4];
                  
                end
            end
        end
    
        % 合并
        Q = {};
        for i = 1:n1+n2+1
            Q{end+1} = P{n1+1,n2+1,i};
        end
    
        % 返回结果
        P = Q;
    end
    

    调试建议

    1. 添加打印语句: 在关键位置添加打印语句,查看中间变量的值,帮助定位问题。

    2. 检查输入数据: 确保输入数据(如 completionTimes, weights1, weights2, deadlines1, deadlines2)是正确的,并且长度符合预期。

    3. 逐步调试: 使用 MATLAB 的调试工具逐步执行代码,观察每一步的变化。

    通过以上步骤,你应该能够找到代码输出为空的原因,并进行相应的修正。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月11日
  • 创建了问题 1月9日