社会网络仿真软件:NetLogo_(4).NetLogo编程基础
NetLogo是一款面向代理的仿真软件,广泛用于社会网络、生态学、经济学等多个领域的仿真建模。NetLogo的核心思想是通过模拟多个独立的代理(agents)及其相互作用来研究复杂系统的行为。NetLogo提供了丰富的图形界面和编程语言支持,使得用户可以方便地创建、运行和分析仿真模型。代理的属性可以通过定义局部变量和全局变量来实现。局部变量:每个代理独有的变量。全局变量:所有代理共享的变量。;定义
NetLogo编程基础
在这一节中,我们将详细介绍NetLogo编程的基础知识,包括NetLogo的基本概念、环境设置、编程语言特性以及如何创建和运行简单的模型。通过这一节的学习,您将能够掌握NetLogo的基本编程技巧,为后续的复杂模型开发打下坚实的基础。
1. NetLogo概述
NetLogo是一款面向代理的仿真软件,广泛用于社会网络、生态学、经济学等多个领域的仿真建模。NetLogo的核心思想是通过模拟多个独立的代理(agents)及其相互作用来研究复杂系统的行为。NetLogo提供了丰富的图形界面和编程语言支持,使得用户可以方便地创建、运行和分析仿真模型。
1.1 基本概念
-
代理(Agent):NetLogo中的基本单位,可以是人、动物、植物、车辆等。每个代理可以有自己的状态和行为。
-
环境(World):代理活动的场所,通常是一个二维网格。
-
补丁(Patch):环境的基本单元,每个补丁可以有自己的颜色、状态等属性。
-
观察者(Observer):全局控制者,可以设置初始条件、运行模型、收集数据等。
-
链接(Link):连接两个代理的纽带,用于模拟社会网络中的关系。
1.2 环境设置
NetLogo提供了灵活的环境设置选项,包括世界大小、补丁大小、代理数量等。这些设置可以通过界面或代码进行配置。
1.2.1 通过界面设置
打开NetLogo,您会看到一个默认的世界窗口。可以通过以下步骤设置世界大小和补丁大小:
-
点击“设置”(Settings)按钮。
-
在弹出的对话框中设置世界宽度(World width)、世界高度(World height)、补丁大小(Patch size)等参数。
1.2.2 通过代码设置
在NetLogo中,可以通过代码设置世界和补丁的属性。以下是一个简单的例子:
; 设置世界大小为100x100,补丁大小为10
setup-world
[
set-patch-size 10
resize-world 0 99 0 99
]
1.3 NetLogo编程语言
NetLogo的编程语言是基于Logo语言的扩展,具有简洁易懂的特点。以下是一些基本的编程语言特性:
1.3.1 语法基础
NetLogo的语法基础包括命令(Commands)、报告(Reporters)和变量(Variables)。
-
命令(Command):执行某个操作,例如移动代理、改变颜色等。
-
报告(Reporter):返回某个值,例如代理的位置、状态等。
-
变量(Variable):存储数据的容器,可以在模型中动态改变。
1.3.2 基本命令和报告
-
forward:使代理向前移动。 -
right:使代理向右转。 -
left:使代理向左转。 -
set:设置变量的值。 -
random-float:生成一个0到1之间的随机浮点数。 -
random:生成一个0到给定值之间的随机整数。 -
count:返回满足某个条件的代理数量。 -
ask:向特定的代理或代理集合发送命令。
1.3.3 条件和循环
NetLogo支持条件判断和循环控制,这些控制结构可以用于复杂的逻辑操作。
-
条件判断:使用
if和ifelse。 -
循环:使用
while和repeat。
1.3.4 例子:随机移动的代理
下面是一个简单的例子,创建一个随机移动的代理:
; 创建一个代理并设置其初始位置
to setup
clear-all
create-turtles 1
[
setxy random-xcor random-ycor
set color blue
]
reset-ticks
end
; 代理随机移动
to go
ask turtles
[
right random 360
forward 1
]
tick
end
在这个例子中,setup过程清空所有代理并创建一个初始位置随机的蓝色代理。go过程使每个代理随机旋转一个角度并向前移动一个单位。
2. 代理和链接
NetLogo中的代理和链接是建模复杂系统的核心要素。通过定义代理和链接的属性和行为,可以模拟各种社会网络和生态系统的动态。
2.1 代理的属性和行为
每个代理可以有自己的属性和行为,这些属性和行为可以通过变量和命令来定义。
2.1.1 定义代理属性
代理的属性可以通过定义局部变量和全局变量来实现。
-
局部变量:每个代理独有的变量。
-
全局变量:所有代理共享的变量。
; 定义局部变量
turtles-own [ energy ]
; 定义全局变量
globals [ temperature ]
2.1.2 定义代理行为
代理的行为可以通过定义过程(procedures)来实现。过程是一组命令的集合,可以被调用执行。
; 定义代理的移动行为
to move
right random 360
forward 1
if energy < 0
[
die
]
end
; 定义代理的觅食行为
to forage
set energy energy + 1
end
2.2 链接的属性和行为
链接用于模拟代理之间的关系,例如友谊、合作、竞争等。
2.2.1 定义链接属性
链接的属性可以通过定义局部变量来实现。
; 定义链接属性
links-own [ strength ]
2.2.2 创建和删除链接
NetLogo提供了创建和删除链接的命令。
-
create-link-with:创建一个链接。 -
create-links-with:创建多个链接。 -
die:删除一个链接。
; 创建一个链接
to create-link
ask turtle 0
[
create-link-with turtle 1
[
set strength random 10
set color red
]
]
end
; 删除一个链接
to delete-link
ask link 0 1
[
die
]
end
2.3 例子:社会网络形成
下面是一个简单的例子,模拟社会网络的形成过程:
; 定义局部变量
turtles-own [ friends ]
; 定义全局变量
globals [ num-turtles ]
; 设置初始条件
to setup
clear-all
set num-turtles 50
create-turtles num-turtles
[
setxy random-xcor random-ycor
set color blue
set friends 0
]
reset-ticks
end
; 创建随机链接
to create-random-links
ask turtles
[
let potential-friend one-of other turtles
if potential-friend != nobody and [friends] of potential-friend < 5
[
create-link-with potential-friend
[
set strength random 10
set color red
]
set friends friends + 1
ask potential-friend [ set friends [friends] of myself + 1 ]
]
]
end
; 运行模型
to go
create-random-links
tick
end
在这个例子中,setup过程创建了50个初始位置随机的蓝色代理。create-random-links过程使每个代理随机选择一个潜在的朋友,并在满足条件的情况下创建链接。go过程调用create-random-links并更新模型。
3. 数据收集和分析
在NetLogo中,可以通过数据收集和分析来研究模型的动态行为。NetLogo提供了丰富的数据收集工具,包括内置的图表和文件输出功能。
3.1 数据收集
NetLogo的数据收集可以通过plot和file命令来实现。
-
plot:将数据绘制在内置的图表中。 -
file-write:将数据写入文件。
3.1.1 绘制数据
以下是一个简单的例子,绘制代理数量的变化:
; 创建图表
to setup
clear-all
create-turtles 10
[
setxy random-xcor random-ycor
set color blue
]
setup-plot
reset-ticks
end
; 设置图表
to setup-plot
set-current-plot "Turtle Population"
set-plot-x-range 0 100
set-plot-y-range 0 50
create-turtles 10
end
; 绘制数据
to go
ask turtles
[
right random 360
forward 1
]
plot count turtles
tick
end
在这个例子中,setup过程清空所有代理并创建10个初始位置随机的蓝色代理。setup-plot过程设置图表的范围。go过程使每个代理随机移动并绘制当前代理数量的变化。
3.1.2 输出数据到文件
以下是一个简单的例子,将代理数量的变化输出到文件:
; 设置文件输出
to setup
clear-all
create-turtles 10
[
setxy random-xcor random-ycor
set color blue
]
file-open "turtle_population.txt"
file-print "Tick, Turtle Count"
reset-ticks
end
; 输出数据到文件
to go
ask turtles
[
right random 360
forward 1
]
file-print (word ticks ", " count turtles)
tick
end
; 关闭文件
to finish
file-close
end
在这个例子中,setup过程清空所有代理并创建10个初始位置随机的蓝色代理。同时打开一个文件并写入表头。go过程使每个代理随机移动并将当前时间步和代理数量写入文件。finish过程关闭文件。
4. 模型调试和优化
在NetLogo中,模型的调试和优化是确保模型正确性和效率的重要步骤。NetLogo提供了多种调试工具和优化技巧。
4.1 调试工具
NetLogo的调试工具包括:
-
监视器(Monitor):实时显示变量的值。
-
图表(Plot):绘制变量的变化趋势。
-
打印机(Printer):输出变量的值到控制台。
4.1.1 使用监视器
以下是一个简单的例子,使用监视器显示代理数量的变化:
-
打开NetLogo,点击“界面”(Interface)标签。
-
点击“添加”(Add)按钮,选择“监视器”(Monitor)。
-
在监视器中输入
count turtles,并设置名称(例如“Turtle Population”)。
4.1.2 使用打印机
以下是一个简单的例子,使用打印机输出代理的位置:
; 输出代理的位置
to go
ask turtles
[
right random 360
forward 1
print (word "Turtle " who " is at " xcor ", " ycor)
]
tick
end
4.2 优化技巧
NetLogo的优化技巧包括:
-
减少不必要的计算:避免在每个时间步都进行大量计算。
-
使用局部变量:减少全局变量的使用,提高计算效率。
-
批处理操作:将多个代理的操作批处理执行。
4.2.1 减少不必要的计算
以下是一个简单的例子,减少不必要的计算:
; 减少不必要的计算
to go
if ticks mod 10 = 0
[
ask turtles
[
right random 360
forward 1
]
]
tick
end
在这个例子中,代理只在每10个时间步移动一次,减少了不必要的计算。
4.2.2 使用局部变量
以下是一个简单的例子,使用局部变量优化计算:
; 使用局部变量优化计算
to go
let num-turtles count turtles
if num-turtles > 10
[
ask turtles
[
right random 360
forward 1
]
]
tick
end
在这个例子中,通过定义局部变量num-turtles,避免了在每次条件判断中重复计算代理数量。
4.3 例子:社会网络动态分析
以下是一个更复杂的例子,分析社会网络中的动态变化:
; 定义局部变量
turtles-own [ friends energy ]
; 定义全局变量
globals [ num-turtles ]
; 设置初始条件
to setup
clear-all
set num-turtles 50
create-turtles num-turtles
[
setxy random-xcor random-ycor
set color blue
set friends 0
set energy random 100
]
setup-plot
reset-ticks
end
; 设置图表
to setup-plot
set-current-plot "Energy Distribution"
set-plot-x-range 0 100
set-plot-y-range 0 50
end
; 创建随机链接
to create-random-links
ask turtles
[
let potential-friend one-of other turtles
if potential-friend != nobody and [friends] of potential-friend < 5
[
create-link-with potential-friend
[
set strength random 10
set color red
]
set friends friends + 1
ask potential-friend [ set friends [friends] of myself + 1 ]
]
]
end
; 代理行为
to move
right random 360
forward 1
set energy energy - 1
if energy < 0
[
die
]
end
to forage
set energy energy + 1
end
; 数据收集
to collect-data
plot distribution energy
end
; 运行模型
to go
create-random-links
ask turtles [ move ]
ask turtles [ forage ]
collect-data
tick
end
在这个例子中,setup过程创建了50个初始位置随机的蓝色代理,每个代理有自己的能量。create-random-links过程使每个代理随机选择一个潜在的朋友并创建链接。move过程使代理随机移动并消耗能量,如果能量耗尽则死亡。forage过程使代理觅食并恢复能量。collect-data过程绘制能量分布图。go过程调用这些过程并更新模型。
5. 高级编程技巧
NetLogo支持多种高级编程技巧,包括面向对象编程、并行计算和自定义命令等。这些技巧可以用于创建更复杂的模型和优化性能。
5.1 面向对象编程
NetLogo支持面向对象编程,可以定义不同的代理类型并赋予不同的属性和行为。
5.1.1 定义代理类型
以下是一个简单的例子,定义两种不同的代理类型:
; 定义代理类型
breed [ predators predator ]
breed [ prey a-prey ]
; 设置初始条件
to setup
clear-all
create-predators 10
[
setxy random-xcor random-ycor
set color red
]
create-prey 50
[
setxy random-xcor random-ycor
set color green
]
reset-ticks
end
; 预言行为
to move-predator
right random 360
forward 1
let target one-of prey-here
if target != nobody
[
ask target [ die ]
]
end
; 猎物行为
to move-prey
right random 360
forward 1
end
; 运行模型
to go
ask predators [ move-predator ]
ask prey [ move-prey ]
tick
end
在这个例子中,定义了两种代理类型:predators和prey。setup过程创建了10个红色的predators和50个绿色的prey。move-predator过程使predators随机移动并捕食猎物。move-prey过程使prey随机移动。go过程调用这些过程并更新模型。
5.2 并行计算
NetLogo支持并行计算,可以通过ask-concurrent命令实现。
5.2.1 使用并行计算
以下是一个简单的例子,使用并行计算使代理移动:
; 使用并行计算
to go
ask-concurrent turtles
[
right random 360
forward 1
]
tick
end
在这个例子中,ask-concurrent命令使所有代理并行移动,提高了计算效率。
5.3 自定义命令
NetLogo支持用户定义自定义命令,这些命令可以封装复杂的逻辑操作。
5.3.1 定义自定义命令
以下是一个简单的例子,定义一个自定义命令:
; 定义自定义命令
to reproduce
if random-float 1.0 < 0.1
[
hatch 1
[
setxy xcor + 1 ycor + 1
set color [color] of myself
]
]
end
; 运行模型
to go
ask turtles [ move ]
ask turtles [ reproduce ]
tick
end
在这个例子中,reproduce命令使每个代理有10%的概率生成一个子代理。go过程调用move和reproduce命令并更新模型。
6. 模型的扩展和应用
NetLogo的模型可以进行扩展和应用,通过添加新的代理类型、链接类型和行为来模拟更复杂的系统。
6.1 扩展模型
以下是一个简单的例子,扩展社会网络模型以包括不同类型的代理和链接:
; 定义代理类型
breed [ humans human ]
breed [ robots robot ]
; 定义链接类型
links-own [ strength type ]
; 设置初始条件
to setup
clear-all
set num-humans 30
set num-robots 20
create-humans num-humans
[
setxy random-xcor random-ycor
set color blue
set energy random 100
]
create-robots num-robots
[
setxy random-xcor random-ycor
set color gray
set energy random 100
]
setup-plot
reset-ticks
end
; 设置图表
to setup-plot
set-current-plot "Energy Distribution"
set-plot-x-range 0 100
set-plot-y-range 0 50
end
; 创建随机链接
to create-random-links
ask humans
[
let potential-friend one-of other humans
if potential-friend != nobody and [friends] of potential-friend < 5
[
create-link-with potential-friend
[
set strength random 10
set type "friendship"
set color red
]
set friends friends + 1
ask potential-friend [ set friends [friends] of myself + 1 ]
]
]
ask robots
[
let potential-friend one-of other robots
if potential-friend != nobody and [friends] of potential-friend < 5
[
create-link-with potential-friend
[
set strength random 10
set type "cooperation"
set color green
]
set friends friends + 1
ask potential-friend [ set friends [friends] of myself + 1 ]
]
]
end
; 人类代理行为
to move-human
right random 360
forward 1
set energy energy - 1
if energy < 0
[
die
]
end
; 机器人代理行为
to move-robot
right random 360
forward 1
set energy energy - 1
if energy < 0
[
die
]
end
; 人类代理觅食行为
to forage-human
set energy energy + 1
end
; 机器人代理充电行为
to recharge-robot
set energy energy + 1
end
; 数据收集
to collect-data
plot distribution energy
end
; 运行模型
to go
create-random-links
ask humans [ move-human ]
ask robots [ move-robot ]
ask humans [ forage-human ]
ask robots [ recharge-robot ]
collect-data
tick
end
在这个例子中,我们扩展了社会网络模型,定义了两种代理类型:humans和robots。每种代理类型都有自己的初始条件、移动行为和能量管理行为。我们还定义了不同类型的链接:friendship和cooperation,分别用于人类之间的友谊和机器人之间的合作。go过程调用这些过程并更新模型。
6.2 应用模型
NetLogo的模型可以应用于各种实际问题,例如生态系统的模拟、疾病的传播、城市交通等。通过调整模型参数和行为,可以研究不同情景下的动态变化。
6.2.1 生态系统模拟
以下是一个简单的生态系统模拟模型,包括捕食者和猎物:
; 定义代理类型
breed [ predators predator ]
breed [ prey a-prey ]
; 设置初始条件
to setup
clear-all
set num-predators 10
set num-prey 50
create-predators num-predators
[
setxy random-xcor random-ycor
set color red
set energy random 100
]
create-prey num-prey
[
setxy random-xcor random-ycor
set color green
set energy random 100
]
setup-plot
reset-ticks
end
; 设置图表
to setup-plot
set-current-plot "Population"
set-plot-x-range 0 100
set-plot-y-range 0 100
create-turtles 10
end
; 捕食者行为
to move-predator
right random 360
forward 1
set energy energy - 1
if energy < 0
[
die
]
let target one-of prey-here
if target != nobody
[
ask target [ die ]
set energy energy + 50
]
end
; 猎物行为
to move-prey
right random 360
forward 1
set energy energy - 1
if energy < 0
[
die
]
if random-float 1.0 < 0.1
[
hatch 1
[
setxy xcor + 1 ycor + 1
set color [color] of myself
set energy [energy] of myself / 2
]
]
end
; 数据收集
to collect-data
plot count predators
plot count prey
end
; 运行模型
to go
ask predators [ move-predator ]
ask prey [ move-prey ]
collect-data
tick
end
在这个例子中,setup过程创建了10个红色的捕食者和50个绿色的猎物。move-predator过程使捕食者随机移动并捕食猎物,捕食者能量增加,猎物能量减少。move-prey过程使猎物随机移动并有10%的概率生成一个子猎物。collect-data过程绘制捕食者和猎物数量的变化。go过程调用这些过程并更新模型。
6.2.2 疾病传播模型
以下是一个简单的疾病传播模型,模拟疾病在人群中的传播:
; 定义代理类型
breed [ people person ]
; 定义代理状态
people-own [ health-status ]
; 设置初始条件
to setup
clear-all
set num-people 100
create-people num-people
[
setxy random-xcor random-ycor
set color green
set health-status "healthy"
]
; 感染一个初始代理
ask one-of people
[
set color red
set health-status "infected"
]
setup-plot
reset-ticks
end
; 设置图表
to setup-plot
set-current-plot "Population Health"
set-plot-x-range 0 100
set-plot-y-range 0 100
end
; 代理行为
to move-person
right random 360
forward 1
if health-status = "infected"
[
let neighbors other people in-radius 2
if any? neighbors
[
ask one-of neighbors
[
set color red
set health-status "infected"
]
]
if random-float 1.0 < 0.05
[
set color gray
set health-status "recovered"
]
]
end
; 数据收集
to collect-data
plot count people with [health-status = "healthy"]
plot count people with [health-status = "infected"]
plot count people with [health-status = "recovered"]
end
; 运行模型
to go
ask people [ move-person ]
collect-data
tick
end
在这个例子中,setup过程创建了100个初始位置随机的绿色代理(代表健康的人),并感染一个初始代理。move-person过程使每个代理随机移动,如果代理是感染者,则有一定概率感染附近的健康代理,也有一定概率恢复。collect-data过程绘制健康、感染和恢复的代理数量的变化。go过程调用这些过程并更新模型。
6.3 模型的应用实例
NetLogo的模型可以应用于各种实际问题,以下是一些具体的应用实例:
6.3.1 城市交通模拟
通过模拟交通流、信号灯、车辆等,可以研究城市交通的拥堵问题和优化方案。
; 定义代理类型
breed [ cars car ]
breed [ traffic-lights traffic-light ]
; 设置初始条件
to setup
clear-all
set num-cars 100
set num-traffic-lights 10
create-cars num-cars
[
setxy random-xcor random-ycor
set color yellow
set heading 0
]
create-traffic-lights num-traffic-lights
[
setxy random-xcor random-ycor
set color black
]
setup-plot
reset-ticks
end
; 设置图表
to setup-plot
set-current-plot "Car Count"
set-plot-x-range 0 100
set-plot-y-range 0 100
end
; 汽车行为
to move-car
right random 360
forward 1
if any? traffic-lights in-cone 1 360 and [color] of traffic-lights = black
[
set heading heading + 180
]
end
; 信号灯行为
to toggle-traffic-light
ask traffic-lights
[
if ticks mod 10 = 0
[
if color = black
[
set color green
]
[
set color black
]
]
]
end
; 数据收集
to collect-data
plot count cars
end
; 运行模型
to go
ask cars [ move-car ]
toggle-traffic-light
collect-data
tick
end
在这个例子中,setup过程创建了100个初始位置随机的黄色汽车和10个初始位置随机的黑色信号灯。move-car过程使汽车随机移动,如果遇到黑色信号灯,则转向。toggle-traffic-light过程每10个时间步切换信号灯的颜色。collect-data过程绘制汽车数量的变化。go过程调用这些过程并更新模型。
7. 总结
通过本节的学习,您已经掌握了NetLogo的基本编程技巧,包括环境设置、代理和链接的定义、数据收集和分析、模型调试和优化以及高级编程技巧。这些基础知识将为后续的复杂模型开发打下坚实的基础。NetLogo的强大功能和灵活性使得它成为研究复杂系统动态行为的有力工具,希望您能够在实际问题中应用这些知识,探索更多有趣的仿真模型。

更多推荐



所有评论(0)