一、安装Cplex
Cplex 是一款商业化的规划问题求解器,支持python和matlab等常用语言,功能非常强大。可以根据需求在官网上下载到对应的版本。community-edition可以免费试用,但最多只能计算1000个变量或1000个约束条件的优化问题。
点击此处进入IMB官网进行下载:Cplex官方下载地址
二、将安装好的Cplex添加到路径
安装好之后,打开Cplex文件夹(根据你安装的位置而定),里面有一个matlab文件夹,打开matlab之和,通过添加路径的方法将“…\cplex\matlab”文件夹和其中包含的子文件夹都添加到matlab的路径之中。
三、验证是否配置成功
方法1:在命令行输入:doc cplex
如果安装成功会显示Cplex的帮助文档。
但是请注意: 做到这一步只能说明matlab配置好了Cplex求解器,但是不能保证matlab+yalmib+cplex能够运行。因为三者各版本的兼容性不一样,比如说编者用的Matlab2019a,只能兼容Cplex12.8和与其对应的yalmib版本。换成其他版本虽然安装成功,但是后续可能无法使用。
方法二、安装好yamlib后,通过test来查看已经安装的求解器
详细过程见 yamlib的安装
yalmib的安装过程和Cplex类似:
一、下载安装:点击进入yalmib官网下载地址
二、将安装好的文件放入matlab安装路径下的toolbox文件夹。
三、将按照好的文件添加到matlab路径
四、使用test进行测试
根据这个结果,可以查看yalmib能够调用的求解器,显示了CPLEX-IBM,说明matlab+cplex+yalmib的环境已经配置好。
目标函数:成本最小+时间最短
minZ_1=∑_(i∈I)▒〖f_i X〗i +∑(i∈I)▒〖〖∑_(k∈K)▒h_i^k S〗i^k X_i 〗+ω∑(i∈I)▒∑_(j∈J)▒∑_(k∈K)▒〖C_j^k q〗_ij^k 〖(d〗_ij/v_ij-T)
约束条件:
0≤S_ik≤D_ik,∀i∈I,∀k∈K (3-2)
式(3-2)表示储备库 中第 类物资的存储量不超过其最大存储能力。
∑_(j∈J)▒〖〖C_j^k q〗ijk≤S_ik,∀i∈I〗,∀k∈K (3-3)
式(3-3)表示从储备库 送往所有需求点的第 类物资数量不超过其最大储存能力。
∑(i∈I)▒〖q_ij^k=1,∀j∈J,∀k∈K〗 (3-4)
式(3-4)表示所有应急医疗物资储备库向应急物资需求点 提供第 类物资数量之和等于 点第 类物资需求数。
0≤q_ij^k≤1,∀i∈I,∀j∈J,∀k∈K (3-5)
式(3-5)表示应急医疗物资储备库 向应急物资需求点 提供第 类物资的数量不大于 点第 类的物资需求数。
0≤q_ij^k≤X_i,∀i∈I,∀j∈J,∀k∈K (3-6)
式(3-6)表示仅当应急储备库 被选址时,应急储备库才能提供应急物资。
∑_(i=1)^m▒〖X_i≤P〗 (3-7)
式(3-7)表示所选中的储备库 总数不大于上限P个。
X_i∈{0,1},∀i∈I (3-8)
式(3-8)表示X_i为 整数决策变量。
代码实现(全部代码请私聊):
clc
close all
clear all
warning off
%% 读取原始数据
%% 数据路径
filepath='data.xlsx';
%% 读取数据保存到结构体data中
[need_data,need_txt]=xlsread(filepath,'受灾区域物资需求量');
%step2 参数设置
% load data.mat
supplies=[supply.capacity];
demands=[demand.constant];
f=[supply.cost];
%% 变量定义
x = binvar(Supply_num_all, 1);%
y = sdpvar(Demand_num, Supply_num_all);
%% 添加约束条件
F = [x(1)+x(2)+x(3)+x(4)+x(5)+x(6)+...
x(7)+x(8)+x(9)+x(10)<=P,...
y(1,1)+y(1,2)+y(1,3)+y(1,4)+y(1,5)+y(1,6)+...
y(1,7)+y(1,8)+y(1,9)+y(1,10)==demands(1),
.
.
.
.................................等式约束.................................
y(1,1)+ y(2,1)+y(3,1)+y(4,1)+y(5,1)+y(6,1)+...
y(7,1)+y(8,1)+y(9,1)+y(10,1)+y(11,1)<=x(1)*supplies(1),...
.
.
.
.................................不等式约束................................. ];
% %设置不确定集合,此示例为box类型
% % W = [0<=w(1)<=40,0<=w(2)<=40,0<=w(3)<=40,uncertain(w)];
% W = [-20<=w<=20,uncertain(w)]; %uncertain(w)指明不确定性
options = sdpsettings('solver','cplex'); %设置求解器为cplex
u=0.5;
f1=sum(x.*f');
f2=hik*sum(sum(y));
T_thre=get_T_thre(dist,Vij,T);
f3=u*w*sum(sum(T_thre.*y));
f4=(1-u)*cijk*sum(sum(dist.*y));
objective =sum(f1+f2+f3+f4); %目标函数 最小化优化变量累加和
sol=optimize(F,objective,options); %优化求解
结果展示
CPXPARAM_MIP_Display 1
Tried aggregator 1 time.
MIP Presolve eliminated 110 rows and 0 columns.
Reduced MIP has 22 rows, 120 columns, and 240 nonzeros.
Reduced MIP has 10 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.02 sec. (0.13 ticks)
Probing time = 0.00 sec. (0.01 ticks)
Tried aggregator 1 time.
Reduced MIP has 22 rows, 120 columns, and 240 nonzeros.
Reduced MIP has 10 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.00 sec. (0.11 ticks)
Probing time = 0.00 sec. (0.01 ticks)
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 8 threads.
Node log . . .
Best integer = 1.159707e+04 Node = 0 Best node = 0.000000e+00
Best integer = 4.498184e+03 Node = 0 Best node = 0.000000e+00
Best integer = 3.384569e+03 Node = 0 Best node = 3.138971e+03
Best integer = 3.202350e+03 Node = 0 Best node = 3.202350e+03
Implied bound cuts applied: 16
Mixed integer rounding cuts applied: 2
Gomory fractional cuts applied: 3
有错误之处还请批评指正。
有朋友反映说下载不了Cplex和yalmib;
这里提供一个适配matlab2019以后的Cplex+yalmib版本