2013-11-28 2 views
2

Я моделирую уклонение от уплаты налогов. У моей модели есть постоянные трейдеры (одна порода черепах) и клиенты (другая порода).черепахи превышают свою цель и застревают в бесконечной петле движения

Трейдеры идут к самому дешевому торговцу в их окрестностях.

Пока у моей модели менее 10 трейдеров, я не испытывал этой проблемы. Но по мере того, как я наращиваю его до более чем 20, один из трейдеров, похоже, случайно попадает в набор координат, которые заставляют каждого клиента застревать в бесконечном цикле движения, где они продвигаются вперед на 1, но превышают цель, поворачиваются вокруг и перерегулирования снова и т. д.

У меня может быть меньше проблем, если уменьшить движение вперед, чтобы сказать 0.001 вместо 1, но проблема все равно будет возникать в конечном итоге.

Есть ли быстрое решение этой проблемы? Я могу представить себе решение, в котором ifelse заставляет их прыгать непосредственно в координаты трейдеров, когда они находятся в радиусе действия 1 или что-то еще, но есть ли более простой способ?

Я попытался реализацией двигается в направлении ближайшего торговца заданного расстояния - как я предложил выше, но теперь клиент застревают в конги линий в группах в случайных местах без торговца

Вот код относительно движения:

to find_food 
ifelse (num-traders-close < 2) 
[nearest_food] 
[choose-cheapest] 
end 


to nearest_food 
let nearest-food min-one-of (traders)[distance myself] 
let cf-dist distance min-one-of traders [distance myself] 
ifelse closest-trader > 1 
[face nearest-food 
fd 1] 
[face nearest-food 
    fd cf-dist] 
end 

to choose-cheapest 
let cheapest-food min-one-of traders [price] 
let cf-dist distance min-one-of traders [distance myself] 
ifelse closest-trader > 1 
[face cheapest-food 
fd 1] 
[face cheapest-food 
    fd cf-dist ] 
    end 
+0

Пожалуйста, разместите код, который вызывает проблему. –

+0

Отредактировано сообщение, чтобы включить код. Интересно, может ли проблема быть связана с каждым трейдером, пытающимся перейти на одно и то же место? Может быть, проблема может быть решена, если все они будут двигаться одновременно? – Ullsokk

+0

Код выглядит хорошо для меня. Возможно, вам нужно какое-то детектирование столкновения, чтобы сказать, когда клиент достиг трейдера и перестанет двигаться. Маловероятно, что клиент и трейдер будут занимать точно такую ​​же точку из-за ограниченной точности компьютера. Таким образом, он всегда будет двигаться на крошечную сумму, но затем должен измениться в направлении, и поэтому в конечном итоге покачивается на месте. Это то, что происходит? –

ответ

0

в коде в вашем другом вопросе, я пытался следовать своему собственному коду, но вы можете сделать это, а также:

вместо того чтобы найти один трейдер, вы всегда проверять один из близких трейдеров в том, что Custome r, а самая дешевая еда и ближайшая еда - это собственность клиента.

Breed [Customers Customer] 
Breed [Traders trader] 
Customers-own 
[cheapest-food nearest-food traders-close] 
    traders-own [price] 

to setup 
    random-seed 234523432 
    clear-all 
    Create-traders 10 [move-to one-of patches set price random 100 set shape "house" set color white ] 
    create-Customers 50 [move-to one-of patches set shape "person" ] 


    reset-ticks 
end 


to go 
    ask customers 
    [ 
    set-customers 
    find_food 
    ] 
    tick 
end 
to set-customers 
    rt random 100 
    fd 1 
set traders-close traders with [distance myself < 5] 

set nearest-food min-one-of (traders-close )[distance myself] 
set cheapest-food min-one-of traders-close [price] 
end 
to find_food 
     ifelse (count traders-close < 2) 

    [ifelse nearest-food != nobody 
    [Move-to nearest-food ] 
    [Move-to min-one-of Traders [Distance myself]] 
    ] 
    [ ifelse cheapest-food != nobody 
    [Move-to cheapest-food] 
    [Move-to min-one-of Traders with [Distance myself < 5][price]] 
    ] 
end 
+1

Работает как очарование! Пришлось изменить «перемещение» на лицо и переместить fd 1, чтобы получить движение, как я этого хотел. Спасибо! – Ullsokk

+0

ОК, Thats Great :) – Marzy

Смежные вопросы