【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


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