anylogic

基于Anylogic的Java代码入门教程

2020-05-05  本文已影响0人  whl1207

由于Anylogic使用的是java代码,因此对java没有任何基础的同学可能会在学习时有些吃力。所以本文的目的在于教会大家如何在Anylogic中使用java代码来编写程序。

个人站点:https://whl1207.github.io/,记录一些学习笔记,主要写点基于anylogic的仿真和web开发方面的知识点。有兴趣的同学可以探讨一下!

在正式开始学习之前先给大家介绍一个函数:

System.out.print();

这个函数用于在控制台输出消息,那么该函数应该在哪里输入呢?

该函数将在学习的过程中经常使用到,并且该函数也经常用于在开发中寻找错误。下面我们将主要使用该函数对基于Anylogic的java入门予以介绍。

一、变量

(一)基本的变量类型

在java中变量有很多种类型,也可以自己进行创建。但基础的数据类型就这样几个:

数值型:

整型(整数):

字符型:

布尔型:

在Anylogic常用的基本变量类型主要是:

(二)Anylogic中常用的其他变量类型

除了java常用的一些变量类型,Anylogic还会经常使用到一些其他的变量类型,如:

(三)变量的声明和使用

1、声明变量

基础的声明变量可以在代码中直接声明。

语法:数据类型 变量名

如:

double score;     //声明双精度浮点型变量score存储分数
String name;      //声明字符串型变量name存储姓名
char sex;           //声明字符型变量sex存储性别

在Anylogic中还有另一种声明变量的方式,就是在面板中拖入“参数”或“变量”并指定数据类型来声明该变量,这种方式声明的变量在该智能体的任何位置均可直接使用。

2、变量赋值

变量赋值即将数据存储至对应的内存空间中。

语法: 变量名 = 值

如:

score = 98.5;     //存储98.5
name = "张三";    //存储“张三”
sex = '男';       //存储‘男’

注意在赋值前需要先声明变量。另外在代码中我们注意到所有String类型的变量赋值需要在值的两侧输入"才不会报错。当然也有一种更简单的方法如下:

3、即声明变量又赋值

语法: 数据类型 变量名 = 值

如:

double score = 98.5;
String name= "张三";
char sex = '男'; 

注意这里的代码后都跟了一个';',代表一句话的结束,也是java的语法规则。

(四)调用变量

使用System.out.print()函数来调用变量,当然在实际使用过程中其他函数也都是可以直接调用变量的。

System.out.println(score);       //从控制台输出变量score存储的值
System.out.println(name);      //从控制台输出变量name存储的值
System.out.println(sex);         //从控制台输出变量sex存储的值

现在我们完整的操作一边,在启动时中输入:

String name; 
name = "张三";
System.out.println(name); 

这样我们就能够看到前面声明的变量在控制台输出“张三”二字了。

(四)变量的命名规范

二、数组的使用

(一)定义数组

直接定义数组中元素的个数,代码如下:

int data[] = new int[3]; /*开辟了一个长度为3的数组*/

但有时需要根据实际情况定义数组中元素的个数。可分步开辟空间,代码如下:

int data[] = null; 
data = new int[3]; /*开辟了一个长度为3的数组*/

(二)定义数组中元素的值

data[0] = 10; // 第一个元素
data[1] = 20; // 第二个元素
data[2] = 30; // 第三个元素

当然也可以采用循环语句来定义值。

(三)静态数组的初始化

有时我们一开始就知道数组中元素的值,我们可以使用如下的代码来定义数组:

int data[] = {1, 2, 4, 545, 11, 32, 13131, 4444};

(四)二维数组的初始化

定义二维数组我们可以采用如下的语法来定义,具体代码如下:

int[][] arr = new int[3][2]; /*动态初始化*/
int data[][] = new int[][] {{1, 2, 3}, {4, 5}, {6, 7, 8, 9}}; /*可以定义不是等列数组的数组*/

二维数组的调用可以使用如下语法来调用:

三、基础函数

(一)常用的数学函数

1、数学计算

2、产生随机值

产生随机数的函数有如下一些:

(二)常用的数组函数

1、数组长度

arg.length;
String[][] data = new String[2][5];
System.out.println("第一维数组长度: " + data.length);
System.out.println("第二维数组长度: " + data[0].length);

2、数组排序

Arrays.sort(array);

3、数组反转

使用 Collections.reverse(ArrayList) 可以将数组进行反转。

4、数组填充

通过 Java Util 类的 Array.fill(arrayname,value) 方法和 Array.fill(arrayname ,starting index ,ending index ,value) 方法向数组中填充元素。

5、删除数组元素

使用ArrayList.remove()方法删除数组元素。
对应的ArrayList.remove()也有两种。

objArray.remove(1);/*移除序号*/
objArray.remove("第 0 个元素");/*移除值*/

6、判断数组是否相等

Arrays.equals(ary, ary1);

(三)建立自己的函数

Anylogic中可以直接在代码里写自己的函数,具体格式如下:

/*无返回值的函数*/
void add(){

} 
/*有返回值的函数*/
double getDifference(int a, int b){
    double result = a - b;
    return result;
}

注意在有返回值的函数中需要定义返回值的数据类型。

当然Anylogic还提供了几种可视化的函数编写元素。

1、函数元素

通过这几部就能完成一个函数的编写,然后即可在该智能体中进行引用。

2、行动图元素

可打开行动图面板,通过其中的代码块拼凑出函数,优点是可视化程度高,缺点是编辑起来较为繁琐。

四、判断及循环语句

(一)判断语句

if语句

if(关系表达式1) {
语句体1;
}else if (关系表达式2) {
语句体2;
}…
else {
语句体n+1;
}

switch语句

switch(表达式) {
case 值1:
  语句体1;
  break;
case 值2:
  语句体2;
  break;
…
default:
  语句体n+1;
  break;
}

(二)循环语句

do…while循环语句

do {
循环体语句;
}while((判断条件语句);

for循环语句

for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}

其他说明

五、智能体

在Anylogic最常用的就是智能体的概念,下面讲解以下智能体的相关知识。

(一)多层智能体之间的调用

如果在Main中建立了新的智能体,现在要在Main中调用智能体a中的val变量,可以按以下格式进行调用:

a.val

如果需要在a中调用Main中的val1变量,可以按以下格式进行调用:

get_Main().a.val1

(二)智能体

1、创建一个智能体

2、智能体的移动函数

3、智能体的交互函数

第一种函数:发送消息send()/推荐/

第二种函数:及时消息传递:deliver()

4、函数的输入格式

当然智能体的函数还有很多,具体可参照其官方手册。

在智能体内部只需按以下格式输入函数即可完成行为:

this.函数名(参数,参数);

在Main中需按以下格式进行输入:

智能体名称.函数名(参数,参数);

(三)智能体群

1、统计数据

Anylogic能够方便的收集统计智能体群的数据,包含计数、求和、求平均值、求最小值和最大值这几个常见的统计类型。

为智能体群定义新的统计函数的步骤

如需使用函数访问统计,可以使用统计名称+括号的方式输入。即在上面的示例中,如果要计算统计数据,可用peopleStat()函数来获得值。

如何收集智能体群的统计数据

Anylogic提供了收集智能体群中的智能体的统计数据。这些函数在UtilitiesCollection类中定义,并且是全局的(即从任何地方都可以访问)。可以从列表中调用任何函数,只输入它的名字而不需要前缀,如:

count( people, p -> p.income > 10000 );

计算满足条件的智能体个数

count(people,p->p.income>10000);

在这个例子中将计算income(收入)超过10000的人数。作为第一个函数参数要指定要遍历的群名。第二个参数指定为每个智能体检查的条件。这种情况下,首先要定义局部变量(它以p命名,但它可以以任何其他名称命名)。可以在指定条件下使用这个局部变量来引用目前正在检查的智能体。然后输入箭头运算符->(它由两个符号组成),并定义了它们的条件p.income>10000。count()函数遍历了所有people群中的智能体,并检查每个智能体的收入。如果智能体的收入大于10000(定义条件为true)就计算这个特定的智能体。

count(people,p->p.sex==MALE&&p.age>=18);

这里检查两个条件(使用逻辑和操作符&&告诉Anyogic第一个和第二个条件都应为真),只计算满足两个条件的智能体。

为了获得目前位于people的智能体的个数,可以使用:people.size();
在群中获得平均值(智能体的属性等)

average( people, p -> p.income );

这里计算people群中智能体的平均收入。

average(people,p->p.income,p->p.age>18);

这里计算了这些人的平均收入,他们年龄需要超过18。函数第一个参数指定了群,第二个参数定义了需要计算的值,第三个参数是条件。这里只对满足这个条件的智能体计算平均值。注意在指定条件之前,需再次定义局部变量p。

在智能体群中获得最小(最大值)值

maxWhere(people,p->p);

这里计算了所有人的最大收入。

maxWhere(people,p->p.income,p->p.sex==FEMALE);

这里计算了智能体群中的所有女性的最大收入。

计算智能体值的总和

sum( people, p -> p.income );

这里计算了智能体群中的所有人的总收入。

sumWhere( people, p -> p.income, p -> p.age > 18 );

这里计算了年龄超过18岁的成人的总收入。

随机选择智能体群中的智能体

AnyLogic提供了从给定群中选择随机智能体的函数。这些函数在Utilities类中定义,并且是全局的(可从模型代码的每个位置访问)。可以通过输入其名称来调用下面列表中的任何函数,而不使用带有people名称的前缀:randomWhere(people,p->p.income>10000);

Person wealthyPerson=randomWhere(people,p->p.income>10000);
Person wealthyMan=randomWhere(people,p->p.income>10000&&p.sex==MALE);

这里检查两个条件(使用逻辑和运算符&&告诉AnyLogic第一个和第二个条件都应为真)。该函数返回一个随机选择的智能体,满足这两个条件。

Person wealthyYoungMan=randomWhere( people , p->p.income>10000 && p.sex == MALE &&p.age<21);

还有另一个函数,使用户能够使用指定的自定义随机数生成器而不是默认值:

选择处于特定状态的智能体

要从智能体群中选择一个智能体群的子集,可用使用filter()函数。函数接受原始智能体群作为第一个参数,然后指定过滤条件。

举个例子:有两种智能体,客户和卡车。要从客户那里呼叫最近的卡车,下一行代码需要从卡车智能体群(main.trucks)中获得最近的卡车,可以输入:

Truck truck = getNearestAgent( filter( main.trucks, t -> t.inState( Truck.Idle ) );

定义了局部变量t,指定筛选条件:t.inState( Truck.Idle )。卡车状态图有空闲、繁忙两种状态,将从目前处于闲置状态的卡车放入子集,并寻找最近的卡车。

从智能体群中选择特殊的智能体

Person person = top( people, p -> p.age );

这里从这个群中得到了一个年龄最大的人。如果群为空函数将返回null。

List women = filter( people, p -> p.gender == FEMALE );
List idleTrucks = filter( trucks, t -> t.inState(Idle) );
Person person = findFirst( people, p -> p.age > 20 );

在智能体群中排序智能体

当需对群做一些操作时,可能需要用一些值来排序。在群中不需要重新排序智能体,您可以使用以下Anylogic函数来获取有序的列表,然后在代码中使用它。

List sortedByAgeAsc = sortAscending( people, p -> p.age );
List sortedByIncomeDesc = sortDescending( people, p -> p.income );

个人主页:https://whl1207.github.io/

上一篇 下一篇

猜你喜欢

热点阅读