这一篇文章承接上一篇我用c++多线程实现的PSO算法。
基于c++多线程的并行粒子群优化算法
粒子群是什么这里就不在讨论了。主要聊聊MR程序。
思路也借鉴上面的多线程实现。
map程序:
1.读取粒子信息并创建粒子;
2.更新粒子速度和位置;
3.将粒子传递给Reduce程序;
Reduce程序:
1.接受粒子,评价粒子状态信息;
2.根据评价函数更新全局最优解;
3.结果输出;
每个job相当于多线程中的一次循环。写这次程序之前,小编还借鉴了一篇发表在IEEE上的国外大牛的文章(就连博客的题目都是借鉴人家的)。
里面除了提到了MR程序设计和应用神经网络之外,还提供了一种思想:每个粒子不是独立存在的,除了全局最优解的交互之外,还有与自身相关粒子的的交互,读者有机会可以实现一下,下次再遇到PSO并行设计我也会试试实现那个思路。
除了map和Reduce之外,其他的一些辅助类几乎和上一篇文章一样,这里不再赘述(刚刚写完上一篇,不想再写一遍了,偷个懒大家别介意啊)
写MR程序,首先我们就要考虑map和reduce的输入输出。
Mapper:输入key偏移量->LongWritable,每行数据value->Text
输出key粒子个体最优值->DoubeWritable,value->实现了Writable接口的粒子类
Reducer:输入对应mapper的输出,输出key->粒子信息Text,value为空就可以。
MyMapper类:
public class MyMapper extends Mapper<LongWritable, Text, DoubleWritable,Particle> {
private Better better=new Better(Resource.isMax());
private int dim=Resource.getDim();
private Ifunction fun=new MyFunction();
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, DoubleWritable,Particle>.Context context)
throws IOException, InterruptedException {
String[] msgs=value.toString().split("%%");