论文整理与动态读取

论文整理部分

Dynamic Multi-Objective Optimization With jMetal and Spark: a Case
Study

这篇论文主要通过应用Spark流处理技术和JMetal框架来实现其主要的目的,主要流程应该是通过流处理技术将数据读取进来,然后通过一定的技术将这些数据转化为我们想要的到的JMetal框架当中的问题格式,然后再通过应用JMetal框架当中的算法来解决问题,将问题以帕累托最优的格式输出。
从上面的叙述当中我们可以看出来,动态优化与我们当前实现的静态优化算法最主要的区别是,将实时数据进行处理并且转化为我们想要的问题格式,在使用静态的算法进行批量处理就可以实现动态解决的思路,因此问题的关键在于如何抓取数据,并且将数据转化为JMetal的问题格式,对于抓取数据部分,论文中并没有太多的赘述,下面我们将会对数据格式转化部分进行详细的介绍。
在论文中,其使用了纽约交通部门提供的开发数据源,这个数据源将会在每分钟内数次更新纽约的实时交通信息,在这部分的信息当中主要包含下列指标

– Id:路径标识
– Speed:车辆在最近间隔内路径上面行驶的平均速度.
– TravelTime: .车辆在路径行驶是的平均时间
– Status: 路径的状态,是否是开放状态
– EncodedPolyLine:表示GPS坐标的编码字符串,它是使用谷歌一个算法编码实现的
– DataAsOf:.接收到链路状态的最后日期
– LinkName: 链路未知的描述以及其终止点

但是由于信息是以链路状态的形式,而不是节点之间的关系给与的,因此我们需要对数据进行一个预处理,将其转化为可用的TSP问题,我们通过比较GPS信息来加入路由,当一个路由的终止点和一个路由的七点非常接近时(相隔误差很小的情况下)一个通信communication就建立了起来,然后我们对所有的节点进行迭代,删除掉那些度数小于2的节点。另外需要注意的是GPS坐标列表是通过对link数据当中的EncodedPolyLine属性解码得到。
当对所有数据结构化处理完成之后,我们可以得到一个由93个位置点和315个他们之间的通信所组成的DTSP问题,需要注意的是,这里的问题路径明显的不是对称的。当我们处理到这里,我们可以发现一个问题那就是我们得到的DTSP问题中缺少了distance这个关键属性,为了确定每个点之间的距离问题,我们使用谷歌服务,来解决两个点之间的距离,这一步是为了初始化路图,时间和速度这两个指标都已经存在在最初读取的文件中。至此我们便能够得到多目标数据当中的time和distance两个属性,数据初始化和结构化任务也就完成了。

动态读取的实现

如果要想实现动态问题的解决,我们的思路是将动态的问题转化为静态问题来解决,具体来说,我们将不同时段的问题同时存放在一个问题文件夹当中,然后在程序中读取这个文件夹中所有的文件,对每一个问题文件都进行一次独立的算法运算,然后得到数个与问题文件相对应的帕累托解集,然后我们再将这些解集统一的输出到一个指定的解集文件夹当中,这样就可以模拟了数据的动态读取与输出,具体的实现代码就是对文件夹内的文件的计数和读取

    public SSAMultiTspSolutionSet run(String path) {
        File root = new File(path);
        File[] files = root.listFiles();
        String[] Filename = root.list();
        if (Filename == null) {
        } else {
            for (int i = 0; i < Filename.length; i++) {
                String p1 = files[i].list()[0];
                String p2 = files[i].list()[1];
                SSAMultiTspSolutionSet child = getResult(new Multi_Tsp(100, p1, p2));
                p1=p1.substring(0,7);
                p2=p2.substring(0,7);
                String pathname="D:\\answer_parato\\"+p1+p2+".txt";
                System.out.println(pathname);
                File file = new File(pathname);//定义一个file对象,用来初始化FileReader
                FileWriter writer = null;//定义一个fileReader对象,用来初始化BufferedReader
                try {
                    writer = new FileWriter(file);

                } catch (IOException e) {
                    e.printStackTrace();
                }
                int m = 0;
                BufferedWriter bwriter = new BufferedWriter(writer);//new一个BufferedReader对象,将文件内容读取到缓存
                while (m < child.array.size()) {//逐行读取文件内容,不读取换行符和末尾的空格
                    //String[] ss=s.split(" ");
                    try {
                        if (child.array.get(m).rank == 1) {
                            bwriter.write(child.array.get(m).fitness[0] + " " + child.array.get(m).fitness[1]);
                            bwriter.newLine();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    m++;
                }
                try {
                    bwriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


        return null;

    }

以上便是具体的代码解释,实际上只是一个文件io的简单操作,其实也可以有更加拟真的操作,比如通过一个保护线程定时监控文件夹内有没有新的传入,然后当发现有输入时,便运行算法,得到新的解集输出,这个可以作为新的idea点来为下一步的工作做准备。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值