用Octave计算运输问题(整数规划法)
广告
{{v.name}}
运输问题通常可以看作整数规划问题。
运输问题是最小化线性规划问题。
运输问题的约束是等式约束。
代码如下:
function [opt_x, min_cost, status, extra] = transport_lp(a, b, c)
    % 运输问题线性规划求解
    % 输入:
    %   a: m×1数组,产地产量(m个产地)
    %   b: n×1数组,销地销量(n个销地)
    %   c: m×n矩阵,单位运费矩阵(c(i,j)=A_i→B_j的单位运费)
    % 输出:
    %   min_cost: 最小总运费
    %   opt_x: m×n矩阵,最优调运量矩阵
    
    m = length(a); n = length(b);
    total_a = sum(a); total_b = sum(b);
    c_vec = reshape(c', [], 1); % 将单位运费矩阵转为列向量(决策变量顺序:x11,x12,...,xmn)
    
    % 1. 构建约束矩阵A_eq和约束值b_eq(平衡/不平衡统一处理)
    % 产量约束:每行调运量和=产量,共m行
    A1 = kron(eye(m), ones(1,n));
    b1 = a;
    % 销量约束:每列调运量和=销量,共n行
    A2 = kron(ones(1,m), eye(n));
    b2 = b;
    % 合并约束
    A_eq = [A1; A2];
    b_eq = [b1; b2];
    
    % 2. 非负约束
    lb = zeros(m*n, 1); % 调运量≥0
    ub = [];
    
    % 3. 调用线性规划求解(最小化)
    ctype = repmat('S', m+n, 1); % 等式约束
    vartype = repmat('I', m*n, 1); % 整数变量
    s = 1; % 最小化模型
    param.lpsolver = 1;
    param.itlim = 100;

    [xmin, min_cost, status, extra] = ...
        glpk (c_vec, A_eq, b_eq, lb, ub, ctype, vartype, s, param);
    opt_x = (reshape(xmin, n, m))'; % 转为调运量矩阵
end
结果如下:
>> [opt_x, min_cost, status, extra] = transport_lp([30;50;20], [60;40], [2 3;1 4;5 2])
opt_x =

   10   20
   50    0
    0   20

min_cost = 170
status = 0
extra =

  scalar structure containing the fields:

    time = 0
    status = 5
友链