月度归档: 2009 年 8 月

  • 海盗分金问题

        在书上看到一个经济学上的经典博弈“模型”,觉得很有意思,特意放上来,大部分内容来自百度百科,有删改。
    问题原型:
        5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,达到半数同意方案被通过,否则他将被扔入大海喂鲨鱼,依此类推。假定“每人海盗都是绝顶聪明且很理智”,那么“第一个海盗提出怎样的分配方案才能够使自己的收益最大化?”
    使用倒推法:
    一、假设1、2、3号已被扔入海中,那么不管4号提出怎样的分配方案,5号一定都会投反对票来让4号去喂鲨鱼,故4号为了保命惟有支持3号的方案。
    二、3号知道不管他提出怎样的分配方案,4号都会支持他,于是就会提出(100,0,0)这样的分配方案,可以使他稳获100金币。
    三、2号也经过推理得知了3号的分配方案,那么他就会提出(98,0,1,1)的方案。因为这个方案相对于3号的分配方案,4号和5号至少可以获得1枚金币,理性的4号和5号自然会觉得此方案对他们来说更有利而支持2号。这样,2号就可以屁颠屁颠的拿走98枚金币。
    四、1号海盗经过一番推理之后也洞悉了2号的分配方案。他将采取的策略是放弃2号,而给3号1枚金币,同时给4号或5号2枚金币,即提出(97,0,1,2,0)(97,0,1,0,2)的分配方案。由于1号的分配方案对于3号与4号或5号来说,相比2号的方案可以获得更多的利益,那么他们将会投票支持1号,这样1号最终拥有了97枚金币。

        这样,貌似最最可能被喂鲨鱼的1号成了最大的赢家,当然这一切是鉴于完全的理性的状态下,有时事态发展的过程会出乎预料的糟,甚至背道而驰,但结果却是出人意料的圆满。
    此类问题体现出的多方博弈情况下的生存哲学:
      1、没有永恒的朋友,只有永恒的利益。
      2、在临界点之下,以决策者的身份出场,冒最大的风险,得到最大的利益。
      3、在接近临界点的地方,是收益分配最接近公平的地方。半数的人均匀地受益,另半数的人均匀地不受益。
      4、越过临界点之后,以决策者的身份出场,风险极大,甚至会将老本赔进去,而收益却为零,这是最糟的情况,因为大家的收益都不高。这是一种不稳定的状态,系统会通过自我调整向临界点靠拢。
      5、永远都不可能发生所有人都有收益的情况,任何时候都有至少一半或者接近一半的人无收益,除非只有1个人。

  • 纯静态与伪静态的实现

        一,先看一下伪静态实现方法:
        有两种,第一种也是推荐的一种,就是在服务器端配置URL Rewrite,如果你用的apache请确认你的已经加载了rewrite模块,在http.conf中将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉即可(国内部分空间商已提供支持,国外基本上都支持),之后你只需在站点根目录加入自定义好的.htaccess即可,要想拥有个性化的URL,你还需要掌握正则表达式的运用。还有,提醒一下用张宴学长APMServ的用户,之前在本地调试一直不成功,原因是在http.conf文件中,当前的虚拟主机的AllowOverride默认为none导致的,将其修改为all即可,同时allow from也最好设为all.
    形如:

    <Directory “X:/www/htdocs”>     
     Options FollowSymLinks IncludesNOEXEC Indexes
     DirectoryIndex index.html index.htm default.htm index.php default.php index.cgi default.cgi index.shtml
     AllowOverride None
     Order Deny,Allow
     Allow from all
    </Directory>

         第二种实现伪静态的方法就是在PHP文件内部用$_SERVER函数获取处理QUERY_STRING,关于$_SERVER函数的应用,这里有比较详细的介绍。获得QUERY_STRING后,应用PHP自带的串操作函数解析即可,过程比较简单不再赘述,有兴趣的朋友可以查阅一下相关资料

         二,生成纯静态HTML文件:
         纯静态的HTML有效的提高的站点的安全性,同时也大大减轻了服务器的负荷,速度上也有一定的飞跃,唯一的缺陷是就是占用服务器的硬盘空间,就目前来说,时间比空间更宝贵,国内大型站点基本上都采用的这种方法。
       实现原理:提取缓冲区的数据写入指定文件中,当然这是个HTML的文件。主要利用ob函数,过程比较简单。ob_start()函数,打开输出缓冲区,利用ob_get_contents 获取内部缓冲区内容,将内容写入文件,关闭缓冲区。

    以下是一段简单示例(只做示例,不适合实际应用):

    <?php
       /**
         * 生成HTML静态页面
         * @param    $pram:传入id;$type:读取的php页面类型
         * @return     结果
       */
    ob_start();
    include “File.class.php”;   //自定义文件类
    $pram=intval($_GET[‘id’]);
    if(!isset($pram))
    $pram=1;
    include(‘read.php’);//假设读取数据流来自read.php
    $content=ob_get_contents();
    ob_end_clean();
    $filename=”YOURPATH/NAME.htm”;
    if($name=toHtml($filename,$content)){
        echo ‘The HTML file <b>’.$name.'</b> create success!<br />’;
        echo ‘Take a look! <a href=’.$name.’ target=”_blank”> Click Here</a><br />’;
    }
    else {
        echo ‘HTML file create failed!’;
    }
    /**
     * 生成静态HTML的函数
     * @param    $filename:路径+文件名,$content:写入内容
     * @since     2009.08.03
     * @access   public
     */
    function toHtml($filename,$content)
    {
       $f=new fileClass();
       if (!file_exists($filename)) {
            $f->createFile($filename);
         }
     if($f->writeinFile($filename,$content)) { 
         return $filename;
     }
         return false;
    } // end func

    ?>

    基本原理就是这样了,大家可以根据需求自行修改。
    两种方法有个共同点,都是为了讨好搜索引擎,毋庸置疑良好的搜索引擎优化会给你的站点带来意想不到的收获。
    方法介绍到此,希望它们能对你有所帮助。