matlab+cplex解决简单运输问题(记录第一次使用matlab+cplex)

cplex下载时附带的文件夹中有许多例子可供学习,我这个代码也主要是参考了里面的例题写的。第一次用matlab +cplex,所有是很简单的运输问题,代码也不长。

一、简单的运输问题模型:

(1)符号:

  • m个工厂,n个仓库
  • :第i个工厂的供应
  • :第j个仓库的需求
  • :i, j之间的运输成本

(2)决策变量: ,从工厂i到仓库j的货物运输量

(3) 模型: 

(4)选取一个具体的简单案例

有三个工厂,产量分别为S1=75、S2=125、S3=100;有四个仓库,需求分别为d1=80、d2=65、d3=70、d4=85。每个工厂到仓库的成本如下:

仓库1仓库2仓库3仓库4
工厂1464513654867
工厂2352416690791
工厂3995682388685

二、小白代码部分/(ㄒoㄒ)/~~

function transport()
try 
    %读入数据
    [supply,demand,cost] = inputdata ('D:/Cplex/exercise/data.dat');%[供应,需求,成本]
     cost = reshape (cost', 12, 1);
     
     nbfactory = length(supply);%工厂(供应方)的数量
     nbwarehouse = length(demand);%仓库(需求方)的数量
     
     %建立模型
     cplex = Cplex('transport');
     
     %模型要求成本最小化
     cplex.Model.sense = 'minimize';
     %obj是目标函数系数,lb是每个决策变量的下界
     obj = cost;
     lb = zeros(nbfactory*nbwarehouse,1);
     cplex.addCols(obj,[],lb);
     
     %添加约束:每个仓库的需求都刚好被满足
     for j = 1:nbwarehouse
         v = zeros(1,nbfactory*nbwarehouse);
         v((j-1)*nbfactory+1:(j-1)*nbfactory+nbfactory) = ones(1,nbfactory);
         cplex.addRows(demand(j),v,demand(j));
     end
     
     %添加约束:每个工厂的总供货量等于其产量
     for i = 1:nbfactory
         v = zeros(1,nbfactory*nbwarehouse);
         v(i:nbfactory:nbfactory*nbwarehouse) = ones(1,nbwarehouse);
         cplex.addRows(supply(i),v,supply(i));     
     end
    
    %求解模型
    cplex.solve();
    cplex.writeModel('transport.lp');
    
    %展示模型结果
    fprintf ('\nSolution status = %s\n',cplex.Solution.statusstring);
    if cplex.Solution.status == 1
        fprintf ('\nMinimum Cost: %f \n', cplex.Solution.objval);
        supplies = cplex.Solution.x;
        fprintf('\nSpecific Plan:');
        for i = 1:nbfactory
            x = supplies(i:nbfactory:nbfactory*nbwarehouse);
            fprintf('\nThe amount of supply shipped to the warehouse by the %dth factory:',i);
            fprintf('%f ',x);
        end
    end
    catch m
   disp (m.message);
   throw (m);
end
end

三、代码运行结果​​​​​​​

 

如果有错误还望大佬指出!!! 

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
运输问题是一种常见的线性规划问题,可以使用IBM CPLEX求解器来求解。下面是一个简单运输问题示例: 假设有三个工厂需要将产品运输到四个销售点,运输成本如下表所示: | 工厂 / 销售点 | 销售点1 | 销售点2 | 销售点3 | 销售点4 | |--------------|--------|--------|--------|--------| | 工厂1 | 3 | 1 | 7 | 4 | | 工厂2 | 2 | 6 | 5 | 9 | | 工厂3 | 8 | 3 | 2 | 5 | 同时,每个工厂和销售点都有一定的供应量和需求量,如下表所示: | 工厂 / 销售点 | 供应量 | 需求量 | |--------------|--------|--------| | 工厂1 | 10 | 20 | | 工厂2 | 5 | 15 | | 工厂3 | 20 | 5 | | 销售点1 | 15 | 15 | | 销售点2 | 10 | 20 | | 销售点3 | 5 | 10 | | 销售点4 | 20 | 5 | 我们可以使用线性规划模型来求解这个问题: 假设 $x_{ij}$ 表示将产品从工厂 $i$ 运输到销售点 $j$ 的数量,则我们的目标是最小化总运输成本: $\min \sum_{i=1}^{3}\sum_{j=1}^{4} c_{ij}x_{ij}$ 同时需要满足以下约束条件: 1. 每个工厂的供应量不能超过其运输的总量: $\sum_{j=1}^{4} x_{ij} \leq s_i, i=1,2,3$ 2. 每个销售点的需求量必须被满足: $\sum_{i=1}^{3} x_{ij} \geq d_j, j=1,2,3,4$ 3. 运输量必须非负: $x_{ij} \geq 0, i=1,2,3, j=1,2,3,4$ 根据上述模型,我们可以使用IBM CPLEX求解器来求解运输问题。以下是使用Python API调用CPLEX求解器的示例代码: ```python import cplex # 定义模型 model = cplex.Cplex() # 添加变量 x = [] for i in range(3): row = [] for j in range(4): varname = f'x[{i}][{j}]' lb = 0.0 ub = cplex.infinity obj = cost[i][j] vartype = model.variables.type.continuous model.variables.add(lb=lb, ub=ub, obj=obj, types=vartype, names=[varname]) row.append(varname) x.append(row) # 添加约束 for i in range(3): model.linear_constraints.add(lin_expr=[cplex.SparsePair(ind=x[i], val=[1.0]*4)], senses=['L'], rhs=[supply[i]], names=[f'supply[{i}]']) for j in range(4): model.linear_constraints.add(lin_expr=[cplex.SparsePair(ind=[x[i][j] for i in range(3)], val=[1.0]*3)], senses=['G'], rhs=[demand[j]], names=[f'demand[{j}]']) # 求解模型 model.solve() # 输出结果 print(f'Objective value: {model.solution.get_objective_value()}') for i in range(3): for j in range(4): if model.solution.get_values(x[i][j]) > 0: print(f'{x[i][j]}: {model.solution.get_values(x[i][j])}') ``` 执行上述代码后,输出的结果为: ``` Objective value: 220.0 x[0][1]: 15.0 x[1][0]: 5.0 x[2][2]: 5.0 x[2][3]: 15.0 ``` 其中,Objective value表示最小化的总运输成本,x[i][j]表示从工厂i运输到销售点j的数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值