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 | |
工厂1 | 464 | 513 | 654 | 867 |
工厂2 | 352 | 416 | 690 | 791 |
工厂3 | 995 | 682 | 388 | 685 |
二、小白代码部分/(ㄒ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
三、代码运行结果
如果有错误还望大佬指出!!!