# 1️⃣ 问题陈述
## 1️⃣.1️⃣ 需要解决的问题
  目前地铁一般采用如下的**单一交路**
:
目前,我国绝大多数城市都采用这种交路形式,但是当断面客流量分布不均匀时容易造成线路运能浪费,客流拥挤。
替代方案就是用**大小交路**:


使用遗传算法程序就是在既定的OD矩阵下找到最优的大小交路的往返站$S_a,S_b$以及相应的大小交路的发车频率$f_1,f_2$,也就是在遗传算法每次运行中,根据不同的大小交路折返站的设置,划分预定的OD出行矩阵,然后计算目标函数,判断是否达到最优。
## 1️⃣.2️⃣ 变量定义
- $Q_1$——出行$O$点或$D$点位于小交路覆盖区段外出行以及$OD$均位于小交路覆盖区段外的客流量,人;
- $Q_2$——出行$OD$位于小交路覆盖区段的客流量,人;
- $t_{1d}、t_{2d}$——$Q_1、Q_2$对应乘客的平均候车时间,$s$;
- $q_{od}$——在车站$o$上车,在车站$d$下车的客流量,人;
- $i$——列车交路的集合,$i=\{1,2\}$,$1$代表大交路,$2$代表小交路;
- $f_i$——大小交路运行方式下的交路i的发车频率,对/小时;
- $f$——单一交路运行方式下的发车频率,对/小时;
- $f_{min}$——最小发车频率,设置为$12$对/小时;
- $T_{1周}、T_{2周}$——大小交路列车周转时间,$s$;
- $t_{运,j}$——列车在区间$j$的纯运行时间,$s$;
- $t_{停,j}$——列车在车站$h$的停站时间,$s$,设置为$30s$;
- $t_{折}$——列车在终点站、中间站的最小折返间隔时间,$s$,设置为$120s$;
- $C_z$——列车定员,即标准载客人数,人,设置为$1460$;
- $\alpha$——列车满载率上限,设置为100%;
- $I_o$——列车最小追踪间隔,$s$,设置为$120s$;
## 1️⃣.3️⃣ 目标函数
$$\min _{Z}=Q_{1} \cdot t_{1 d}+Q_{2} \cdot t_{2 d}$$
其中
$$Q_{1}=\sum_{d=1}^{n} \sum_{o=1}^{n} q_{o d}-Q_{2}\\Q_{2=} \sum_{d=o+1}^{b} \sum_{o=a}^{b-1} q_{o, d}+\sum_{d=a}^{o-1} \sum_{o=a+1}^{b} q_{o, d}$$
$$t_{2 d}=\frac{1}{2} \cdot \frac{60}{f_{1}+f_{2}}\\ \\t_{1 d}=\frac{1}{2} \cdot \frac{60}{f}$$
## 1️⃣.4️⃣ 约束条件
- 列车数量
$$\left[\frac{T_{\text {周1}}}{60} \cdot f_{1}\right]+\left[\frac{T_{\text {周} 2}}{60} \cdot f_{2}\right] \leq\left[\frac{T_{\text {周} 1}}{60} \cdot f\right]$$
其中
$$T_{\text {周} 1}=2 \cdot\left(\sum_{j=1}^{n-1} t_{\text {运}},_{j}+\sum_{h=1}^{n} t_{\text {停, } h}+\sum t_{\text {折}}\right)\\T_{\text {周} 2}=2 \cdot\left(\sum_{j=a}^{b-1} t_{\text {运}},_{j}+\sum_{h=a}^{b} t_{\text {停, } h}+\sum t^{'}_{\text {折}}\right)$$
- 满载率约束
$$\max _{j}\left(\sum_{d=j+1}^{n} \sum_{o=1}^{j} q_{o d} / \sum_{i=1}^{2} f_{i} \cdot \sum_{d=1}^{j} \sum_{o=j+1}^{n} q_{o d} / \sum_{i=1}^{2} f_{i}\right) \leq \alpha \cdot C_z$$
- 满足最小追踪间隔
$$f_{1}+f_{2} \leq \frac{3600}{I_{0}}$$
- 折返站折返能力
$$f_1\le\frac{3600}{t_{折}}\\f_2\le\frac{3600}{t_折}$$
- 满足最小发车频率
$$f_1>=f_{min}$$
- 其他约束
$$f_i\in N\\ 1\le a<b\le n$$
# 2️⃣ `MATLAB`程序
所有的程序以及数据,OD出行矩阵以及区间运行时间在:[列车交路方案优化遗传算法程序](https://github.com/ExcaliburEX/Graduation-Design-and-MATLAB-Code-/tree/master/%E5%88%97%E8%BD%A6%E4%BA%A4%E8%B7%AF%E6%96%B9%E6%A1%88%E4%BC%98%E5%8C%96%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95%E7%A8%8B%E5%BA%8F)
## 2️⃣.1️⃣ `myself.m`——主脚本
主脚本,`OD`矩阵可以使用`od.m`脚本随机生成。
```python
clear;clc;close all;
%% 生成随机OD矩阵
%od()
%%遗传参数设置
NUMPOP=200;%初始种群大小
irange_l=1; %问题解区间
irange_r=35;
LENGTH=24; %二进制编码长度
ITERATION = 10000;%迭代次数
CROSSOVERRATE = 0.8;%杂交率
SELECTRATE = 0.4;%选择率
VARIATIONRATE = 0.2;%变异率
OD = xlsread('OD.xlsx');% 苏州地铁2号线调查问卷OD出行矩阵
h = xlsread('区间运行时间.xlsx'); % 苏州地铁2号线区间长度及运行时分
%初始化种群
pop=m_InitPop(NUMPOP,irange_l,irange_r);
pop_save=pop;
fitness_concat = [];
best_solution = [];
%开始迭代
for time=1:ITERATION
%计算初始种群的适应度
fitness=m_Fitness(pop, OD, h);
fitness_concat = [fitness_concat;max(fitness)];
pop_T = pop';
[m,index] = max(m_Fitness(pop, OD, h));
best_solution = [best_solution;pop(:,index)'];
%选择
pop=m_Select(fitness,pop,SELECTRATE);
%编码
binpop=m_Coding(pop,LENGTH,irange_l);
%交叉
kidsPop = crossover(binpop,NUMPOP,CROSSOVERRATE);
%变异
kidsPop = Variation(kidsPop,VARIATIONRATE);
%解码
kidsPop=m_Incoding(kidsPop,irange_l);
%更新种群
pop=[pop kidsPop];
end
disp(['最优解:' num2str(min(m_Fx(pop,OD))) '分钟']);
disp(['最优解对应的各参数:' num2str(pop(1,1)) ',' num2str(pop(2,1)) ',' num2str(pop(3,1)) ',' num2str(pop(4,1)) ]);
disp(['最大适应度:' num2str(max(m_Fitness(pop, OD, h)))]);
figure
% set(gca,'looseInset',[0 0 0 0]);
set(gcf,'outerposition',get(0,'screensize'));
loglog(1:ITERATION, fitness_concat, 'Blue*-','linewidth',2)
legend('{\bf最优适应度值}');
xlabel('{\bf进化代数}','fontsize',30);
ylabel('{\bf最优适应度}','fontsize',30);
set(gca,'FontSize',20,'Fontname', 'Times New Roman');
set(get(gca,'XLabel'),'Fontsize',20,'Fontname', '宋体');
set(get(gca,'YLabel'),'Fontsize',20,'Fontname', '宋体');
set(get(gca,'legend'),'Fontsize',20,'Fontname', '宋体');
set(get(gca,'title'),'Fontsize',20,'Fontname', '宋体');
set(gca,'linewidth',2);
print(gcf,'-dpng','-r300','最优适应度值-进化代数');
figure
% set(gca,'looseInset',[0 0 0 0]);
set(gcf,'outerposition',get(0,'screensize'));
semilogx(1 : ITERATION, best_solution,'linewidth',4)
legend('{\bf大小交路折返站a}','{\bf大小交路折返站b}','{\bf大交路发车频率f_1}','{\bf小交路发车频率f_2}');
% text(6, 0.3, '$\leftarrow y= 2^{-x}$', 'HorizontalAlignment', 'left', 'Interpreter', 'latex', 'FontSize', 15);
xlabel('{\bf进化代数}','fontsize',15);
ylabel('{\bf参数各代最优值}','fontsize',15);
set(gca,'FontSize',20,'Fontname', 'Times New Roman');
set(get(gca,'XLabel'),'Fontsize',20,'Fontname', '宋体');
set(get(gca,'YLabel'),'Fontsize',20,'Fontname', '宋体');
set(get(gca,'legend'),'Fontsize',20,'Fontname', '宋体');
set(get(gca,'title'),'Fontsize',20,'Fontname', '宋体');
set(gca,'linewidth',2);
print(gcf,'-dpng','-r300','参数各代最优值-进化代数');
```
## 2️⃣.2️⃣ `od.m`——生成随机出行`OD`矩阵
用来生成随机出行`OD`矩阵。
```python
Mu = 26;
sigma = 10;
N = round(normrnd(Mu, sigma, [35 35]));
N = N + abs(min(N));
sum(sum(N))
if sum(sum(N)) > 35000 ;
if sum(sum(N)) < 40000;
xlswrite('test.xlsx',N,'Sheet1')
end
end
```
## 2️⃣.3️⃣ `m_InitPop.m`——初始化种群
```python
function pop=m_InitPop(numpop,irange_l,irange_r)
%% 初始化种群
% 输入:numpop--种群大小;
% [irange_l,irange_r]--初始种群所在的区间
pop=[];
for j = 1:numpop
for i=1:4
% 因为a,b,f1,f2要求整数,所以生成随机整数
pop(i,j)= round(irange_l+(irange_r-irange_l)*rand);