到发线设计遗传算法

用遗传算法做的火车到发线选择算法

距离写这个代码的时间已经过去太久了。这次只能是捡着要紧的尽量记录一下,不然真就要尘封在记忆当中了

##实际应用场景##
实际应用是这样的。不同的列车要进站,出站。来来去去各种麻烦。可是车站就这么小,轨道就这么多。如何保证最大效率的利用轨道呢?这就是一个经典的NP完全问题了。直接解决在大规模计算上不现实。这个时候就需要加特技了。一大堆的人工智能优化就来了。本问利用遗传算法来解决问题,duang的一下缩短了时间,不失为一种合理的尝试。

##具体基因设计##
既然是优化算法,就要有一个收敛性存在。对于遗传算法来说,收敛性是至关重要的。适应度是决定解的走向的。本文中的基因设计是这样的。

1
sdkfjh&^[email protected]#@#(IUF(D*)@(#*#*&YKJhdksjfh))

由于版权问题,以上内容无法显示。

##程序函数说明##
把函数的具体作用说一下就可以了吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main ();//主函数
void input(string filename);//用来进行数据读入的
void crossover ( int &seed );//通过一个种子来进行随机化的交叉操作
double getFitness(int member);//计算当前个体的适应度
bool usable(int member);//计算随机出来的个体是不是能用。因为很多时候各种条件限制导致得到的子代不能用
void elitist ( );//选择种群中比较牛逼的
void evaluate ( );//统一计算一个种群的适应度
int i4_uniform_ab ( int a, int b, int &seed );//获得随机数
void initialize ( string filename, int &seed );//初始化
void keep_the_best ( );//选择种群中好的进入下一代,同时更新最优解
void mutate ( int &seed );//个体变异
double r8_uniform_ab ( double a, double b, int &seed );//获得随机数
void report ( int generation );//就是输出嘛
void selector ( int &seed );//随机选择比较好的进入下一代
void timestamp ( );//时间戳
void Xover ( int one, int two, int &seed );//算是进行具体的基因交叉操作
int covTime(char * p);//具体的实现函数,不需要懂

##输入输出##
输出的部分就在控制台中了。得到最优解
输入说明比较复杂,分为三个文件。
train_o.csv
为了方便表格输入,用了csv格式。数据内容一目了然。实例数据如下
主要数据示例
从左到右分别是
车次 上下行 Tdi Tfi Tk Tc

rail.txt
这个文件是用来描述铁路情况的。示例如下

1
2
3
4
5
6
117.6 -1 1
135.15 -1 1
162.83 -1 1
0 0 1
184.63 -1 0
211.28 -1 0

从左到右分别表示
平均步行距离 最大容量(-1表示没有限制) 线路上下行

RP.txt
用来表示咽喉情况的。具体示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
5
17 18
18 19
35 36
35 37
35 40
10
17 1 18 2
18 1 17 2
18 1 19 2
18 2 19 1
35 1 36 2
35 1 37 2
35 1 40 2
35 2 36 1
35 2 37 1
35 2 40 1

首先写上C的数量,然后分别列出来
然后写上咽喉的数量,分别写出来。

文件包下载(更新时间2015-3-23 18:23:10)

Contents
,