智能系统 - 第一部分






4.03/5 (18投票s)
2004年12月2日
7分钟阅读

43161

981
实践中的智能系统入门。
引言
传统的规则与运行软件变得越来越乏味,因为它们让用户一遍又一遍地执行相同的任务而没有任何响应。尽管它们能够做到,但大多数软件并不关心你正在做什么,或者你感到厌倦做什么。另一个问题是,由于用户习惯不同以及开发者认为“越多越好”,软件提供的功能超出了需求。在这种情况下,对于大多数应用程序软件而言,在其众多属性和用例中,只有少数几个用户会偏爱,而其他的大多数都闲置不用。因此,软件形成了一种狭窄但枯燥的使用模式。正如你在技术(应用程序软件、电视、手机、PDA、信息亭、工业系统等)中轻易观察到的那样,辅助和自适应定制系统是当今最受欢迎的类型,而用户开始抱怨静态系统。正如微软 Office 2000 智能菜单或智能字体选择组合框的例子所示,即使是微小的一点智能也能让很多人高兴。
我将辅助、自适应定制和感知型应用程序统称为智能系统。与人工智能或学习系统不同,智能系统(在本文中将简称为“IS”)具有“初始设置”的决策和变量,这些决策和变量是根据用例适当选择的。
在本系列文章中,我将介绍一些你可以轻松用于应用程序以使其更智能的 IS 应用。此外,我还会尝试提及 IS 的基本思想和机制。对于所有工作,我使用了我最喜欢的组合:C# 和 Visual Studio .NET 2003。
背景
虽然这不是使用代码的先决条件,但我希望介绍 IS 的理念。那些迫不及待想在他们的应用程序中使用 IS 的人可以跳过这一部分,而“思考型开发者”则推荐阅读。
- 人类会观察。我们有五种感官来观察。正是这五种感官让我们感知周围的事物。
- 人类会记忆。观察可以随时停止和继续,并且可以随时添加新的观察。
- 人类是智能的。收集到的观察结果的处理是通过大量的逻辑门完成的,这些逻辑门由当前和过去的观察结果提供支持。
要得出“这些天天气很冷”这样的结果,我们必须观察连续几天的寒冷天气,记住之前的观察结果,将它们连接起来,然后得出结论(想想看!)。同样地;
- 应用程序有事件。它们是让应用程序感知周围事物的事件(不幸的是,它们只有一个感官)。
- 应用程序有记忆。当前信息可以以文件的形式永久保存,未来的信息可以附加到其中。
- 应用程序是呆板的。但我们可以教育它们!这是 IS 的主要思想。
循序渐进的 IS
A - 计数
要对运行中的应用程序进行观察,你可以使用事件。事件触发的次数、何时最常触发、在什么其他条件下会触发该事件、哪些事件按顺序触发、哪些事件后面跟着错误……这些问题数不胜数。答案是通过计数获得的。你必须开发一个计数机制,该机制应易于挂接到事件处理程序。如果你想了解点击按钮的频率,你必须设置一个整数标志,每次点击时都将其加一并带上时间戳,然后用观察时间除以点击次数。
B - 存储
到目前为止你进行的观察(计数)是有价值的,并且必须永久保存。(一段时间后)每次运行你的应用程序时,用户不应从头开始,而应感到对应用程序更熟悉。因此,你必须存储计数数据。对于存储,你应该使用一种简单、快速访问且标准的方法。这显然指向 XML。
C - 处理
现在,你拥有了一个实时计数机制和关于你的应用程序使用情况的存储信息。处理是 IS 应用程序的下一个也是最关键的部分。你作为开发者,必须确定 UI 策略。对于最常用的用例,我可以做什么使其更友好,或者对于最不常用的用例,可以将其隐藏起来?如果一个功能不被使用(这意味着用户不知道它),我应该如何为用户提供替代方式(或快捷方式)?我应该如何提醒用户他今天没有执行一项他通常每天都做的事情?在确定了策略之后,你应该选择合适的处理(分级)机制。你必须为分级赋予精确的含义:什么意味着“未使用”,什么意味着“经常使用”,什么意味着“他忘记了”等等。事件随时间的变化分布将有助于实现这一点。分布可以是高斯(正态)分布、瑞利分布等。(这个方法将在我文章的下一部分举例说明。)对讨厌数学的人来说有个好消息:你也可以使用预定义的分级级别并使用 if-else 语句。例如,“如果 button1Click 事件每天触发超过 500 次,则 button1 是常用的,将 button1 指定为接受按钮”或“当学生在列表中连续十天未被选中时,隐藏他”……
使用代码
示例代码展示了一个智能组合框的自顶向下实现,它根据其选择次数对其项目进行排序。根据你的观察字段的属性,你可以为你自己的信息对象构建类。我构建了一个名为 GradeInfo
的类,其结构如下,我的项目其余部分依赖于 GradeInfo
类。我找不到一个更短更合适的名字来表示“要计算其事件频率的对象”,我将在代码和文章中称之为“item”。我希望这不会造成混淆。
using System;
namespace Codelaboratory.IntelligentSystems
{
public class GradeInfo
{
private string itemName;
private bool recentlyUsed;
private DateTime lastHitDate;
private int hits;
private int gradePoint;
public GradeInfo()
{
}
// Public properties
.
.
.
}
}
我认为 GradeInfo
类中的一切都很明显。大多数都是有助于我处理的字段;除了 itemName
之外,其他都不是必需的。itemName
是被计数的标识符。(对于前面的 buttonClick
示例,itemName
是按钮的名称,“button1”)。
我的项目是公司。要开始对项目进行分级,你必须向 ItemGrader
类提供你想分级的项目集合;以及标识成员,即用作 itemName
的对象的属性名称。
private void ISExample_Load(object sender, System.EventArgs e)
{
// Usual comboBox settings
this.cmbIntelligent.DataSource = this.Companies;
this.cmbIntelligent.DisplayMember = "Name";
// ItemGrader class settings
ItemGrader itemGrader = new ItemGrader();
itemGrader.Items = this.Companies;
itemGrader.IdentifyingMember = "Name";
itemGrader.InitializeGrading();
}
ItemGrader
类封装了必要的方法和属性来创建 GradeInfo
对象,并使计数过程准备好存储。一旦你完成了上述初始化,你就必须决定在哪里触发计数!ItemGrader
对象最重要的方法是 Hit
方法。此方法是 static
的,并在调用时将指定项的命中数加一。
private void cmbItems_SelectedIndexChanged(object sender, System.EventArgs e)
{
// Increments the selected Company hit by 1.
ItemGrader.Hit(((Company) this.cmbItems.SelectedItem)).Name);
// Normal application run
.
.
.
}
随着项目命中数的计算并存储在 XML 文件中,你的宝贵信息正在成熟。你已经可以通过项目的 GradeInfo
对象使用这些信息了。要实现这一点,你必须通过将 itemName
作为输入参数来调用 GetGrade(string itemName)
方法。
GradeInfo gradeInfo = ItemGrader.GetGrade("myCompany.Name");
或者,为了获取分数;
int point = ItemGrader.GetGradePoint("myCompany.Name");
GradeComputer
类保留用于主要处理算法。目前,该类包含直接排序机制,由 ReorderCollection (ArrayList items)
方法提供。此方法按使用频率对项目进行排序,并返回结果集合供使用。例如
private void btnSymbolic_Click(object sender, System.EventArgs e)
{
ArrayList list = GradeComputer.ReorderCollection(this.Companies ,"Name");
this.cmbIntelligent.DataSource = list;
this.cmbIntelligent.DisplayMember = "Name";
}
结论
正如你在演示项目中看到的,公司在运行时按选择数量的降序重新排序。这个组合框只是 IS 的一个实际示例,很快将在 CodeProject 上作为独立的自定义控件发布。
亲爱的 CodeProject 网站开发者们;你们可以在主页的论坛主题组合框(有编程问题?)中使用我的代码,因为我只访问 Code Project 的两三个论坛,但我总是深入组合框来选择它们。我已经有一个登录 cookie 了。
在第二部分……
- IS 的新方面被简化为“我只相信我所见的”开发者。
- 更精确的用户分析和更令用户惊喜的功能。
- 将嵌入式数学分布放在一个单独的程序集中,远离开发者。
GradeComputer
类中提供更多方便且重载的方法用于处理结果。- 一个拖放式智能控件。