zoukankan      html  css  js  c++  java
  • Part2:比较两个渗透函数的性能

    关于该部分的项目描述请见Project2 Percolation in Grids 网格渗透

      测试的场景要求如下:

    ·         set n=75

    ·         consider values of p from 0 to 1 in increments of 0.05 (or smaller)

    ·         for each value of p, generate 10 random grids and record for each algorithm the average running time on the ten grids

       可是我在编写该部分的测试代码时,遇到了些麻烦,一开始还摸不清头脑。

    My Problem that You should Avoid

      我的思路是执行每次for循环前,也就是对于每个p值,产生一个当前时间t,然后每发生渗透,记录下时间差time_delta,并设置一个求和变量sum_time,累加每次的执行时间。代码如下,发现我错在哪了么?

    def test_time(func):    #这是错误的
        p = 0
        results 
    = []
        
    while p < 1:
            
    print 'Running for p =', p, '...'
            sum_time
    =0
            t 
    = time.clock()
            
    for k in range(trial_count):
                g 
    = random_grid(size, p)
                flow,perc 
    = func(g, trace=False)
                
    if perc:
                    time_delta
    = time.clock()-t
                    sum_time
    +=time_delta

            Aver_time 
    = float(sum_time)/trial_count
            
    print Aver_time        
            results.append(Aver_time)
            p 
    += step
            
        
    return results

    第一,错在不用为每一次运算计算运行时间,只要每执行trial_count次,跳出循环,计算一次时间差即可。

    第二,算法的执行时间不是仅指发生渗透的情况下啊! 我错了,我真的错了...

       正确的代码应该如下:

        p = 0
        results 
    = []
        old_clock 
    = time.clock()
        
    print 'testing', func, '...'

        
    while p < 1:
            
    print 'Running for p =', p, '...'
            perc_count 
    = 0
            
    for k in range(trial_count):
                g 
    = random_grid(size, p)
                flow,perc 
    = func(g,trace=False)
            new_clock 
    = time.clock()
            results.append((new_clock 
    - old_clock)/trial_count)
            old_clock 
    = new_clock
            p 
    += step


        附上美丽的曲线图,经过一段曲折的纠缠,最终水波算法胜出

     

    测试的完整代码,贴在这里,至此Python的网格渗透项目也完全结束

    # -*- coding: utf-8 -*-
    """
    Created on Wed Aug 10 13:34:21 2011

    @author: Nupta
    """

    from percolation_wave import *
    from my_percolation_recursive import *
    from pylab import *
    import time
    import sys

    step 
    = 0.05
    trial_count 
    = 10
    size 
    = 75


    def test_time(func):
        p 
    = 0
        results 
    = []
        old_clock 
    = time.clock()

        
    print 'testing', func, '...'

        
    while p < 1:
            
    print 'Running for p =', p, '...'

            perc_count 
    = 0
            
    for k in range(trial_count):
                g 
    = random_grid(size, p)
                flow,perc 
    = func(g,trace=False)
            new_clock 
    = time.clock()
            results.append((new_clock 
    - old_clock)/trial_count)
            old_clock 
    = new_clock
            p 
    += step

        
    return results

    if __name__ == '__main__':
        
        sys.setrecursionlimit(
    250000)
        
        res1 
    = test_time(percolation_wave)
        res2 
    = test_time(percolation_recursive)

        plot(arange(0,
    1,step), res1, 'b', label='wave')
        plot(arange(0,
    1,step), res2, 'r', label='recursive')
        legend()
        xlabel(
    'p')
        ylabel(
    'Running Time')
        title(
    'Running Time')
        show()
  • 相关阅读:
    Lodop客户端本地角色注册号常见误区
    Spring中加载xml配置文件的六种方式
    源程序出现各种奇怪的符号P
    MyEclipse项目中的java文件的图标变成空心的问题
    servlet中的相对路径和绝对路径 及/, ./, ../的区别
    Thread 与 Runnable
    Class.forName()用法详解
    chain.doFilter(request,response)含义
    jsp简单标签开发(一)
    createStatement()的用法
  • 原文地址:https://www.cnblogs.com/yuxc/p/2133654.html
Copyright © 2011-2022 走看看