由于Anylogic使用的是java代碼贬养,因此對java沒有任何基礎的同學可能會在學習時有些吃力拼余。所以本文的目的在于教會大家如何在Anylogic中使用java代碼來編寫程序仰禀。
個人站點:https://whl1207.github.io/,記錄一些學習筆記秋泄,主要寫點基于anylogic的仿真和web開發(fā)方面的知識點。有興趣的同學可以探討一下规阀!
在正式開始學習之前先給大家介紹一個函數(shù):
System.out.print();
這個函數(shù)用于在控制臺輸出消息恒序,那么該函數(shù)應該在哪里輸入呢?
- 1谁撼、打開Anylogic軟件歧胁。
- 2、在任意位置新建一個模型。
- 3与帆、建好后了赌,單擊Main智能體的空白位置。
- 4玄糟、在右側Main的屬性面板中找到智能體行動的啟動時的輸入欄勿她。
- 5、在其中輸入System.out.print(1);阵翎。
- 6逢并、啟動模型并運行。
- 7郭卫、觀察到控制臺中輸出了1砍聊,說明代碼輸入成功。
該函數(shù)將在學習的過程中經(jīng)常使用到贰军,并且該函數(shù)也經(jīng)常用于在開發(fā)中尋找錯誤玻蝌。下面我們將主要使用該函數(shù)對基于Anylogic的java入門予以介紹。
一词疼、變量
(一)基本的變量類型
在java中變量有很多種類型俯树,也可以自己進行創(chuàng)建。但基礎的數(shù)據(jù)類型就這樣幾個:
數(shù)值型:
整型(整數(shù)):
- byte:范圍為(-27,27-1)
- short:范圍為(-215,215-1)
- int:范圍為(-231,231-1)
- long:范圍為(-263,263-1)
浮點型(小數(shù)): - float:有效位數(shù)15位
- double:有效位數(shù)15位
字符型:
- char:Unicide字符集贰盗,只能儲存單個字符许饿。
- String:存儲一串字符。
布爾型:
- boolean:true/false
在Anylogic常用的基本變量類型主要是:
- boolean
- int
- double
- String
(二)Anylogic中常用的其他變量類型
除了java常用的一些變量類型舵盈,Anylogic還會經(jīng)常使用到一些其他的變量類型陋率,如:
- double []:由小數(shù)構成的數(shù)組
- double [][]:由小數(shù)構成的二維數(shù)組
- Agent:通用的智能體類型
- 自建的智能體類型
- object
(三)變量的聲明和使用
1、聲明變量
基礎的聲明變量可以在代碼中直接聲明秽晚。
語法:數(shù)據(jù)類型 變量名
如:
double score; //聲明雙精度浮點型變量score存儲分數(shù)
String name; //聲明字符串型變量name存儲姓名
char sex; //聲明字符型變量sex存儲性別
在Anylogic中還有另一種聲明變量的方式瓦糟,就是在面板中拖入“參數(shù)”或“變量”并指定數(shù)據(jù)類型來聲明該變量,這種方式聲明的變量在該智能體的任何位置均可直接使用爆惧。
2狸页、變量賦值
變量賦值即將數(shù)據(jù)存儲至對應的內存空間中。
語法: 變量名 = 值
如:
score = 98.5; //存儲98.5
name = "張三"; //存儲“張三”
sex = '男'; //存儲‘男’
注意在賦值前需要先聲明變量扯再。另外在代碼中我們注意到所有String類型的變量賦值需要在值的兩側輸入"才不會報錯芍耘。當然也有一種更簡單的方法如下:
3、即聲明變量又賦值
語法: 數(shù)據(jù)類型 變量名 = 值
如:
double score = 98.5;
String name= "張三";
char sex = '男';
注意這里的代碼后都跟了一個';'熄阻,代表一句話的結束斋竞,也是java的語法規(guī)則。
(四)調用變量
使用System.out.print()函數(shù)來調用變量秃殉,當然在實際使用過程中其他函數(shù)也都是可以直接調用變量的坝初。
System.out.println(score); //從控制臺輸出變量score存儲的值
System.out.println(name); //從控制臺輸出變量name存儲的值
System.out.println(sex); //從控制臺輸出變量sex存儲的值
現(xiàn)在我們完整的操作一邊浸剩,在啟動時中輸入:
String name;
name = "張三";
System.out.println(name);
這樣我們就能夠看到前面聲明的變量在控制臺輸出“張三”二字了。
(四)變量的命名規(guī)范
- 在Anylogic中一般使用英文單詞或字母來命名變量鳄袍。
- 多個英文單詞組成的變量可在每個單詞的首字母大寫绢要,中間不留空格
- 在Anylogic中還有特殊的命名方法,可以使用中文命名變量和類型拗小,在不報錯的前提下可以使用重罪,方便辨識。
二哀九、數(shù)組的使用
(一)定義數(shù)組
直接定義數(shù)組中元素的個數(shù)剿配,代碼如下:
int data[] = new int[3]; /*開辟了一個長度為3的數(shù)組*/
但有時需要根據(jù)實際情況定義數(shù)組中元素的個數(shù)≡氖可分步開辟空間呼胚,代碼如下:
int data[] = null;
data = new int[3]; /*開辟了一個長度為3的數(shù)組*/
(二)定義數(shù)組中元素的值
data[0] = 10; // 第一個元素
data[1] = 20; // 第二個元素
data[2] = 30; // 第三個元素
當然也可以采用循環(huán)語句來定義值。
(三)靜態(tài)數(shù)組的初始化
有時我們一開始就知道數(shù)組中元素的值息裸,我們可以使用如下的代碼來定義數(shù)組:
int data[] = {1, 2, 4, 545, 11, 32, 13131, 4444};
(四)二維數(shù)組的初始化
定義二維數(shù)組我們可以采用如下的語法來定義蝇更,具體代碼如下:
int[][] arr = new int[3][2]; /*動態(tài)初始化*/
int data[][] = new int[][] {{1, 2, 3}, {4, 5}, {6, 7, 8, 9}}; /*可以定義不是等列數(shù)組的數(shù)組*/
二維數(shù)組的調用可以使用如下語法來調用:
- 語法: 數(shù)組名稱[所在行][所在列]
三、基礎函數(shù)
(一)常用的數(shù)學函數(shù)
1界牡、數(shù)學計算
- Math.E:產(chǎn)生自然常數(shù)e=2.7182818284590452354簿寂。
- Math.exp(x):計算e的x次方。
- Math.pow(a,b):計算a的b次方宿亡。
- Math.sqrt(a):計算a的開方。
- Math.abs(a):計算a的絕對值纳令。
- Math.log(e):計算以e為底的對數(shù)
- Math.log10(100):計算以10為底的對數(shù)
- Math.max(x, y):返回x挽荠、y中較大的那個數(shù)
- Math.min(x, y):返回x、y中較小的那個數(shù)
- Math.ceil(12.3):返回最近的且大于該值的整數(shù)13.0
- Math.ceil(-12.3):返回-12.0
- Math.floor(12.3):返回最近的且小于該值的整數(shù)12.0
- Math.floor(-12.3):返回-13.0
- Math.hypot(x, y):返回√(x2+y2)
2平绩、產(chǎn)生隨機值
產(chǎn)生隨機數(shù)的函數(shù)有如下一些:
- Math.random():產(chǎn)生0-1之間的double類型的小數(shù)圈匆。
- (int)(Math.random()*10):產(chǎn)生0-9之間的整數(shù)。
(二)常用的數(shù)組函數(shù)
1捏雌、數(shù)組長度
- 一維數(shù)組的長度
arg.length;
- 二維數(shù)組的長度
String[][] data = new String[2][5];
System.out.println("第一維數(shù)組長度: " + data.length);
System.out.println("第二維數(shù)組長度: " + data[0].length);
2跃赚、數(shù)組排序
Arrays.sort(array);
3、數(shù)組反轉
使用 Collections.reverse(ArrayList) 可以將數(shù)組進行反轉性湿。
4纬傲、數(shù)組填充
通過 Java Util 類的 Array.fill(arrayname,value) 方法和 Array.fill(arrayname ,starting index ,ending index ,value) 方法向數(shù)組中填充元素。
5肤频、刪除數(shù)組元素
使用ArrayList.remove()方法刪除數(shù)組元素叹括。
對應的ArrayList.remove()也有兩種。
objArray.remove(1);/*移除序號*/
objArray.remove("第 0 個元素");/*移除值*/
6宵荒、判斷數(shù)組是否相等
Arrays.equals(ary, ary1);
(三)建立自己的函數(shù)
Anylogic中可以直接在代碼里寫自己的函數(shù)汁雷,具體格式如下:
/*無返回值的函數(shù)*/
void add(){
}
/*有返回值的函數(shù)*/
double getDifference(int a, int b){
double result = a - b;
return result;
}
注意在有返回值的函數(shù)中需要定義返回值的數(shù)據(jù)類型净嘀。
當然Anylogic還提供了幾種可視化的函數(shù)編寫元素。
1侠讯、函數(shù)元素
- 直接將智能體面板的函數(shù)元素拖到主界面挖藏。
- 命名該函數(shù)。
- 選擇參數(shù)的輸入厢漩。
- 定義返回值的類型膜眠。
- 在函數(shù)體中輸入代碼。
通過這幾部就能完成一個函數(shù)的編寫袁翁,然后即可在該智能體中進行引用柴底。
2、行動圖元素
可打開行動圖面板粱胜,通過其中的代碼塊拼湊出函數(shù)柄驻,優(yōu)點是可視化程度高,缺點是編輯起來較為繁瑣焙压。
四鸿脓、判斷及循環(huán)語句
(一)判斷語句
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;
}
(二)循環(huán)語句
do…while循環(huán)語句
do {
循環(huán)體語句;
}while((判斷條件語句);
for循環(huán)語句
for(初始化語句;判斷條件語句;控制條件語句) {
循環(huán)體語句;
}
其他說明
- break:退出當前循環(huán)
- continue:退出本次循環(huán)
五、智能體
在Anylogic最常用的就是智能體的概念涯曲,下面講解以下智能體的相關知識野哭。
(一)多層智能體之間的調用
如果在Main中建立了新的智能體,現(xiàn)在要在Main中調用智能體a中的val變量幻件,可以按以下格式進行調用:
a.val
如果需要在a中調用Main中的val1變量拨黔,可以按以下格式進行調用:
get_Main().a.val1
(二)智能體
1、創(chuàng)建一個智能體
- 在工程面板創(chuàng)建一個智能體類型绰沥。
- 命名這個智能體類型篱蝇。
- 選擇該智能體的動畫,為示例函數(shù)的運行徽曲,可選一個人作為動畫零截。
- 創(chuàng)建完成后,將創(chuàng)建好的智能體類型拖到Main中即可完成智能體的創(chuàng)建秃臣。
2涧衙、智能體的移動函數(shù)
- setXY(double x,double y):設置智能體位置。
- getX()奥此、getY()弧哎、getZ():返回智能體在連續(xù)空間中的X、Y得院、Z坐標傻铣。
- Position getPosition():以Position類型的形式返回連續(xù)空間中智能體最新的X、Y祥绞、Z坐標非洲。
- void moveTo(double x,double y):向x鸭限、y位置移動
- void moveTo(double x,double y,double z):向x、y两踏、z位置移動
- void moveTo(Agent agent):向agent這個智能體位置移動
- boolean isMoving():判斷智能體是否在移動败京。
- double timeToArrival():返回智能體到達目標位置的時間。
- void stop():停止智能體的移動梦染。
- void moveToInTime(Point location, double tripTime):在給定目標位置的方向移動赡麦。更改智能體的速度,使在tripTime的時間內到達目標帕识。
- void moveToNearestAgent (java.lang.Iterable<? extends Agent> agents, double tripTime):移動到給定的智能體群中最近的智能體泛粹。停止任何當前的移動。更改智能體的速度肮疗,使在tripTime的時間內到達目標晶姊。
- void moveToInTime(double x, double y, double tripTime):在連續(xù)的三維或GIS空間的給定目標位置的方向移動。更改智能體的速度伪货,使在tripTime的時間內到達目標们衙。
- void moveToInTime(double x, double y, double z, double tripTime):在連續(xù)3D的目標位置開始移動。改變智能體速度碱呼,使在tripTime的時間內到達目標蒙挑。
- void moveToInTime(Node node, Point location, double tripTime):開始向給定的網(wǎng)絡節(jié)點移動。更改智能體的速度愚臀,使在tripTime的時間內到達目標忆蚀。
- void moveToInTime(Attractor attractor, double tripTime):開始移動到給定吸引子。更改智能體的速度姑裂,使在tripTime的時間內到達目標蜓谋。
- void jumpTo(double x, double y):在連續(xù)的3D空間中,立即將智能體移動到給定位置炭分。終止任何移動。不調用“到達時”的代碼剑肯。
- void jumpTo(double x, double y, double z):立即將智能體移動到給定位置捧毛。終止任何移動。不調用“到達時”代碼让网。
- void jumpTo(Node node, Point location):立即將智能體移動到給定的網(wǎng)絡位置呀忧。終止任何移動。不調用“到達時”的代碼溃睹。
- void jumpTo(Point location):立即將智能體移動到給定的位置而账。終止任何移動。不調用“到達時”代碼因篇。
- double getTargetX():智能體在移動時返回目標位置的X坐標泞辐,否則返回當前的X坐標笔横。
- double getTargetY():智能體在移動時返回目標位置的Y坐標,否則返回當前的Y坐標咐吼。
- double getTargetZ():智能體在移動時返回目標位置的Z坐標吹缔,否則返回當前的Z坐標。
- double distanceTo(Agent other):計算這個智能體到另一個智能體的距離锯茄。
- double distanceTo(double x, double y):計算這個智能體到給定點的距離厢塘。
- double distanceTo(double x, double y, double z):在連續(xù)空間中計算該智能體到給定點(x,y,z)的距離。
- double distanceTo(Point p):在連續(xù)空間中計算該智能體到給定點(x,y,z)的距離肌幽。
- double getSpeed():在連續(xù)空間中返回智能體速度的當前值(以模型時間單位行走的像素數(shù)來計算)晚碾。注意非零速度并不意味著智能體正在移動,智能體只在調用moveTo()函數(shù)后才開始移動喂急。
- void setSpeed(double v):在連續(xù)空間中更改智能體的速度(以像素為單位)格嘁。如果智能體正在移動,它將繼續(xù)以新的速度移動煮岁。注意非零的速度并不意味著智能體正在移動讥蔽,智能體只在調用moveTo()函數(shù)后才開始移動。
- double getRotation():在連續(xù)三維空間中返回智能體的旋轉角度(弧度制)如果旋轉不被凍結画机,每次旋轉時冶伞,旋轉就會改變,在GIS空間的移動中也會發(fā)生多次變化步氏。
- void setRotation(double rotation):在連續(xù)三維空間中設置智能體動畫的旋轉角度(弧度制)响禽。根據(jù)自動旋轉設置,在下一個調用moveTo()函數(shù)或在當前移動中(如果存在的話)荚醒,這種旋轉值可能會被重寫芋类。
- void setAutomaticHorizontalRotation (boolean yes):設置智能體在移動過程中的自動旋轉。
- boolean isAutomaticHorizontalRotation():智能體在移動過程中被旋轉返回true界阁,否則false侯繁。
- void setVerticalRotation(double rotation):設置垂直旋轉(弧度制),沿三維空間中智能體動畫的Z軸泡躯。根據(jù)自動垂直旋轉設置贮竟,在下一個調用moveTo()函數(shù)或在當前移動(如果存在的話)沿著路徑/折線中,這個旋轉值可能會被重寫较剃。
- double getVerticalRotation():在三維空間中返回智能體的當前垂直旋轉角度咕别。如果設置自動垂直旋轉模式,則每次旋轉時角度改變写穴,并在移動中多次改變惰拱。
- void setAutomaticVerticalRotation(boolean yes):設置智能體是否自動垂直旋轉。
- boolean isAutomaticVerticalRotation():智能體在三維的移動中被旋轉(在垂直方向上啊送,沿著Z軸)返回true偿短,否則返回false欣孤。
3、智能體的交互函數(shù)
第一種函數(shù):發(fā)送消息send()/推薦/
- void sendToAll(Object msg):將消息發(fā)送到智能體所在的同一環(huán)境中的所有智能體翔冀。
- void sendToRandom(Object msg):向同環(huán)境中的一個隨機智能體發(fā)送消息导街。
void sendToAllConnected (Object msg):向所有連接的智能體發(fā)送消息。 - void sendToRandomConnected (Object msg):向隨機選擇的一個已連接的智能體發(fā)送消息纤子。
- void sendToAllNeighbors (Object msg):向所有鄰居發(fā)送信息搬瑰,只有當智能體處于離散空間中時才可用。
- void sendToRandomNeighbor (Object msg):向隨機選擇的鄰居發(fā)送消息控硼,只有當智能體處于離散空間環(huán)境中時才可用泽论。
- void send(Object msg, Agent dest):向給定的智能體發(fā)送消息。
參數(shù):msg——信息卡乾;dest——目標智能體 - void send(Object msg, MessageDeliveryType mode):將消息發(fā)送給智能體或智能體群翼悴,以給定的mode參數(shù)。
第二種函數(shù):及時消息傳遞:deliver()
- void deliverToAllAgentsInside (Object msg):立即向環(huán)境中的所有智能體傳輸信息幔妨。
- void deliverToRandomAgentInside (Object msg):如果存在任何一個智能體鹦赎,立即向環(huán)境中的隨機智能體傳遞消息。
- void deliverToAllConnected(Object msg):向所有已連接的智能體傳遞消息误堡。
- void deliverToRandomConnected (Object msg):向隨機選擇的已連接的智能體傳遞消息古话。
- void deliverToAllNeighbors(Object msg):向所有鄰居傳遞信息。
- void deliverToRandomNeighbor (Object msg):向隨機選擇的鄰居傳遞信息锁施。
- void deliver(Object msg, Agent dest):立即向給定的智能體傳遞消息陪踩。
- void deliver(Object msg, MessageDeliveryType mode):用指定模式將消息傳遞給智能體(群)。
4悉抵、函數(shù)的輸入格式
當然智能體的函數(shù)還有很多肩狂,具體可參照其官方手冊。
在智能體內部只需按以下格式輸入函數(shù)即可完成行為:
this.函數(shù)名(參數(shù),參數(shù));
在Main中需按以下格式進行輸入:
智能體名稱.函數(shù)名(參數(shù),參數(shù));
(三)智能體群
1姥饰、統(tǒng)計數(shù)據(jù)
Anylogic能夠方便的收集統(tǒng)計智能體群的數(shù)據(jù)傻谁,包含計數(shù)、求和列粪、求平均值栅螟、求最小值和最大值這幾個常見的統(tǒng)計類型。
- Count:確定符合指定條件的智能體篱竭。
- Sum:迭代所有智能體并評估每個智能體的指定表達式,返回和步绸。
- Average:迭代所有智能體并評估每個智能體的指定表達式掺逼,返回平均值。
- Min:迭代所有智能體并評估每個智能體的指定表達式瓤介,返回最小值吕喘。
- Max:迭代所有智能體并評估每個智能體的指定表達式赘那,返回最大值。
為智能體群定義新的統(tǒng)計函數(shù)的步驟
- 在圖形編輯器或工程視圖中選擇群氯质。
- 打開屬性視圖的統(tǒng)計部分募舟。
- 單擊添加統(tǒng)計按鈕,創(chuàng)建一個定義統(tǒng)計的新項目闻察。
- 在“名稱”輸入統(tǒng)計函數(shù)的名稱拱礁,用于識別和訪問這個統(tǒng)計函數(shù)。
- 在“類型”中選擇統(tǒng)計函數(shù)的類型辕漂。
- 在“表達式”/“條件“中指定統(tǒng)計條件和函數(shù)呢灶。當在這些字段中編寫代碼時,可以使用item作為局部變量訪問單個元素(智能體)钉嘹。
- 要添加更多的統(tǒng)計項目鸯乃,請重復3-6的步驟。如果不再需要一些統(tǒng)計數(shù)據(jù)跋涣,可以點擊按鈕來刪除相應的項目缨睡。
如需使用函數(shù)訪問統(tǒng)計,可以使用統(tǒng)計名稱+括號的方式輸入陈辱。即在上面的示例中奖年,如果要計算統(tǒng)計數(shù)據(jù),可用peopleStat()函數(shù)來獲得值性置。
如何收集智能體群的統(tǒng)計數(shù)據(jù)
Anylogic提供了收集智能體群中的智能體的統(tǒng)計數(shù)據(jù)拾并。這些函數(shù)在UtilitiesCollection類中定義,并且是全局的(即從任何地方都可以訪問)鹏浅⌒嵋澹可以從列表中調用任何函數(shù),只輸入它的名字而不需要前綴隐砸,如:
count( people, p -> p.income > 10000 );
計算滿足條件的智能體個數(shù)
- int count( population, condition ):計算智能體滿足指定條件的個數(shù)之碗。
例子:
count(people,p->p.income>10000);
在這個例子中將計算income(收入)超過10000的人數(shù)。作為第一個函數(shù)參數(shù)要指定要遍歷的群名季希。第二個參數(shù)指定為每個智能體檢查的條件褪那。這種情況下,首先要定義局部變量(它以p命名式塌,但它可以以任何其他名稱命名)博敬。可以在指定條件下使用這個局部變量來引用目前正在檢查的智能體峰尝。然后輸入箭頭運算符->(它由兩個符號組成)偏窝,并定義了它們的條件p.income>10000。count()函數(shù)遍歷了所有people群中的智能體,并檢查每個智能體的收入祭往。如果智能體的收入大于10000(定義條件為true)就計算這個特定的智能體伦意。
count(people,p->p.sex==MALE&&p.age>=18);
這里檢查兩個條件(使用邏輯和操作符&&告訴Anyogic第一個和第二個條件都應為真),只計算滿足兩個條件的智能體硼补。
為了獲得目前位于people的智能體的個數(shù)驮肉,可以使用:people.size();
在群中獲得平均值(智能體的屬性等)
- double average( population, value ):返回給定智能體群的平均值。例:
average( people, p -> p.income );
這里計算people群中智能體的平均收入已骇。
- double averageWhere(population,value,condition):在給定條件下返回特定人群的平均值离钝。例:
average(people,p->p.income,p->p.age>18);
這里計算了這些人的平均收入,他們年齡需要超過18疾捍。函數(shù)第一個參數(shù)指定了群奈辰,第二個參數(shù)定義了需要計算的值,第三個參數(shù)是條件乱豆。這里只對滿足這個條件的智能體計算平均值奖恰。注意在指定條件之前,需再次定義局部變量p宛裕。
在智能體群中獲得最猩小(最大值)值
- double max(population,value ):返回給定群最大值。
- double maxWhere(population,value,condition):返回給定條件下的智能體中最大值揩尸。
- double min(population,value ):返回給定群最小值蛹屿。
- double minWhere(population,value,condition):返回給定條件下的智能體中最小值。例:
maxWhere(people,p->p)岩榆;
這里計算了所有人的最大收入错负。
maxWhere(people,p->p.income,p->p.sex==FEMALE);
這里計算了智能體群中的所有女性的最大收入。
計算智能體值的總和
- double sum( population, value ):返回在給定群中值的總和勇边。例:
sum( people, p -> p.income );
這里計算了智能體群中的所有人的總收入犹撒。
- double sumWhere( population, value, condition ):返回給定條件、給定群值的總和粒褒。例:
sumWhere( people, p -> p.income, p -> p.age > 18 );
這里計算了年齡超過18歲的成人的總收入识颊。
隨機選擇智能體群中的智能體
AnyLogic提供了從給定群中選擇隨機智能體的函數(shù)。這些函數(shù)在Utilities類中定義奕坟,并且是全局的(可從模型代碼的每個位置訪問)祥款。可以通過輸入其名稱來調用下面列表中的任何函數(shù)月杉,而不使用帶有people名稱的前綴:randomWhere(people,p->p.income>10000);
- Agent randomWhere(population,condition):返回滿足指定條件的給定群中隨機選擇的一個智能體刃跛。如果群為空或者沒有智能體滿足指定的條件應返回null。例子:
Person wealthyPerson=randomWhere(people,p->p.income>10000);
Person wealthyMan=randomWhere(people,p->p.income>10000&&p.sex==MALE);
這里檢查兩個條件(使用邏輯和運算符&&告訴AnyLogic第一個和第二個條件都應為真)苛萎。該函數(shù)返回一個隨機選擇的智能體奠伪,滿足這兩個條件跌帐。
Person wealthyYoungMan=randomWhere( people , p->p.income>10000 && p.sex == MALE &&p.age<21);
還有另一個函數(shù),使用戶能夠使用指定的自定義隨機數(shù)生成器而不是默認值:
- Agent randomWhere(population, condition, java.util.Random r):與randomWhere(population, condition )類似绊率,使用指定的自定義隨機數(shù)生成器來選擇元素。
選擇處于特定狀態(tài)的智能體
要從智能體群中選擇一個智能體群的子集究履,可用使用filter()函數(shù)滤否。函數(shù)接受原始智能體群作為第一個參數(shù),然后指定過濾條件最仑。
舉個例子:有兩種智能體藐俺,客戶和卡車。要從客戶那里呼叫最近的卡車泥彤,下一行代碼需要從卡車智能體群(main.trucks)中獲得最近的卡車欲芹,可以輸入:
Truck truck = getNearestAgent( filter( main.trucks, t -> t.inState( Truck.Idle ) );
定義了局部變量t,指定篩選條件:t.inState( Truck.Idle )吟吝×飧福卡車狀態(tài)圖有空閑、繁忙兩種狀態(tài)剑逃,將從目前處于閑置狀態(tài)的卡車放入子集浙宜,并尋找最近的卡車。
從智能體群中選擇特殊的智能體
- Agent top(population, value):在給定智能體群中返回某字段最大的智能體蛹磺。例:
Person person = top( people, p -> p.age );
這里從這個群中得到了一個年齡最大的人粟瞬。如果群為空函數(shù)將返回null。
- List filter(population, condition):返回給定群的子集萤捆,獲得滿足條件智能體的新列表裙品。例:
List women = filter( people, p -> p.gender == FEMALE );
List idleTrucks = filter( trucks, t -> t.inState(Idle) );
- List findAll(population,condition):這個函數(shù)和filter(population,condition)一樣。
- Agent findFirst(population, condition):從智能體群中返回滿足條件的第一個智能體俗或。如果沒有元素滿足條件或集合為空返回null市怎。
例:
Person person = findFirst( people, p -> p.age > 20 );
在智能體群中排序智能體
當需對群做一些操作時,可能需要用一些值來排序蕴侣。在群中不需要重新排序智能體焰轻,您可以使用以下Anylogic函數(shù)來獲取有序的列表,然后在代碼中使用它昆雀。
<T> java.util.List<T> sortAscending(population, value):返回一個由給定值升序排列的智能體列表辱志。
<T> java.util.List<T> sortDescending(population, value):返回一個由給定值降序排列的智能體列表。例:
List sortedByAgeAsc = sortAscending( people, p -> p.age );
List sortedByIncomeDesc = sortDescending( people, p -> p.income );