分享

基于Mapreduce的蚁群算法并行化

CodeK 发表于 2017-4-14 16:14:36 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 6671
本帖最后由 CodeK 于 2017-4-14 16:56 编辑

临近毕业本人的导师要求我实现蚁群算法TSP问题的并行化,并给我指出使用hadoop进行实现在研究一段时间后有几个关于mapreduce的编程问题希望能得到各位的解答。
PS:本人编程能力有限,一直在进行web编程,然我的导师为了通过率不让我选择web编程的论文题目(让给了几个同学)被逼无奈来研究hadoop以及蚁群算法。所以有很小白的问题请见谅。
现阶段我搭建了hadoop集群系统 4台计算机,ubantu系统。
在实现过程中发现几个问题:
1、我是在eclipse上先实现了蚁群TSP算法的编程用的TSP测试集是att48和att532,在研究他人对蚁群算法的并行化想法和在本论坛找到文献研究后决定如文献上的一样使用以下方式进行并行化:
采用的并行策略是:把城市间的距离、信息素及蚁群算 法的各参数数据存储在Hadoop的文件系统HDFS中, 在Map阶段,每个Map分配一定量的蚁群,从HDFS 中读取城市间的距离、信息素及各参数数据,各个蚂蚁 构建遍历各个城市构建可行解,作为value值输出;在 Reduce阶段,根据每个Map的value值更新全局信息素数据,求出当前最优解并输出;然后进行多次 MapReduce过程迭代,最终得到最优解。
Mapreduce过程
(1)Map阶段。1)从Hadoop文件系统HDFS中读 取城市间的距离,信息素及各参数配置数据,初始化城 市间的距离矩阵,信息素矩阵及各参数变量。2)初始 化蚁群,把各个蚁群中的每个蚂蚁随机放置在任一城 市作为初始城市,然后每个蚂蚁根据状态转移概率公 式(2)选择下一城市,直到遍历完所有城市,最后把每 个蚂蚁所寻找的路径及路径长度作为Map的value值 输出。
(2)Reduce阶段。1)从Hadoop文件系统HDFS 中读取城市间信息素及各参数配置数据,初始化城市 间信息素矩阵及各参数变量。2)根据Map阶段输出 的各个蚂蚁所经过的路径及路径长度,更新全局信息 素数据,计算出当前最短路径并输出。
(3)启动执行MapReduce部分。从HDFS中读取 MapReduce过程最大迭代次数NC。。,设置每次 MapReduce过程的配置信息,然后进行迭代,最后输出 所求的最短路径及路径长度。


在这里我就懵逼了:
一、首先我的理解为HDFS存储了城市坐标以及标识信息(att48/att532),信息素数据(矩阵的方式(p(r,j):r城市-j城市道路之间信息素的值)),信息素启发因子α  β  ρ 迭代次数 NC 蚁群数量 Antnumber  城市数量Citynumber。
问题1 这些信息并不作为key1,value1 传入map 只是在map中需要用到 那么如何读取又如何更新?(希望能有代码例子)
问题2 信息素启发因子α  β  ρ 迭代次数 NC 蚁群数量 Antnumber 都是常量(α=1  β=5  ρ=0.5 NC=1000 Antnumber=200 Citynumber=48/532)以什么样的形式存在HDFS上?
二、在mapreduce过程当中 map1(key1,value1)是以reduce的结果做为参数应该如何用管道实现(希望能有代码例子)
三、在并行化过程当中 希望的是三个jobtracker(三台计算机节点)都执行map过程(蚂蚁自由遍历城市),如何分配任务让3个节点都执行map同时最后通过1个reduce把三台计算机的map结果比较后输出?(问1:如何让3台计算机都执行相同的map。问2:如何让所有的map结果都输入到一个reduece进行比较(比较路径长度最短为最优解输出)?)

以上问题希望能得到各位解答,希望能有类似的例子源码让我借鉴,同时也希望各位能帮助我理解hadoop集群,我在网上看了很多的例子觉得不是很适用于我的问题,希望能尽快得到解答,谢谢各位

----------本人使用的是hadoop2.7以及eclipse编程-----
在2.7中似乎jobtracker已经被yarn中的resourcemanager和datamanager给取代 那么我该如何分配工作给各个节点


已有(2)人评论

跳转到指定楼层
2017 发表于 2017-4-14 20:25:47
建议楼主先熟悉mapreduce,及相关原理。
推荐参考
MapReduce工作原理讲解
http://www.aboutyun.com/forum.php?mod=viewthread&tid=6723
更多可搜索
#############
问题1 这些信息并不作为key1,value1 传入map 只是在map中需要用到 那么如何读取又如何更新?(希望能有代码例子)
这个需要用到mapreduce的全局变量。由于楼主不熟悉mapreduce编程。还是比较麻烦的。这里只写伪代码及思路
class a{
public static class map
{
  @Override
        protected void setup(Context context)
                throws IOException, InterruptedException {
            try {

                //从全局配置获取配置参数
                Configuration conf = context.getConfiguration();
                String parmStr = conf.get("job_parms"); //这里获取值
                //比如下面你想更新了。
               { conf.setStrings("job_parms", "cccc"); //这里重新设置即可}......



            } catch (SQLException e) {

                e.printStackTrace();
            }


        }
}

class reduce()
{}

main()
{
Configuration conf = new Configuration();


conf.setStrings("job_parms", "aaabbc"); //关键就是这一句,这里是初始值
        Job job = new Job(conf, "load analysis");        
        job.setJarByClass(LoadAnalysis.class);
        job.setMapperClass(LoadMapper.class);
        job.setReducerClass(LoadIntoHbaseReduce.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);


        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));


}



}




问题2 信息素启发因子α  β  ρ 迭代次数 NC 蚁群数量 Antnumber 都是常量(α=1  β=5  ρ=0.5 NC=1000 Antnumber=200 Citynumber=48/532)以什么样的形式存在HDFS上?
这个其实在简单不过了。可能是楼主编程经验的问题。你可以像第一个问题一样,放到xml文件中,也可以存到随便一个文件中。用到读取即可


二、在mapreduce过程当中 map1(key1,value1)是以reduce的结果做为参数应该如何用管道实现(希望能有代码例子)
其实楼主的意思是不是迭代的意思。
可以参考这个,里面有代码的
让你真正明白什么是MapReduce组合式,迭代式,链式
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7435
其实用spark做这个最简单了。但是学习是个成本,如果精力和时间充足,可以看看spark。

三、在并行化过程当中 希望的是三个jobtracker(三台计算机节点)都执行map过程(蚂蚁自由遍历城市),如何分配任务让3个节点都执行map同时最后通过1个reduce把三台计算机的map结果比较后输出?(问1:如何让3台计算机都执行相同的map。问2:如何让所有的map结果都输入到一个reduece进行比较(比较路径长度最短为最优解输出)?)
这个楼主操心有点多了,也是因为没有真正的认识mapreduce,mapreduce会自动分配任务。且数据是分割的。
问题2:
可以尝试下面配置
conf/mapred-site.xml

  <property>
    <name>mapred.reduce.tasks</name>
    <value>1</value>
  </property>


以上问题希望能得到各位解答,希望能有类似的例子源码让我借鉴,同时也希望各位能帮助我理解hadoop集群,我在网上看了很多的例子觉得不是很适用于我的问题,希望能尽快得到解答,谢谢各位

----------本人使用的是hadoop2.7以及eclipse编程-----
在2.7中似乎jobtracker已经被yarn中的resourcemanager和datamanager给取代 那么我该如何分配工作给各个节点
如何分配,系统会自动分配的。只要自己写好mapreduce,剩下的交给系统




回复

使用道具 举报

CodeK 发表于 2017-4-14 20:35:39
2017 发表于 2017-4-14 20:25
建议楼主先熟悉mapreduce,及相关原理。
推荐参考
MapReduce工作原理讲解

感谢解答我的疑惑 我把大部分时间都花在了理解算法上面 对mapreduce的研究并不多 现在大部分问题都已经理解 感恩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条