这是一个让游客选择景点的模型,选择的依据是景点的娱乐价值(value)和交通成本(dist),这两个因素影响的游客的偏好preference,即preference=value + (dist ^-0.5)。在选择景点的时候,计算出偏好越大的景点被选中的概率越大,但我目前写出的to choose-spots运行时选中的selected-spot都是0,请问该怎么修改?
breed [residences residence]
breed [scenic-spots scenic-spot]
breed [tourists tourist]
globals[
ids
]
tourists-own [
num-tourists
myhome
speed
satisfaction
state
moving-time
play-time
waiting-time
selected-spot
visited-spots
dist
preference
]
scenic-spots-own[
id
capacity-1 ;观光娱乐
capacity-2 ;餐饮住宿
count-1
count-2
vacancy-1
vacancy-2
value
]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;; Setup procedures ;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to setup
ca
setup-residences ;市中心住宅区
setup-scenic-spots ;郊区游憩点
setup-tourists ;城镇居民
if write-file? = true [prepare-file-output]
reset-ticks
end
to-report within-circle? [x y cx cy radius]
let d sqrt ((x - cx) ^ 2 + (y - cy) ^ 2)
report d <= radius
end
to setup-scenic-spots ; 创建景点
set ids []
let current-id 1 ; 设置初始id为1
while [length ids < 10] [
let new-x random-xcor
let new-y random-ycor
if not within-circle? new-x new-y 0 0 10 [
create-scenic-spots 1 [
set id current-id
set shape "tree"
set color green
set size 3
setxy new-x new-y
set label id
set capacity-1 100 + random 901
set capacity-2 100 + random 401
set count-1 0
set count-2 0
set value 1 + random 9
set vacancy-2 capacity-2
set ids lput id ids ; 将当前景点的id加入到ids列表中
]
set current-id current-id + 1 ; 增加当前id
]
]
print ids ; 打印ids列表,用于验证结果
end
to setup-residences ;创建住宅区
create-residences 5 [
ask residence 0 [setxy 0 0]
ask residence 1 [setxy 4 -6]
ask residence 2 [setxy 5 4]
ask residence 3 [setxy -3 -4]
ask residence 4 [setxy -3 5]
set shape "house"
set color red
set size 4
]
end
to-report poisson-random-number [lambda] ;设置泊松函数
let L exp(-1 * lambda)
let k 0
let p 1
while [p > L] [
set k k + 1
set p p * random-float 1
]
report k - 1
end
to setup-tourists
let lambda 5 ; 泊松分布的参数λ
let number-tourists poisson-random-number lambda ; 生成符合泊松分布的随机数
create-tourists number-tourists [
set myhome one-of residences
setxy [xcor] of myhome [ycor] of myhome
set color blue
set size 1
set shape "person"
set num-tourists number-tourists
set satisfaction []
set visited-spots []
]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;; Go procedures ;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to go
choose-spots
service
update-value
tick
end
to choose-spots
ask tourists [
let total-preference 0
set selected-spot nobody
set state "initial"
ask scenic-spots[
let dist-to-tourist distance myself
set dist dist-to-tourist
let preference (value + (dist ^ -0.5))
set total-preference total-preference + preference
]
let rand-prob random-float total-preference ;随机概率rand-prob
set selected-spot nobody
let running-total 0
ask scenic-spots [
let preference (value + (dist ^ -0.5))
if [selected-spot] of tourists = nobody and running-total + preference >= rand-prob [
set selected-spot self
print selected-spot
]
set running-total running-total + preference
]
]
end
相似问题