年度归档: 2012 年

  • 模糊系统架构和简单实现–AForge.NET框架的使用(四)

    模糊系统架构和简单实现–AForge.NET框架的使用(四)

    先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子。

    我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量机,没法抽出来当例子,就用了个最老的自动车辆的例子。

    模糊系统(Fuzzy System)架构

    前面零零散散说来一下有关模糊系统和模糊理论的东西,这里来个总结。

    模煳系统的基本架构如图8.1所示,其中主要的功能方块包括:(1)模煳化机构、(2)模煳规则库、(3)模煳推论引擎、以及(4)去模煳化机构。

    fuzzy4-1

    模糊化机构是有关模糊集合和隶属度函数的内容。

    模糊规则前文也有提及,去模糊化只涉及了重心法一种,这里简单说一下模糊推理引擎。

    模糊推理引擎是模煳系统的核心,它可以藉由近似推论或模煳推论的进行,来模拟人类的思考决策模式,以达到解决问题的目地。

    比如:

    前提(premise)一:x is A’

    前提(premise)二:if x is A,y is B

    结论:y is B’

    fuzzy4-2

    模糊推理系统的简单实现

    在AForge.Net中的对应类是InferenceSystem。

    在程序实现中一个模糊推理系统(Fuzzy Inference System )由数据库(Database)和规则库(Rulebase)组成,一般操作如下:

    1.获取数值输入

    2.通过数据库(Database)将数值输入转为语意含义

    3.验证规则库(Rulebase)中的哪些规则被输入激活

    4.组合被激活的规则,得到模糊输出(Fuzzy Output)

    5.去模糊化(实现IDefuzzifier接口)

    下面看看例子,这个例子是关于控制车辆避免正面冲撞的系统。

    输入为距离,论域[0,120],隶属度函数

    fuzzy4-6

    输出为角度,论域[-10,50],隶属度函数

    fuzzy4-7

    核心代码:

    // 隶属度函数(距离) 
  • 子句判断、启动强度和去模糊化–AForge.NET框架的使用(三)

    子句判断、启动强度和去模糊化–AForge.NET框架的使用(三)

    使用AForge.NET进行模糊运算

    上一篇说来一些模糊运算的数学问题,用AForge.NET做相关运算就很简单了。

    1.联集运算中的标准联集

    数学:s (p,q) = max (p,q)

    程序:

    publicclass MaximumCoNorm : ICoNorm {publicfloatEvaluate(float membershipA,float membershipB ) {return Math.Max( membershipA, membershipB ); } }

    2.交集运算中的标准交集

    数学:t (p,q) = min (p,q)

    程序:

    publicclass MinimumNorm : INorm {publicfloatEvaluate(float membershipA,float membershipB ) {return 
  • 模糊语意变数、规则和模糊运算–AForge.NET框架的使用(二)

    模糊语意变数、规则和模糊运算–AForge.NET框架的使用(二)

    语意变数(Linguistic Variable)

    语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合。在宣告陈述时每个语意量只能和在同一变数中的语意比较。

    举个很简单的例子,我们有一个名为temperature的语意变数,它包含4个语意量,名为cold、cool、warm、hot,这也是各自的标签名,同时它们还有各自的隶属度函数。

    那么我们就在接下来的系统中使用诸如temperature is hot或者temperature is not hot等等了。

    //语意变数的声明 LinguisticVariablelvTemperature = new LinguisticVariable("Temperature",0,50);//模糊集合和隶属度函数 TrapezoidalFunctionfunction1 = new TrapezoidalFunction(10,15, TrapezoidalFunction.EdgeType.Right); FuzzySetfsCold = new FuzzySet("Cold", function1); TrapezoidalFunctionfunction2 = new TrapezoidalFunction(10,15,20,25); FuzzySetfsCool = new FuzzySet("Cool", function2); TrapezoidalFunctionfunction3 = new TrapezoidalFunction(20,25,30,35); FuzzySetfsWarm = 
  • 模糊集合和隶属度函数–AForge.NET框架的使用(一)

    模糊集合和隶属度函数–AForge.NET框架的使用(一)

    什么是AForge.NET?

    AForge.NET是一个为开发人员和研究人员开发的框架,它可以用于计算机视觉,遗传算法,图像处理,神经网络,机器人学习与控制,机器学习和模糊系统。

    AForge.NET的官方文档比较丰富,网上也有一些相关文章,但是多是关于视觉和神经网络的,而我个人对模糊系统比较感兴趣,故写下自己的一些感受。

    模糊系统和模糊理论简述

    模糊系统主要是区别于经典系统(或称为常规系统)。在研究人机系统,管理系统,特别是经济和社会系统时,由于加入人的逻辑、推理、判断,很多决策很难做到完全精确,这些和人有关的系统就拥有了某种模糊性。

    在常规系统中,如果一个系统在某刻的状态和输入一旦决定,下个时刻的状态和输出就可以确定。如果下一个状态不能确定,但是可以给出概率分布,就成为随机系统。如果概率分布都不能给出,但是可以给出所有可能状态的集合,而且所有可能状态的集合使用模糊集合来表示,就成为模糊系统。

    客观世界中普遍存在着模糊现象,比如“年轻人”和“老年人”就是模糊概念,它们没有明确内涵和外延,但是使用这些概念时却很少产生误解和歧义。可以说值逻辑只是理想世界的模型,而不是现实世界的模型。

    隶属度函数(Membership Function)和模糊集合(Fuzzy sets)

    隶属度函数是模糊系统的数学基础,它突破了经典集合理论的局限,模糊概念的定量表示成为可能。

    membership1

    棕色的曲线就是一个隶属度函数,0是不属于,1是完全属于。由于模糊性,所以用[0,1]上的数代替0和1。

    而这个值就是就是属于模糊集合的程度。

    membership2

    而一个模糊集合可以分为两个部分,其中一个成为core,它是一个每个X的隶属度都是1的宽松集合。

    c1

    还有一部分成为boundary,它包含了所有隶属度在0,1之间的元素。

    c2

    隶属度函数的选择主要由模糊集合决定。如果某个集合含有大量的值或者它是连续的,那么一个参数化表示的隶属度函数是适合的,一般分段的线性隶属度函数(Piecewise linear membership functions)是比较好的,它简单而且在计算上是高效的。较常用的是梯形或者三角形,由4或3个参数定义。

    以温度为例,在实际生活中我们常说多少度,冷不冷。多少度可以是一个确定的数值或者区间,但是冷不冷就不能固定化,很难找到固定的爆破值。一般可以大致成为冷,暖和,热。

    c3

    可以认为该隶属度函数为A(x)=暖和。

    c4

    c5

    这是热。

    AForge.NET表示模糊集合和隶属度函数

    需要用到到AForge,AForge.Fuzzy和AForge.Controls。

    AForge是核心类,AForge.Fuzzy有关模糊系统的,而AForge.Controls是一些控件,比较常用的是表格(chart)控件。

    可以去http://code.google.com/p/aforge/下载,然后引用需要的。我直接用的NuGet。

    membership3

    AForge.Fuzzy在NuGet没有哈。

    PiecewiseLinearFunction类无疑是最灵活的,但是如果隶属度函数是梯形或者三角形,有个更快捷的类可供使用:TrapezoidalFunction。

    比如我们要建立一个梯形的隶属度函数,如果:

    c3

    有4个点要注意,(10,0)和(40,0),它们是boundary的边界。(20,0)和(30,0)是core的边界。

    TrapezoidalFunction functionCool =new TrapezoidalFunction(10,20,30,40);FuzzySet fsCool =new FuzzySet("COLD", functionCool);
  • Ajax实现评论的顶和踩功能

    Ajax实现评论的顶和踩功能

    这算是社团布置的一个假期小作业吧,我只是提出我自己的解决方案,不一定是最合适的。

    效果大致如下:

    2

    javascript这块使用jquery。新建一个Asp.net web项目,使用NuGet获取Jquery最新版。

    ajaxDemo1

    数据库方面使用Nhibernate,用Install-Package Nhibernate引用。

    数据库是用的PostgreSQL,Install-Package Npgsql把驱动装上。我这里偷个懒,数据库名,用户名和密码都是ajaxDemo了。

    创建数据库:

    CREATE DATABASE "ajaxDemo" WITH OWNER = "ajaxDemo" ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'Chinese (Simplified)_People''s Republic of China.936' LC_CTYPE = 'Chinese (Simplified)_People''s Republic of China.936' CONNECTION LIMIT = -1;
  • 真心好用的VS扩展–NuGet

    真心好用的VS扩展–NuGet

    无聊中手机上网翻到的,先没明白这是什么东西,等我实际体验了一把以后完全震惊了,太给力了!

    NuGet的官方说明是:NuGet是一款Visual Studio的扩展,它可以简单的安装、升级开源库和工具。

    官网地址:http://www.nuget.org/

    官网最醒目的位置就是下载链接,安装完成后我们来快速体验一把。

    手上有个小项目需要使用到json格式,一般情况我会先Google一下有没有相关的开源库(这个肯定是有的)。

    然后从一些博文中发现了Json.net,然后继续Google之,找到Json.net的官网,然后下载最新的稳定版本,找出DLL文件引用它。

    是不是很复杂?很繁琐?(其实没用NuGet之前我一直觉得这样干很方便的)

    使用NuGet我们就可以很快搞定了。

    右键Managet NuGet Packages

    nuget1

    搜索json,然后看看结果和右侧的介绍,Json.net排在第一位,点Install安装。

    nuget2

    然后等待下载完成,可以看到引用里面已经有了Json.net了。

    nuget3

    那么NuGet到底干了什么呢?下载的开源库在何处呢?看一下输出结果就知道了。

    nuget4

    在packages文件夹下可以找到相关dll文件。

    nuget5

    还有命令行模式可以选用

    还是以Json.net举例,输入Install-Package Newtonsoft.Json即可。

    nuget7

    NuGet还有一个优势就是可以处理依赖(我个人觉得Net的依赖复杂程度没有java麻烦)。以Spring.Core为例子,它依赖Common.Logging。

    自然NuGet完美解决了。

    nuget9

    我没有试升级库功能,但是个人感觉NuGet还是有一些局限的。

    首先需要联网(其实可以建立自己的服务器…我粗心了,谢谢了楼下各位了),其次是每次都下载新的,而且会把针对不同.Net版本的都down下来。…

  • 分享几篇文章(PDF版)

    后天就要回老家了,除了团团年估计也没有其他好玩的,就琢磨下点经典文章带回去看看。

    Google一番找到了老赵很早以前的文章:

    http://www.cnblogs.com/JeffreyZhao/archive/2009/03/02/1401259.html

    说来惭愧,里面的十余篇文章我只看过一篇,正好就补补知识。

    原文给出的连接多是在线版,我找了部分的pdf给大家分享一下。

    合集下载:

    所有程序员都应该至少读上两遍的十篇论文.rar

    单个文章:

  • android游戏开发框架libgdx的使用(十六)—使用TexturePacker工具加快开发速度

    android游戏开发框架libgdx的使用(十六)—使用TexturePacker工具加快开发速度

    libgdx绝对是一个相当不错的游戏引擎,最近一段时间的学习我感觉收获很多。但是我一直对于libgdx加载的图片大小必须是2的次方感到很纠结。

    如果是一张一般的图片想在libgdx中使用的话就需要自己去用ps什么的把图像拉一下,一两张没关系,但是数量大了还是有点烦。

    而且拉大的图片还需要TextureRegion来切割一下,实在麻烦。仔细看了一下libgdx的tool包,发现早有解决方案了。

    具体的类是imagepacker,在com.badlogic.gdx.tools.imagepacker包之中。它可以将多张图片合并在一张之中。同时可以通过原有文件的文件名获得图片资源。

    这里有几张图片:

    111415xpic2766

    将它们放在一个文件夹中(这个文件夹没有其他东西了)。引用gdx-tool.jar。

    代码如下:

    Settings settings =new Settings(); settings.alias =true; TexturePacker.process(settings,"D:img","D:imgoutput");

    在output文件夹中可以找到两个文件,其中一个是合成好的图片

    img1

    另外一个名为pack,其中记录了源文件的位置,大小和名称。

    将图片和pack文件拷贝到项目目录。这里说明一下,pack文件的文件名可以随便改,合成的图片如果需要改名的话就需要改一下pack文件里面的内容了。

    使用时的具体类是TextureAtlas。

    代码:

    package com.cnblogs.htynkn.game;import com.badlogic.gdx.ApplicationListener;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.graphics.GL10;import com.badlogic.gdx.graphics.g2d.TextureAtlas;import com.badlogic.gdx.scenes.scene2d.Stage;import com.badlogic.gdx.scenes.scene2d.ui.Image;publicclass TexturePackerDemo implements ApplicationListener { Stage stage;@Overridepublicvoidcreate() { stage=new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),false); TextureAtlas atlas=new TextureAtlas(Gdx.files.internal("imgs/pack"));//根据pack文件获取所有图片 
  • 分享从网上收集的一些游戏资源,以RPG类为主

    分享从网上收集的一些游戏资源,以RPG类为主

    最近一直在研究libgdx引擎的使用,自然需要一些图片资源,一边学习一边从网上搬运各种用的上的资源,估摸可能有人用的上,特意分享在此。

    下载地址:点击此处

    收集的资源主要分5个大类,我每一类传几张预览图吧:

    1.tiles

    主要是tiledmap用的。

    TileA1

     

    TileC

    2.场景

    002-Woods01

     

    005-Beach01

    3.过渡

    000007-9S-Transition07

     

    000012-9S-Transition12

    4.角色

    这个的角色资源包含脸部特写,也包含人物走动的图,还有一张情绪图。

    chara01_a

     

    face_m02c

    5.游戏结束

    000016-9S-GameOver16

     

    000026-9S-GameOver26

    反正东西也不大,我就不分开打包了。大家要是觉得有用就下载吧。

    下载地址:

    诚通网盘:http://www.ctdisk.com/file/4279436

     

    这个网站也不错哈~素材丰富 http://www.66rpg.com/category.php?c=3

  • android游戏开发框架libgdx的使用(十七)—TiledMap中角色的行动路径

    android游戏开发框架libgdx的使用(十七)—TiledMap中角色的行动路径

    分享了一些素材,有兴趣的朋友可以看看:http://www.cnblogs.com/htynkn/archive/2012/01/19/game_resource.html

    前些日子的文章介绍了tiledmap的主角出现和移动等等问题。相对于主角游戏自然还应该有敌人(?)。

    与主角不同的是,这些元素的移动时程序控制的,一般有3种。

    1.随主角的移动变化,靠近主角或远离主角

    2.按照固定路线移动

    3.不动

    第一种的话完全是看你的游戏逻辑决定,和tiledmap关系不大。第二种的话我们可以避免硬编码(把移动路径写入程序代码中),而采用tiledmap实现,下面我们来看看具体过程。

    还是新建一张地图,我选用的大小是5030,块大小:3232。

    towntown1

    然后绘制地图:

    adancedmap

    我们假定敌人从地图中间的那条路走到左边的角上。路径如下:

    adancedmap

    现在新建一个对象层,命名为wayPoints。在几个关键的地方标注上对象,命名为wayPoint1,wayPoint2…

    adancedmap

    处理好地图后拷贝到项目中。

    advancelibgdx

    现在新建一个Enemy类,继承Image。

    现在来整理一下思路,首先我们要得到所有的wayPoint.而第一个wayPoint就是角色的初始化点。那么Enemy类首先需要一个Vector2列表,然后继承Image需要一个TextureRegion。

    所以构造函数为

    publicEnemy(List<vector2> vector2s, TextureRegion region) {super(region);this.vector2s = vector2s; currentIndex =0;this.x = vector2s.get(currentIndex).x;this.y = vector2s.get(currentIndex).y; }

    初始点有了,如何移动呢?我们先来看一下坐标

    advancelibgdx2

    我们现在在点1位置,将要移动到点2位置。只需计算x,y,z长度,然后求出对应的moveX和moveY就可以了。

    float x = Math.abs(v1.x - v2.x);float