Chrysanthemum__ 2023-06-02 16:42 采纳率: 0%
浏览 32

【matlab】运输问题优化,错误使用 vertcat 要串联的数组的维度不一致。

错误显示:

second
错误使用 vertcat
要串联的数组的维度不一致。
出错 second (第 2 行)
city_data = [

代码:

% 数据预处理
city_data = [
    1    '分销商'    37    16    199
    2    '分销商'    63    2    219
    3    '分销商'    78    60    70
    4    '分销商'    8    40    200
    5    '分销商'    93    38    162
    6    '分销商'    78    72    85
    7    '分销商'    49    49    256
    8    '分销商'    44    49    287
    9    '分销商'    45    69    192
    10    '分销商'    31    64    193
    11    '总代理'    51    46    32
    12    '分销商'    51    15    194
    13    '一级代理'    82    19    191
    14    '分销商'    79    71    97
    15    '分销商'    64    2    160
    16    '分销商'    38    39    28
    17    '分销商'    81    13    84
    18    '分销商'    53    78    183
    19    '分销商'    35    57    158
    20    '分销商'    94    40    192
    21    '分销商'    88    38    131
    22    '分销商'    55    5    7
    23    '分销商'    62    55    170
    24    '分销商'    59    3    187
    25    '分销商'    21    6    136
    26    '分销商'    30    42    152
    27    '分销商'    47    8    149
    28    '分销商'    23    65    78
    29    '一级代理'    84    65    131
    30    '一级代理'    19    58    34
    31    '一级代理'    23    12    141
    32    '分销商'    17    53    6
    33    '分销商'    23    41    55
    34    '分销商'    44    78    9
    35    '分销商'    31    52    19
    36    '分销商'    92    64    165
    37    '分销商'    43    36    139
    38    '分销商'    18    35    63
    39    '分销商'    90    66    190
    40    '分销商'    98    7    7
    41    '分销商'    44    11    88
    42    '分销商'    11    14    76
    43    '分销商'    26    31    153
    44    '分销商'    41    67    159
    45    '分销商'    59    64    37
    46    '分销商'    26    5    98
    47    '分销商'    60    32    89
    48    '分销商'    71    42    129
    49    '分销商'    22    33    142
    50    '分销商'    12    53    151
    51    '分销商'    30    50    55
    52    '分销商'    32    23    136
    53    '分销商'    42    35    131
    54    '分销商'    51    1    33
    55    '分销商'    9    79    24
    56    '分销商'    26    13    100
    57    '分销商'    80    8    192
    58    '分销商'    3    30    68
    59    '分销商'    93    16    117
    60    '分销商'    73    39    45
    61    '分销商'    49    27    150
    62    '分销商'    58    76    51
    63    '分销商'    24    74    101
    64    '分销商'    46    4    140
    65    '分销商'    96    59    178
    66    '一级代理'    55    22    192
    67    '分销商'    52    34    109
    68    '分销商'    23    44    28
    69    '分销商'    49    75    30
    70    '分销商'    62    33    52
    71    '分销商'    68    79    168
    72    '分销商'    40    24    51
    73    '总代理'    37    56    163
    74    '分销商'    99    53    49
    75    '分销商'    4    43    186
    76    '分销商'    89    56    70
    77    '分销商'    91    53    39
    78    '分销商'    80    14    50
    79    '分销商'    10    10    123
    80    '分销商'    26    80    95
    81    '分销商'    34    14    70
    82    '分销商'    68    3    166
    83    '分销商'    14    45    117
    84    '分销商'    72    71    110
    85    '分销商'    11    54    183
    86    '分销商'    65    15    57
    87    '分销商'    49    30    151
    88    '分销商'    78    37    151
    89    '分销商'    72    79    76
    90    '分销商'    90    13    114
    91    '分销商'    89    68    15
];

num_city = size(city_data, 1);
num_first_agent = sum(strcmp(city_data(:,2), '一级代理'));
num_distributor = sum(strcmp(city_data(:,2), '分销商'));
num_total_agent = num_first_agent + num_distributor;

x_pos = city_data(:, 3);
y_pos = city_data(:, 4);

% 目标函数
objective = zeros(num_city, num_city);
for i = 1:num_city
    for j = 1:num_city
        objective(i, j) = sqrt((x_pos(i) - x_pos(j))^2 + (y_pos(i) - y_pos(j))^2);
    end
end

% 约束条件
A = [];
b = [];
Aeq = [];
beq = [];
lb = zeros(num_total_agent + num_first_agent + num_distributor, num_total_agent + num_first_agent + num_distributor);
ub = ones(num_total_agent + num_first_agent + num_distributor, num_total_agent + num_first_agent + num_distributor);
for i = 1:num_city
    if strcmp(city_data(i, 2), '分销商')
        distributor_idx = find(strcmp(city_data(:,2), '分销商'));
        distributor_idx = [distributor_idx; find(strcmp(city_data(:,2), '总代理'))];
        A = [A; zeros(1, num_total_agent + num_first_agent + num_distributor)];
        A(end, i) = 1;
        for j = 1:length(distributor_idx)
            A = [A; zeros(1, num_total_agent + num_first_agent + num_distributor)];
            A(end, distributor_idx(j)) = -1;
            A(end, i) = 1;
            b = [b; 0];
        end
        A = [A; zeros(1, num_total_agent + num_first_agent + num_distributor)];
        A(end, distributor_idx) = -1;
        A(end, i) = 1;
        b = [b; -1];
    elseif strcmp(city_data(i, 2), '总代理')
        Aeq = [Aeq; zeros(1, num_total_agent + num_first_agent + num_distributor)];
        Aeq(end, i) = 1;
    elseif strcmp(city_data(i, 2), '一级代理')
        first_agent_idx = find(strcmp(city_data(:,2), '一级代理'));
        A = [A; zeros(1, num_total_agent + num_first_agent + num_distributor)];
        A(end, i) = 1;
        for j = 1:length(first_agent_idx)
            A = [A; zeros(1, num_total_agent + num_first_agent + num_distributor)];
            A(end, first_agent_idx(j)) = -1;
            A(end, i) = 1;
            b = [b; 0];
        end
        A = [A; zeros(1, num_total_agent + num_first_agent + num_distributor)];
        A(end, first_agent_idx) = -1;
        A(end, i) = 1;
        b = [b; -1];
    end
end

% 求解
f = reshape(objective, num_city^2, 1);
A = sparse(A);
b = sparse(b);
Aeq = sparse(Aeq);
beq = sparse(beq);
lb = reshape(lb, num_total_agent + num_first_agent + num_distributor, num_total_agent + num_first_agent + num_distributor);
ub = reshape(ub, num_total_agent + num_first_agent + num_distributor, num_total_agent + num_first_agent + num_distributor);
x = intlinprog(f, 1:(num_total_agent + num_first_agent + num_distributor)^2, A, b, Aeq, beq, lb, ub);

% 输出结果
result = reshape(x, num_total_agent + num_first_agent + num_distributor, num_total_agent + num_first_agent + num_distributor);
for i = 1:num_city
    for j = 1:num_city
        if result(i, j) == 1
            fprintf('城市 %d 可以向城市 %d 转运\n', i, j);
        end
    end
end


  • 写回答

1条回答 默认 最新

  • 懒羊羊夸夸~ 2023-06-03 12:33
    关注

    下角标是从0开始,不是从1开始哦,第一列表为[:,0],第二列表为[:,1],依次后推

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月2日

悬赏问题

  • ¥15 求解答一下是否可以修改一个软件运行时生成的文件内部内置的文件创建时间?
  • ¥15 求在R环境下用corrplot画一个相关图
  • ¥20 WIN10蓝屏问题!
  • ¥15 Mac经常自动关机,再次打开后提示“电脑因出现问题而重新启动”
  • ¥60 使用ovito软件怎么得到金属玻璃的自由体积
  • ¥15 急!如何实现根据汇编指令推测硬件功能?
  • ¥20 excel处理10000万条数据方法
  • ¥15 hc32串口接收数据
  • ¥15 阻抗控制阻尼参数过小报错
  • ¥15 在Unity开发环境中用NPOI插件输出Word文档可以,当我打包到Windows系统软件的时候输出Word文档就出现文件损坏