<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>simon1118</title>
    <description></description>
    <link>http://simon1118.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>jsonplugin-0.30已发布，解决了cglib问题</title>
        <author>simon1118</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon1118.javaeye.com">simon1118</a>&nbsp;
          链接：<a href="http://simon1118.javaeye.com/blog/201484" style="color:red;">http://simon1118.javaeye.com/blog/201484</a>&nbsp;
          发表时间: 2008年06月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          jsonplugin-0.30于6月6号发布，修复了一直很头疼的cglib序列化问题:<br />| 0.30 | Jun 06, 2008 | James Holmes | Fix includeProperties setting and fix JSONWriter to properly handle CGLib enhanced classes. |<br /><br />使用方法在不需要序列化的POJO属性上加入@JSON(serialize=false)标记，相信使用过jsonplugin的人都知道，以前版本遇到由CGLib 生成的代理对象会报异常。<br /><pre name="code" class="java">
 @JSON(serialize=false)
	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "department_id", unique = false, nullable = false, insertable = true, updatable = true)
	public Department getDepartment() {
		return this.department;
	}
</pre><br /><br />下载地址：<br /><a href="http://code.google.com/p/jsonplugin/downloads/list" target="_blank">http://code.google.com/p/jsonplugin/downloads/list</a>
          <br/>
          <span style="color:red;">
            <a href="http://simon1118.javaeye.com/blog/201484#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jun 2008 12:34:16 +0800</pubDate>
        <link>http://simon1118.javaeye.com/blog/201484</link>
        <guid>http://simon1118.javaeye.com/blog/201484</guid>
      </item>
      <item>
        <title>Spring2.5正式版发布了</title>
        <author>simon1118</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon1118.javaeye.com">simon1118</a>&nbsp;
          链接：<a href="http://simon1118.javaeye.com/blog/142206" style="color:red;">http://simon1118.javaeye.com/blog/142206</a>&nbsp;
          发表时间: 2007年11月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>期待已久的spring2.5正式版终于发布了，是不是真的像介绍的那样有明显的性能提升。呵呵，还等什么用用就知道了.以下是新版本具体变更和新特性：</p>
<ul>
    <li>Full Java 6 and Java EE 5 support (JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0) </li>
    <li>Full-featured annotation-driven dependency injection, including support for 'qualifiers' </li>
    <li>Support for auto-detecting application components in the classpath and auto-configuring them as Spring managed objects </li>
    <li>A new bean name pointcut element in AspectJ pointcut expressions </li>
    <li>Built-in support for AspectJ load-time weaving based on the LoadTimeWeaver abstraction </li>
    <li>New XML configuration namespaces &quot;context&quot; and &quot;jms&quot;, for maximum convenience </li>
    <li>A completely revised integration test framework, with first-class support for JUnit 4 and TestNG </li>
    <li>A new annotation-based controller model for Spring MVC supporting Servlet and Portlet environments </li>
    <li>Extended SimpleJdbcTemplate functionality, including support for named SQL parameters </li>
    <li>Officially certified WebSphere support </li>
    <li>The packaging of Spring Framework jars as OSGi-compliant bundles out of the box </li>
    <li>The ability to deploy a Spring ApplicationContext as a JCA RAR file, for headless application modules </li>
    <li>JCA 1.5 message endpoint management, for Spring-managed JMS and CCI message listeners </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、完整的支持java6和j2ee5规范，并支持（JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、全面支持注释依赖注入，包含支持'qualifiers' </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、支持自动检测应用程序classpath下的组件，并自动设置它们为spring管理对象</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、支持基于LoadTimeWeaver抽象概念的AspectJ load-time weaving </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、新的xml配置文件命名空间(&quot;context&quot;和&quot;jms&quot;)，最大程度配置简便化</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、彻底改进了集成测试框架，first-class支持JUnit 4&nbsp;和 TestNG </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、扩展了SimpleJdbcTemplate 功能，包括支持命名sql参数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、Spring MVC新的基于annotation注释的控制器模型，并支持servlet和Portlet环境</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、WebSphere 官方认证支持</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、新的Spring框架jar包就像OSGi-compliant bundles out of the box （这句不知道什么意思）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、新特性使发布一个应用程序模块的spring应用上下文配置文件就像是JCA RAR 文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、JCA 1.5消息终点处理，Spring对JMS和CCI消息监听器管理</p>
<p>翻译不对，请批评指正！</p>
<p>下载地址：<font face="Arial"><a href="http://sourceforge.net/project/showfiles.php?group_id=73357&amp;package_id=173644&amp;release_id=555312" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=73357&amp;package_id=173644&amp;release_id=555312</a></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://simon1118.javaeye.com/blog/142206#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 Nov 2007 09:06:17 +0800</pubDate>
        <link>http://simon1118.javaeye.com/blog/142206</link>
        <guid>http://simon1118.javaeye.com/blog/142206</guid>
      </item>
      <item>
        <title>人工智能 Java 坦克机器人系列: 遗传算法(转)</title>
        <author>simon1118</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon1118.javaeye.com">simon1118</a>&nbsp;
          链接：<a href="http://simon1118.javaeye.com/blog/139395" style="color:red;">http://simon1118.javaeye.com/blog/139395</a>&nbsp;
          发表时间: 2007年11月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>2006 年 6 月 30 日</p>
<blockquote>遗传算法（Genetic Algorithm, GA）是近几年发展起来的一种崭新的全局优化算法。本文将讲解这种算法，并介绍如何 Robocode Java 坦克机器人中采用此算法以实现机器人进化。</blockquote>
<p><a name="N10043"><span class="atitle"><font size="4" color="#000000">遗传算法</font></span></a></p>
<p>遗传算法（Genetic Algorithm, GA）是近几年发展起来的一种崭新的全局优化算法。1962年霍兰德(Holland)教授首次提出了GA算法的思想，它借用了仿真生物遗传学和自然选择机理，通过自然选择、遗传、变异等作用机制，实现各个个体的适应性的提高。从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。</p>
<p>这一点体现了自然界中&quot;物竞天择、适者生存&quot;进化过程。与自然界相似，遗传算法对求解问题的本身一无所知，它所需要的仅是对算法所产生的每个染色体进行评价,把问题的解表示成染色体，并基于适应值来选择染色体，使适应性好的染色体有更多的繁殖机会。在算法中也即是以二进制编码的串。并且，在执行遗传算法之前，给出一群染色体，也即是假设解。然后，把这些假设解置于问题的&ldquo;环境&rdquo;中，也即一个适应度函数中来评价。并按适者生存的原则，从中选择出较适应环境的染色体进行复制, 淘汰低适应度的个体，再通过交叉，变异过程产生更适应环境的新一代染色体群。对这个新种群进行下一轮进化，至到最适合环境的值。</p>
<p>遗传算法已用于求解带有应用前景的一些问题，例如遗传程序设计、函数优化、排序问题、人工神经网络、分类系统、计算机图像处理和机器人运动规划等。</p>
<p><a name="N10052"><span class="smalltitle"><strong><font size="3" color="#000000">术语说明</font></strong></span></a></p>
<p>由于遗传算法是由进化论和遗传学机理而产生的搜索算法，所以在这个算法中会用到很多生物遗传学知识，下面是我们将会用来的一些术语说明：</p>
<p><strong>一、染色体(Chronmosome)</strong></p>
<p>染色体又可以叫做基因型个体(individuals),一定数量的个体组成了群体(population),群体中个体的数量叫做群体大小。</p>
<p><strong>二、基因(Gene)</strong></p>
<p>基因是串中的元素，基因用于表示个体的特征。例如有一个串S＝1011，则其中的1，0，1，1这4个元素分别称为基因。它们的值称为等位基因(Alletes)。</p>
<p><strong>三、基因地点(Locus)</strong></p>
<p>基因地点在算法中表示一个基因在串中的位置称为基因位置(Gene Position)，有时也简称基因位。基因位置由串的左向右计算，例如在串 S＝1101 中，0的基因位置是3。</p>
<p><strong>四、基因特征值(Gene Feature)</strong></p>
<p>在用串表示整数时，基因的特征值与二进制数的权一致；例如在串 S=1011 中，基因位置3中的1，它的基因特征值为2；基因位置1中的1，它的基因特征值为8。</p>
<p><strong>五、适应度(Fitness)</strong></p>
<p>各个个体对环境的适应程度叫做适应度(fitness)。为了体现染色体的适应能力，引入了对问题中的每一个染色体都能进行度量的函数，叫适应度函数. 这个函数是计算个体在群体中被使用的概率。</p>
<p><a name="N1007E"><span class="smalltitle"><strong><font size="3" color="#000000">操作算法</font></strong></span></a></p>
<p>霍兰德(Holland)教授最初提出的算法也叫简单遗传算法，简单遗传算法的遗传操作主要有三种：选择(selection)、交叉(crossover)、变异(mutation)这也是遗传算法中最常用的三种算法：</p>
<p><strong>1．选择(selection)</strong></p>
<p>选择操作也叫复制操作，从群体中按个体的适应度函数值选择出较适应环境的个体。一般地说，选择将使适应度高的个体繁殖下一代的数目较多，而适应度较小的个体，繁殖下一代的数目较少,甚至被淘汰。最通常的实现方法是轮盘赌(roulette wheel)模型。令&Sigma;fi表示群体的适应度值之总和，fi表示种群中第i个染色体的适应度值，它被选择的概率正好为其适应度值所占份额fi／&Sigma;fi。如下图表中的数据适应值总和&Sigma;fi=6650,适应度为2200变选择的可能为fi／&Sigma;fi=2200/6650=0.394.</p>
<br />
<a name="N10090"><strong><font color="#000000">图1. 轮盘赌模型</font></strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-lo-robocode1/images/image001.jpg" border="0" alt="图1. 轮盘赌模型" /> <br />
<table cellspacing="0" border="1" cellpadding="0">
    <tbody>
        <tr>
            <td>Fitness 值：</td>
            <td>2200</td>
            <td>1800</td>
            <td>1200</td>
            <td>950</td>
            <td>400</td>
            <td>100</td>
        </tr>
        <tr>
            <td>选择概率：</td>
            <td>3331</td>
            <td>0.271</td>
            <td>0.18</td>
            <td>0.143</td>
            <td>0.06</td>
            <td>0.015</td>
        </tr>
    </tbody>
</table>
　
<p><strong>2．交叉(Crossover)</strong></p>
<p>交叉算子将被选中的两个个体的基因链按一定概率pc进行交叉，从而生成两个新的个体，交叉位置pc是随机的。其中Pc是一个系统参数。根据问题的不同，交叉又为了单点交叉算子（Single Point Crossover）、双点交叉算子（Two Point Crossover）、均匀交叉算子 (Uniform Crossover)，在此我们只讨论单点交叉的情况。</p>
<p>单点交叉操作的简单方式是将被选择出的两个个体S1和S2作为父母个体，将两者的部分基因码值进行交换。假设如下两个8位的个体：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section">S1 1000  1111 S2 1110  1100</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<p>产生一个在1到7之间的随机数c，假如现在产生的是2，将S1和S2的低二位交换：S1的高六位与S2的低六位组成数串10001100，这就是S1和S2的一个后代P1个体；S2的高六位与S1的低二位组成数串11101111，这就是S1和S2的一个后代P2个体。其交换过程如下图所示：</p>
<table cellspacing="0" border="1" cellpadding="0">
    <tbody>
        <tr>
            <th>Crossover</th>
            <th>11110000</th>
            <th>Crossover</th>
            <th>11110000</th>
        </tr>
        <tr>
            <td>S1</td>
            <td>1000 1111</td>
            <td>S2</td>
            <td>1110 1100</td>
        </tr>
        <tr>
            <td>P1</td>
            <td>1000 1100</td>
            <td>P2</td>
            <td>1110 1111</td>
        </tr>
    </tbody>
</table>
<p><strong>3．变异(Mutation)</strong></p>
<p>这是在选中的个体中，将新个体的基因链的各位按概率pm进行异向转化，最简单方式是改变串上某个位置数值。对二进制编码来说将0与1互换：0变异为1，1变异为0。</p>
<p>如下8位二进制编码：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section">1 1 1 0 1 1 0 0</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<p>随机产生一个1至8之间的数i，假如现在k=6，对从右往左的第6位进行变异操作，将原来的1变为0，得到如下串：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section">1 1 0 0 1 1 0 0</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<p>整个交叉变异过程如下图：</p>
<br />
<a name="N10132"><strong><font color="#000000">图2. 交叉变异过程</font></strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-lo-robocode1/images/image002.jpg" border="0" alt="图2. 交叉变异过程" /> <img src="http://www-128.ibm.com/developerworks/cn/java/j-lo-robocode1/images/image002-2.jpg" border="0" alt="图2. 交叉变异过程" /> <br />
<p><strong>4．精英主义 （Elitism）</strong></p>
<p>仅仅从产生的子代中选择基因去构造新的种群可能会丢失掉上一代种群中的很多信息。也就是说当利用交叉和变异产生新的一代时，我们有很大的可能把在某个中间步骤中得到的最优解丢失。在此我们使用精英主义（Elitism）方法，在每一次产生新的一代时，我们首先把当前最优解原封不动的复制到新的一代中，其他步骤不变。这样任何时刻产生的一个最优解都可以存活到遗传算法结束。</p>
<p>上述各种算子的实现是多种多样的，而且许多新的算子正在不断地提出，以改进GA某些性能。比如选择算法还有分级均衡选择等等。</p>
<p><a name="N1014F"><span class="smalltitle"><strong><font size="3" color="#000000">遗传算法的所需参数</font></strong></span></a></p>
<p>说简单点遗传算法就是遍历搜索空间或连接池，从中找出最优的解。搜索空间中全部都是个体，而群体为搜索空间的一个子集。并不是所有被选择了的染色体都要进行交叉操作和变异操作，而是以一定的概率进行，一般在程序设计中交叉发生的概率要比变异发生的概率选取得大若干个数量级。大部分遗传算法的步骤都很类似，常使用如下参数：</p>
<p>Fitness函数：见上文介绍。</p>
<p>Fitnessthreshold（适应度阀值）：适合度中的设定的阀值，当最优个体的适应度达到给定的阀值，或者最优个体的适应度和群体适应度不再上升时(变化率为零)，则算法的迭代过程收敛、算法结束。否则，用经过选择、交叉、变异所得到的新一代群体取代上一代群体，并返回到选择操作处继续循环执行。</p>
<p>P：种群的染色体总数叫种群规模，它对算法的效率有明显的影响，其长度等于它包含的个体数量。太小时难以求出最优解，太大则增长收敛时间导致程序运行时间长。对不同的问题可能有各自适合的种群规模，通常种群规模为 30 至 160。</p>
<p>pc：在循环中进行交叉操作所用到的概率。交叉概率（Pc）一般取0.6至0.95之间的值，Pc太小时难以向前搜索，太大则容易破坏高适应值的结构。</p>
<p>Pm：变异概率，从个体群中产生变异的概率，变异概率一般取0.01至0.03之间的值变异概率Pm太小时难以产生新的基因结构，太大使遗传算法成了单纯的随机搜索。</p>
<p>另一个系统参数是个体的长度，有定长和变长两种。它对算法的性能也有影响。由于GA是一个概率过程，所以每次迭代的情况是不一样的,系统参数不同，迭代情况也不同。</p>
<p><a name="N1016A"><span class="smalltitle"><strong><font size="3" color="#000000">遗传步骤</font></strong></span></a></p>
<p>了解了上面的基本参数，下面我们来看看遗传算法的基本步骤。</p>
<p>基本过程为： </p>
<ol>
    <li>对待解决问题进行编码,我们将问题结构变换为位串形式编码表示的过程叫编码；而相反将位串形式编码表示变换为原问题结构的过程叫译码。 </li>
    <li>随机初始化群体P(0)：=(p1, p2, &hellip; pn)； </li>
    <li>计算群体上每个个体的适应度值(Fitness) </li>
    <li>评估适应度,对当前群体P(t)中每个个体Pi计算其适应度F(Pi)，适应度表示了该个体的性能好坏 </li>
    <li>按由个体适应度值所决定的某个规则应用选择算子产生中间代Pr(t) </li>
    <li>依照Pc选择个体进行交叉操作 </li>
    <li>仿照Pm对繁殖个体进行变异操作 </li>
    <li>没有满足某种停止条件，则转第3步，否则进入9 </li>
    <li>输出种群中适应度值最优的个体 </li>
</ol>
<p>程序的停止条件最简单的有如下二种：完成了预先给定的进化代数则停止；种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。</p>
<p>根据遗传算法思想可以画出如右图所示的简单遗传算法框图： </p>
<br />
<a name="N1019C"><strong><font color="#000000">图3. 简单遗传算法框图</font></strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-lo-robocode1/images/image003.gif" border="0" alt="图3. 简单遗传算法框图" /> <br />
<p>下面伪代码简单说明了遗传算法操作过程：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section">choose an intial population
For each h in population,compute Fitness(h)
While(max Fitness(h) &lt; Fitnessthreshold)
do selection
    do crossover
do mutation  
 update population
For each h in population,compute Fitness(h)
Return best Fitness
</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" border="0" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br />
            <img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" align="right" cellpadding="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
            <table cellspacing="0" border="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-robocode1/index.html#main" class="fbox"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N101B1"><span class="atitle"><font size="4" color="#000000">Robocode 说明</font></span></a></p>
<p>能有效实现遗传算法的应用例子有很多，像西洋双陆棋、国际名模等等都是遗传程序设计学习的工具，但是 Robocode 有着其他几个无可比拟的优势：</p>
<ol>
    <li>它是基于面向对象语言 Java 开发，而遗传算法本身的思想也是存在继承等面向对象概念； </li>
    <li>Robocode 是一种基于游戏与编程语言之间的平台，有一个充满竞技与乐趣的坦克战斗平台，你能很快的通过与其他坦克机器比赛而测试自己的遗传算法； </li>
    <li>Robocode 社群有 4000 个左右各种策略的例子机器人可供你选择，这些机器人足以让我们模拟真实的遗传环境。而且很多代码可直接开放源代码供我们借鉴 ； </li>
    <li>Robocode 是一个开源软件，你可直接上Robocode控制器上加入自己的遗传特点，而加快遗传过程的收敛时间； </li>
    <li>Robocoe是一个很容易使用的机器人战斗仿真器，您在此平台上创建自己的坦克机器人，并与其它开发者开发的机器人竞技。以得分排名的方式判定优胜者。每个 Robocode 参加者都要利用 Java 语言元素创建他或她的机器人，这样就使从初学者到高级黑客的广大开发者都可以参与这一娱乐活动。如果您对Robocode不是很了解，请参考 developerWorks 网站 Java 技术专区文章：&ldquo;<a href="http://www-128.ibm.com/developerworks/cn/java/j-Robocode/"><font color="#5c81a7">重锤痛击 Robocode</font></a>&rdquo;； </li>
</ol>
<p>在 Robocode 中其实有很多种遗传算法方法来实现进化机器人，从全世界的 Robocode 流派中也发展几种比较成熟的方法，比如预设策略遗传、自开发解释语言遗传、遗传移动我们就这几种方法分别加以介绍。由于遗传算法操作过程都类似，所以前面二部分都是一些方法的介绍和部分例子讲解，后面部分会给出使用了遗传算法的移动机器人人例子。 在附录中，也提供了机器人仓库中有关遗传算法机器人的下载，大家可参考。</p>
<br />
<table cellspacing="0" border="0" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br />
            <img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" align="right" cellpadding="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
            <table cellspacing="0" border="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-robocode1/index.html#main" class="fbox"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N101D3"><span class="atitle"><font size="4" color="#000000">预设策略进化机器人</font></span></a></p>
<p>Robocode 坦克机器人所有行为都离不开如移动、射击、扫描等基本操作。所以在此把这些基本操作所用到的策略分别进化如下编码：移动策略move-strategy (MS), 子弹能量bullet-power-strategy (BPS), 雷达扫描radar-strategy (RS), 和瞄准选择策略target- strategy (TS)。由于Robocode爱好者社群的发展，每一种基本操作都发展了很多比较成熟的策略，所有在此我们直接在下面预先定义的这些策略如下表：</p>
<table cellspacing="0" border="1" cellpadding="0">
    <tbody>
        <tr>
            <th>MS</th>
            <th>BPS</th>
            <th>RS</th>
            <th>TS</th>
        </tr>
        <tr>
            <td>random</td>
            <td>distance-based</td>
            <td>always-turn</td>
            <td>HeadOn</td>
        </tr>
        <tr>
            <td>Linear</td>
            <td>light-fast</td>
            <td>target-focus</td>
            <td>Linear</td>
        </tr>
        <tr>
            <td>circular</td>
            <td>Powerful-slow</td>
            <td>target-scope-focus</td>
            <td>Circular</td>
        </tr>
        <tr>
            <td>Perpendicular</td>
            <td>Medium</td>
            <td>&nbsp;</td>
            <td>nearest robot</td>
        </tr>
        <tr>
            <td>arbitary</td>
            <td>hit-rate based</td>
            <td>&nbsp;</td>
            <td>Log</td>
        </tr>
        <tr>
            <td>anti gravity</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>Statistic</td>
        </tr>
        <tr>
            <td>Stop</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>Angular</td>
        </tr>
        <tr>
            <td>Bullet avoid</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>wave</td>
        </tr>
        <tr>
            <td>wall avoid</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>track</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>Oscillators</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>下面是基本移动策略的说明：</p>
<ul>
    <li>Random：随机移动主要用来混乱敌人的预测，其最大的一个缺点是有可能撞击到其他机器人 </li>
    <li>Linear：直线移动,机器人做单一的直线行走 </li>
    <li>circular：圆周移动，这种移动是以某一点为圆心，不停的绕圈 </li>
    <li>Perpendicular：正对敌人移动，这是很多人采用的一种移动方式，这在敌人右边， 以随时调整与敌人的相对角 </li>
    <li>Arbitrary：任意移动 </li>
    <li>AntiGravity：假设场地有很多力点的反重力移动，本方法是模拟在重力场作用下，物体总是远离重力势高的点，滑向重力势低的点，开始战场是一个平面然后生成一些势点重力势大的势点的作用就像是一个山(起排斥作用），其衰减系数与山的坡度对应。重力势小的势点的作用就像是一个低谷（起吸引作用），其衰减系数与谷的坡度对应。这样使本来的平面变得不平了，从来物体沿着最陡的方向向下滑动 </li>
    <li>Track：跟踪敌人，敌人移动到哪，机器人也移动到哪，但是总与敌人保持一定最佳躲避子弹距离和角度 </li>
    <li>Oscillators：重复做一振荡移动 </li>
    <li>Bullet avoid：每当雷达觉察到敌人时有所动作。机器人保持与敌人成30度倾向角。自身成 90 度角静止并逐渐接近目标。如果机器人觉察到能量下降介于 0.1 和 3.0 之间（火力范围），那么机器人就立即切换方向，向左或向右移动。 </li>
    <li>wall avoid：这是一种使自己的机器人不会被困在角落里或者不会撞墙的移动方式 </li>
</ul>
<p>瞄准策略说明如下：</p>
<ul>
    <li>Headon：正对瞄准 </li>
    <li>Linear：直线瞄准 </li>
    <li>circular：圆周瞄准 </li>
    <li>nearest robot：接近机器人瞄准 </li>
    <li>Log：保存每次开火记录 </li>
    <li>Statistic：统计学瞄准，分析所有打中及未打中的次数，以其中找出最高打中敌人的概率为准则 </li>
    <li>Angular：找到最佳角度瞄准 </li>
    <li>Wave：波形瞄准，子弹以波的方式进行探测 </li>
</ul>
<p><a name="N102C7"><span class="smalltitle"><strong><font size="3" color="#000000">Robocode 行为事件</font></strong></span></a></p>
<p>坦克的主要都定义在一个主循环中，我们在程序中定义为上面四个策略定义四种战略如Move,Radar,Power,Target，当某一事件发生，基于这个事件而定的行为就会触发。而每个战略中都有不同的行为处理方式。这些行为通过遗传算法触发，遗传算法将调用这些基本动作并搜索这些策略的最佳组合。基于这些基本动作将有4224 (=4*11*4*3*8)种可能发生。在Robocode AdvancedRobot 类下有如下的移动函数：</p>
<ul>
    <li>setAhead和ahead：让机器人向前移动一定距离. </li>
    <li>setBack和back：让机器人向后移动一定距离 </li>
    <li>setMaxTurnRate：设置机器人最大的旋转速度 </li>
    <li>setMaxVelocity：设置机器人最大的运动速度 </li>
    <li>setStop和stop：停止移动或暂停机器人，并记住停止的位置 </li>
    <li>setResume和resume：重新开始移动停止的机器人 </li>
    <li>setTurnLeft和turnLeft：向左旋转机器人 </li>
    <li>setTurnRight和turnRight：向右旋转机器人 </li>
</ul>
<p>下面是 doMove 移动方法中使用部分程序代码：</p>
<p>Random：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section">switch(Math.random()*2) {
 case 0： setTurnRight(Math.random()*90);
break;
case 1： setTurnLeft(Math.random()*90);
 break; }
 execute();
</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<p>Linear：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section">ahead(200);
setBack(200);
</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<p>Circular：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section">setTurnRight(1000);
setMaxVelocity(4);
ahead(1000);
</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<p>anti gravity：</p>
<table cellspacing="0" border="1" bgcolor="#eeeeee" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><code>
            <pre class="section"> double forceX = 0;
  double forceY = 0;
  for (int i=0; i&lt;targetInfo.size(); i++){
    TargetInformation ti = (TargetInformation)targetInfo.get(i);
    double targetToMeX = getX()-ti.x;
    double targetToMeY = getY()-ti.y;
    double targetDistance = Math.sqrt(ti.x * ti.x + ti.y * ti.y);
    forceX += (targetToMeX/(ti.distance * ti.distance));
    forceY += (targetToMeY/(ti.distance * ti.distance));
  }
  forceX += 1/(getX());
  forceY += 1/(getY());
  forceX += 1/(getX()-getBattleFieldWidth());
  forceY += 1/(getY()-getBattleFieldHeight());
  double forceMagnitude = Math.sqrt(forceX*forceX+forceY*forceY);
  forceX*=8/forceMagnitude;
  forceY*=8/forceMagnitude;
  desiredX = getX() + forceX;
  desiredY = getY() + forceY;
&hellip;
</pre>
            </code></td>
        </tr>
    </tbody>
</table>
<br />
<p>这里我们用遗传算法来控制机器人移动位置。这些策略是基于下面几点：机器人人自己的位置、速度和方位;对手的位置（x,y坐标）、速度、方位以及相对角;所有机器人和子弹位置，方位及速度;场地大小等参数。</p>
<p>当上面的信息在下一回移动中使用时，出输出一对坐标值，根据这对坐标在Robocode就能得到距离和角度。要想让移动实现遗传必须要让它实现在线学习：所以我们的代码必须做下面几件事：要有一个函数收集适应度值，在Robocode运行过程中要运用到遗传操作，遗传后代要在Robocode运行中产生，而不是事后由手写入代码。</p>
          <br/>
          <span style="color:red;">
            <a href="http://simon1118.javaeye.com/blog/139395#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Nov 2007 10:01:17 +0800</pubDate>
        <link>http://simon1118.javaeye.com/blog/139395</link>
        <guid>http://simon1118.javaeye.com/blog/139395</guid>
      </item>
      <item>
        <title>Spring高级编程工厂介绍（一）</title>
        <author>simon1118</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon1118.javaeye.com">simon1118</a>&nbsp;
          链接：<a href="http://simon1118.javaeye.com/blog/139254" style="color:red;">http://simon1118.javaeye.com/blog/139254</a>&nbsp;
          发表时间: 2007年11月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近手头的项目刚验收完成，有了很多空余时间，第一次写blog有什么不对的地方请大家指正。<img src="/javascripts/fckeditor/editor/images/smiley/msn/regular_smile.gif" alt="" /></p>
<p><br />
<font face="Arial"><font face="Arial"><strong>org.springframework.beans.factory.config.PropertyPathFactoryBean</strong>是一个很有用Bean工厂，大家在项目开发中用的比较多的依赖注入是对象实例注入，如果一个Bean构造函数中或方法中的参数不是一个对象而是普通的值或者是某个对象的一个属性，这时候就需要用到PropertyPathFactoryBean：<br />
</font></font><font color="#0000ff"><font face="Arial"><br />
<bean class="com.test.Person" id="person"></bean></font>
<property name="propertyPath">
<property name="targetBeanName"><font color="#000000">以下例子摘自wrox出版的《spring框架高级编程》中的一个例子，改了少量东西！<br />
以后会继续更新！</font> </property>
</property>
<br />
</font></p>
<p>&nbsp;</p>
<div class="code_title">xml 代码</div>
<span><span><span><span><span><span><span>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;person&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.test.Person&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;person.address.city&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.beans.factory.config.PropertyPathFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;targetObject&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;person&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;xxxBean&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.test.xxxBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;cityName&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;person.address.city&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>&nbsp;类com.test.Person中有个address类型的属性，而address中又有一个String类型的city属性，上面的配置是将city属性注入到<br />
com.test.xxxBean的cityName属性中。</p>
<p>顺便提一下这里fckeditor好像有问题，编辑的内容有时候提交掉，代码编辑器会提交后会掉符号尤其是&ldquo;&gt;&rdquo;，不知道其他人有<br />
没有遇到过这种情况。</p>
<div class="code_title"></div>
<span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag">
<p><bean class="org.springframework.beans.factory.config.PropertyPathFactoryBean&lt;/font&gt;" id="person.address.city"></bean></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Arial"><strong>org.springframework.beans.factory.config.FieldRetrievingFactoryBean</strong>能够获取类中的静态域变量，使用这个工厂在来注入常量很方便，代码如下：</font></p>
<div class="code_title">xml 代码</div>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;max-long&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.beans.factory.config.FieldRetrievingFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;staticField&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>java.lang.Long.MAX_VALUE</span><span class="tag"><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><span>注入的时候只需要声明式的调用&quot;max-long&quot;来注入就行了。</span></p>
<p>&nbsp;</p>
</span></span></span></span></span></span></span></span></span></span></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://simon1118.javaeye.com/blog/139254#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Nov 2007 16:20:24 +0800</pubDate>
        <link>http://simon1118.javaeye.com/blog/139254</link>
        <guid>http://simon1118.javaeye.com/blog/139254</guid>
      </item>
      <item>
        <title>Powerdesign杂记(转)</title>
        <author>simon1118</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon1118.javaeye.com">simon1118</a>&nbsp;
          链接：<a href="http://simon1118.javaeye.com/blog/139229" style="color:red;">http://simon1118.javaeye.com/blog/139229</a>&nbsp;
          发表时间: 2007年11月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          PowerDesign：PowerDesign是Sybase推出的主打<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>设计工具。PowerDesign致力于采用基于Entiry-Relation的数据模型，分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>进行设计。概念数据模型描述的是独立于<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">管理</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>(DBMS)的实体定义和实体关系定义。物理数据模型是在概念数据模型的基础上针对目标<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">管理</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>的具体化。
<p>&nbsp;&nbsp;&nbsp;&nbsp; ERWin：这个是CA公司的拳头<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">产品</font></a>，它有一个兄弟是BPWin,这个是CASE工具的一个里程碑似的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">产品</font></a>。ERWin界面相当简洁漂亮，也是采用ER模型，如果你是<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">开发</font></a>中小型<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>，极力推荐ERWin，它的Diagram给人的感觉十分清晰。在一个实体中，不同的属性类型采用可定制的图标显示，实体与实体的关系也一目了然。ERWin不适合非常大的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>的设计，因为它对Diagram欠缺更多层次的组织。</p>
<p>如何一次性将表结构的脚本导出来？ <br />
&nbsp;&nbsp;&nbsp;&nbsp; Database ---&gt;Generate Database ---&gt; Genarate Script 就可实现。</p>
<p>Name用中文英文以便查询、写<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">程序</font></a>的时候方便， Code才是最终产生的Table Name </p>
<p>PowerDesigner中建了模型，如何把它作为文档导出？<br />
&nbsp;&nbsp;&nbsp;&nbsp; 利用REPORT。选择一个模板，然后就生成了RTF或是HTM格式的文档</p>
<p>如何将已经存在的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>所有表，导入到PowerDesign中？<br />
&nbsp;&nbsp;&nbsp;&nbsp; 用PD里的反向工程file---&gt;reverse engineering ===&gt; and go on </p>
<p>概念数据模型(CDM)<br />
&nbsp;&nbsp;&nbsp;&nbsp; CDM表现<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>的全部逻辑的结构,与任何的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">软件</font></a>或数据储藏结构无关。一个概念模型经常包括在物理<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>中仍然不实现的数据对象。它给运行计划或业务活动的数据一个正式表现方式。不考虑物理实现细节，只考虑实体之间的关系。</p>
<p>物理数据模型 (PDM)<br />
&nbsp;&nbsp;&nbsp;&nbsp; PDM叙述<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>的物理实现。主要目的是把CDM中建立的现实世界模型生成特定的DBMS脚本，产生<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>中保存信息的储存结构，保证数据在<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>中的完整性和一致性。</p>
<p>面向对象模型 (OOM)<br />
&nbsp;&nbsp;&nbsp;&nbsp; 一个OOM包含一系列包，类，接口和他们的关系。这些对象一起形成所有的(或部份)一个<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">软件</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>的逻辑的设计视图的类结构。一个OOM本质上是<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">软件</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>的一个静态的概念模型。</p>
<p>业务<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">程序</font></a>模型(BPM)<br />
&nbsp;&nbsp;&nbsp;&nbsp; BPM描述业务的各种不同内在任务和内在流程，而且客户如何以这些任务和流程互相影响。BPM是从业务合伙人的观点来看业务逻辑和规则的概念模型，使用一个图表描述<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">程序</font></a>，流程，信息和合作协议之间的交互作用。</p>
<p>正向工程<br />
&nbsp;&nbsp;&nbsp;&nbsp; 你能直接地从PDM产生一个<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>, 或产生一个能在你的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">管理</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>环境中运行的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>脚本。可以生成<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>脚本,如果选择ODBC方式,则可以直接连接到<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>,从而直接产生<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>表以及其他<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>对象。</p>
<p>逆向工程<br />
&nbsp;&nbsp;&nbsp;&nbsp; 将已存在的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>产生进新的PDM 之内。数据来源可能是从脚本文件或一个开放<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>连接数据来源。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 并不是每个设计都需要用到Power Designer。 例如：小的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>，或Table数比较少的情况下就没有必要采用Power Designer了。</p>
<p>设计步骤</p>
<p>&nbsp;</p>
<p>CDM PDM OOM三者转换关系</p>
<p>&nbsp;</p>
<p>2004-08-22更新</p>
<p>PowerDesigner仅仅是实现的工具 <br />
&nbsp;&nbsp;&nbsp;&nbsp; 不要以为Power能帮你把关系什么的全部建立好，很多<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>理论只是还是需要的，设计<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>的时候，那些范式什么的，一定要掌握。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; 设计一个好的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>，最好的工具不是必须的，但是基础理论是一定要的。</p>
<p>PowerDesigner用途不局限于数据建模 <br />
&nbsp;&nbsp;&nbsp;&nbsp; 还可以用PowerDweigner设计web service</p>
<p>并不是每个设计都需要用到PD <br />
&nbsp;&nbsp;&nbsp;&nbsp; 用Powerdesigner对付比较大型的项目，是很好的，对于短平快类型的项目，如果时间要求你1个星期完成一个<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">程序</font></a>，那么完全没有必要用PowerDesigner，直接维护<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>就可以了，当表的数量超过10个（一个小<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>的表在10个左右）的时候，建议还是用用Powerdesigner 。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 我的看法：如果想做成一个比较规范的<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>，小项目也可以用。毕竟生成报表和正反向工程很有用。</p>
<p>零碎</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; PD中的CDM设计时，可以将所有需要的字段都定义好。然后在设计实体是直接取出来。PD提供了这样的统一<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">管理</font></a>的工具。在PD菜单栏-Model-Data Item下。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 为了使自己设计的CDM看起来象样一点，可以从工具栏中，拖动一个Title。其显示的信息，是当前CDM的属性值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 为了使实体等Symbol看起来显眼和舒服。可以根据个人喜好进行外观上的调整。当前设计界面中，右键-Display Perferences中进行设置。还可以增加shadow效果。选中Symbol后，Ctrl+W。或者右键菜单。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 为了使布局整齐。选中需要调整的Symbol后，菜单-Symbol-Align进行设置。快捷键：ctrl+UP,ctrl+Down,ctrl+Left,ctrl+Right即为上下左右对齐。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 设计实体属性时注意的细节：M：表示强制非空；P：是否为主键；D：是否在模型中显示。gerenate：表示是否作为表生成。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 默认情况下，CDM的实体会显示Identifier一栏。如果不想其显示出来，在右键-Display Perferences中ObjectView-Entity中设置。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 关系的命名方法是：实体名1 实体名2。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 关系中的角色（Role）表示联系线上一个方向上的含义。用一个动词来描述。Role只是起一个描述作用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 依赖(Dependency)：表示在联系中一个实体的存在是否依赖于另一个实体。寄生实体（Dependent Entity）是一种部分地被另一实体确定的实体。在依赖联系中，一个实体与另一实体通过标识符相联系，当一个实体的存在没有另一个实体的存在作为参考就 不能唯一确定时，两个实体间就存在依赖联系。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 主从表就是典型的依赖关系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 中间实体（Associative Entity）：是为了解决多对多联系而产生的一个人工实体，能够为中间实体定义属性。用鼠标右键单击多对多联系线，在弹出的菜单中选择&ldquo;Change to entity&rdquo;，能够把这个联系转换成连接两个实体的中间实体。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 善于利用自动生成的中间实体，可以简化设计工作，提高<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>设计的正确性。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 中间实体一般不用再加入新的字段。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 牢记：外键是通过关系Relationship自动来建立的，不需要手动建立。不然会产生多余的键。所以设计时，关注实体本身的字段，以及实体间的关系，特别是多对多和依赖关系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 从CDM到PDM的转换需要注意：</p>
<br />
不能改变Diagram的名称 <br />
在树状图中，如果钩选红色标出的Symbol表示覆盖修改，不钩选表示保护修改。<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>为了保证数据完整性和一致性，提出了约束。即表约束，列约束以及参照完整性约束。通常<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>设计和<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">程序</font></a><a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">开发</font></a>不是绝对的分离的。所以前两者在实际<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">开发</font></a>过程中逐渐的完善。需要注意的还是参照完整性约束。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在PD中前两者的设定是对字段，后者是对关系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 参照完整性约束</p>
<br />
限制（Restrict）。不允许进行修改或删除操作。若修改或删除主表的主键时，如果子表中存在子记录，<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">系统</font></a>将产生一个错误提示。这是缺省的参照完整性设置。 <br />
置空(Set Null)。如果外键列允许为空，若修改或删除主表的主键时，把子表中参照的外键列设置为空值（NULL）。 <br />
置为缺省(Set Default)。如果指定了缺省值，若修改或删除主表的主键时，把子表中参照的外键设置为缺省值（Default）。 <br />
级联(Cascade)。把主表中主键修改为一个新的值时，相应修改子表中外键的值；或者删除主表中主键的记录时，要相应删除子表中外键的记录。<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp; 注意理解以上的约束时，抓住操作的都是主表。子表的操作都是相对主表来说的。操作方式就是Update和Delete。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 引用基础数据表的数据时，可以建立对应的视图。选中需要作为视图的表，菜单栏-Tools-Create View</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; PD支持对已有数据的表更新表结构。不过需要谨慎操作，检查生成的SQL脚本。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; PD也可以生成随机的测试数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 触发器就是DBMS中提供的事件驱动机制。发生在表的Insert,Update和Delete。执行SQL语句或存储过程。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在PD中可以完成存储过程的编写，也便于<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">管理</font></a>。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 逆向工程可以通过<a href="http://www.itlove.net/" class="wordstyle" target="_blank"><font color="#246398">数据库</font></a>脚本或者通过ODBC数据源来实现。</p>
          <br/>
          <span style="color:red;">
            <a href="http://simon1118.javaeye.com/blog/139229#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Nov 2007 15:23:17 +0800</pubDate>
        <link>http://simon1118.javaeye.com/blog/139229</link>
        <guid>http://simon1118.javaeye.com/blog/139229</guid>
      </item>
  </channel>
</rss>