Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.32 KB | None | 0 0
  1. ;;;;; Units Used
  2. ;; Land - km2
  3. ;; Water - m3
  4. ;; Weight - kg
  5.  
  6. globals
  7. [
  8. population
  9. available-area-increase
  10. available-area-encourage
  11. actual-rice-consumption
  12. last-rice-production
  13. price-per-kg-dup
  14. tempPrice
  15. used-land-increase-production
  16. used-land-encourage-production
  17. current-water-available
  18. riceInStorage
  19. used-area
  20. MAX-VALUE
  21. maintain-counter
  22. increase-counter
  23. encourage-counter
  24. import-counter
  25. base-transportation-price
  26. base-importation-preparation-price
  27. maximum-storage-ever
  28. production-to-waste
  29. ]
  30.  
  31. to setup
  32. clear-all
  33.  
  34. if initial-population <= 0
  35. [
  36. show "Population must be equal or greater than zero."
  37. stop
  38. ]
  39. if initial-available-land-increase < 0
  40. [
  41. show "Available area to encourage increase of production must be equal or greater than zero."
  42. stop
  43. ]
  44. if initial-available-land-encourage < 0
  45. [
  46. show "Available area to encourage the production must be equal or greater than zero."
  47. stop
  48. ]
  49. if initial-used-land <= 0
  50. [
  51. show "Used area must be equal or greater than zero."
  52. stop
  53. ]
  54. if land-preparation-cost <= 0
  55. [
  56. show "The average cost of buying and adapting the land must be greater than zero."
  57. stop
  58. ]
  59. if water-needed-per-kg < 0
  60. [
  61. show "The water needed per kg can not be negative."
  62. stop
  63. ]
  64. if seed-price-per-kg < 0
  65. [
  66. show "The seed price can not be negative."
  67. stop
  68. ]
  69. if labour-price-per-kg < 0
  70. [
  71. show "The average labour price per kilogram can not be negative."
  72. stop
  73. ]
  74. if fertilizers-price-per-kg < 0
  75. [
  76. show "The average fertilizers price per kilogram can not be negative."
  77. stop
  78. ]
  79. if price-per-kg < 0
  80. [
  81. show "The rice price per kilogram must be equal or greater than zero."
  82. stop
  83. ]
  84. if dry-probability < 0
  85. [
  86. show "The probability of being a dry year can not be negative."
  87. stop
  88. ]
  89. if initial-rice-in-storage < 0
  90. [
  91. show "The initial rice stored can not be negative."
  92. stop
  93. ]
  94.  
  95. set price-per-kg-dup price-per-kg
  96. set population initial-population
  97. set available-area-increase initial-available-land-increase
  98. set available-area-encourage initial-available-land-encourage
  99. set used-area initial-used-land
  100. set used-land-increase-production []
  101. set used-land-encourage-production []
  102. set actual-rice-consumption precision (actual-rice-consumption * population * 1000) 2
  103. set tempPrice 0
  104. set riceInStorage 0
  105. set current-water-available 0
  106. set last-rice-production 0
  107. set MAX-VALUE 8999999999999999
  108. set riceInStorage initial-rice-in-storage
  109. set maximum-storage-ever riceInStorage
  110. set base-transportation-price 0.2
  111. set base-importation-preparation-price 0.15
  112. set production-to-waste 0.8
  113.  
  114. resetcounters
  115. reset-ticks
  116.  
  117. draw
  118. end
  119.  
  120. to draw
  121. ask patches [
  122. set pcolor 78
  123. ]
  124.  
  125. ;; Paint the population aspect
  126. ask patches with [pxcor >= -10 and pxcor <= 10 and pycor >= -3 and pycor <= 2] [
  127.  
  128. ifelse getRiceConsumption > riceInStorage
  129. [
  130. set pcolor 15 ;; red
  131. ]
  132. [
  133. let safetyRatio 1.3
  134. ifelse (getRiceConsumption * safetyRatio) > riceInStorage
  135. [
  136. set pcolor 45 ;; yellow
  137. ]
  138. [
  139. set pcolor 94 ;; blue
  140. ]
  141. ]
  142.  
  143. ]
  144. ;; Set label for population aspect
  145. ask patches with [pxcor = 2 and pycor = 2] [
  146. set plabel "Population/Demand"
  147. set plabel-color 0
  148. ]
  149.  
  150. ;; Paint the storage aspect
  151. ask patches with [pxcor >= -19 and pxcor <= -12 and pycor >= -9 and pycor <= 9] [
  152.  
  153. ifelse riceInStorage = 0
  154. [
  155. set pcolor 15 ;; red
  156. ]
  157. [
  158. ifelse riceInStorage < 0.2 * maximum-storage-ever
  159. [
  160. set pcolor 45
  161. ]
  162. [
  163. set pcolor 35
  164. ]
  165. ]
  166. ]
  167.  
  168. ;; Set label for storage aspect
  169. ask patches with [pxcor = -15 and pycor = 9] [
  170. set plabel "Storage"
  171. set plabel-color 0
  172. ]
  173.  
  174. ;; Paint the bought area aspect
  175. ask patches with [pxcor >= 12 and pxcor <= 19 and pycor >= -9 and pycor <= 9] [
  176. set pcolor 35
  177. ]
  178. ;; Set label for bought area aspect
  179. ask patches with [pxcor = 16 and pycor = 9] [
  180. set plabel "Prodution"
  181. set plabel-color 0
  182. ]
  183.  
  184.  
  185. end
  186.  
  187. to resetCounters
  188. set maintain-counter 0
  189. set increase-counter 0
  190. set encourage-counter 0
  191. set import-counter 0
  192. end
  193.  
  194. to go
  195.  
  196. if population <= 0
  197. [
  198. set population 0
  199. stop
  200. ]
  201.  
  202. update
  203.  
  204. if ticks mod 4 = 0
  205. [
  206. crop
  207. ]
  208.  
  209. if ticks mod 12 = 0
  210. [
  211. decide
  212. ]
  213.  
  214. draw ;; draw the UI components again so that the colors can change accordingly to the system state
  215.  
  216. consume
  217.  
  218. tick
  219. end
  220.  
  221.  
  222. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  223. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  224. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Update Handlers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  225.  
  226. ;; Procedure called every tick (month) that updates the variables of the system
  227. ;;
  228. to update
  229. updateRemoveLands
  230. updateUsedLand
  231.  
  232. updatePopulation
  233. updateWater
  234. updateRicePricePerKG
  235. end
  236.  
  237.  
  238. ;; Updates used land
  239. to updateUsedLand
  240. ;; Set used-area for the output information
  241. set used-area initial-used-land + sumLands used-land-increase-production + sumLands used-land-encourage-production
  242. end
  243.  
  244.  
  245. ;; Remove the lands once the loan (5 years) has finished
  246. to updateRemoveLands
  247. set used-land-increase-production removeOnLimitFirstElement used-land-increase-production
  248. set used-land-encourage-production removeOnLimitFirstElement used-land-encourage-production
  249. set available-area-increase (initial-available-land-increase - sumLands used-land-increase-production)
  250. set available-area-encourage (initial-available-land-encourage - sumLands used-land-encourage-production)
  251. end
  252.  
  253.  
  254. ;; Procedure that updates the population number
  255. to updatePopulation
  256. set population population + int (population * random-normal ((avg-population-growth / 100) / 12) ((deviation-population-growth / 100 )) / 12)
  257. end
  258.  
  259. ;; Updates the rice price based on the month
  260. to updateRicePricePerKG
  261. let amplitude (price-per-kg-dup / 3)
  262. let randomFactor 1 / 6
  263.  
  264. set price-per-kg-dup precision (price-per-kg + (amplitude * (cos((180 / pi) * ((ticks mod 12) / 2)))) + random-normal 0 (amplitude * randomFactor)) 2
  265. end
  266.  
  267. ;; Updates the water value according to the month
  268. to updateWater
  269. let water-needed used-area * rice-production-per-km2 * water-needed-per-kg
  270. let amplitude (water-needed / 2)
  271. let randomFactor 1 / 2
  272.  
  273. set current-water-available (water-needed + (amplitude * (cos((180 / pi) * ((ticks mod 12) / 2)))) + random-normal 0 (amplitude * randomFactor))
  274. end
  275.  
  276. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  277. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  278. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Action Handlers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  279.  
  280. ;; Import procedure
  281. ;; The quantity imported is stored in the respective "warehouses"
  282. to import [quantity]
  283. set riceInStorage riceInStorage + quantity
  284. if riceInStorage > maximum-storage-ever
  285. [
  286. set maximum-storage-ever riceInStorage
  287. ]
  288. set import-counter import-counter + 1
  289. end
  290.  
  291.  
  292. ;; Encourage-Production procedure
  293. to encourage-production [quantity]
  294.  
  295. let neededArea precision ((quantity / rice-production-per-km2)) 2
  296.  
  297. ifelse available-area-encourage > neededArea
  298. [
  299. set available-area-encourage available-area-encourage - neededArea
  300. ]
  301. [
  302. set neededArea available-area-encourage
  303. set available-area-encourage 0
  304. ]
  305.  
  306. set used-land-encourage-production addElementToTheList (list neededArea (ticks + 5 * 12)) used-land-encourage-production
  307. set encourage-counter encourage-counter + 1
  308.  
  309. end
  310.  
  311.  
  312. ;; Increase-Production procedure
  313. to increase-production [quantity]
  314. let neededArea precision ((quantity / rice-production-per-km2)) 2
  315.  
  316. ifelse available-area-increase > neededArea
  317. [
  318. set available-area-increase available-area-increase - neededArea
  319. ]
  320. [
  321. set neededArea available-area-increase
  322. set available-area-increase 0
  323. ]
  324.  
  325. set used-land-increase-production addElementToTheList (list neededArea (ticks + 5 * 12)) used-land-increase-production
  326. set increase-counter increase-counter + 1
  327. end
  328.  
  329.  
  330. ;; Procedure that increases the number of rice, representing a crop
  331. ;; A season is estimated with a duration of four months
  332. to crop
  333.  
  334. let currentCrop precision ((min list (current-water-available / water-needed-per-kg) (used-area * rice-production-per-km2)) * production-to-waste) 2
  335.  
  336. set last-rice-production currentCrop
  337. set riceInStorage riceInStorage + currentCrop
  338. if riceInStorage > maximum-storage-ever
  339. [
  340. set maximum-storage-ever riceInStorage
  341. ]
  342. end
  343.  
  344.  
  345. ;; Procedure that simulates the consumption of the population for a month
  346. to consume
  347. set actual-rice-consumption min list (precision (rice-consumption * population * 1000) 2) (riceInStorage)
  348.  
  349. set riceInStorage precision (riceInStorage - actual-rice-consumption) 2
  350. end
  351.  
  352. ;; Procedure that returns the rice demand
  353. to-report getRiceConsumption
  354. report precision (rice-consumption * population * 1000) 2
  355. end
  356.  
  357. ;; Procedure representing the decision maker
  358. ;; It is used a MVE approach used in Operational Research
  359. to decide
  360.  
  361. let normal-probability (1 - dry-probability)
  362.  
  363. let dry-factor 0.7
  364. let normal-factor 1
  365.  
  366. let water-state-normal current-water-available * normal-factor
  367. let water-state-dry current-water-available * dry-factor
  368.  
  369. let average-water (water-state-normal * normal-probability + water-state-dry * dry-probability)
  370. let average-production getAvgProductionNextYear average-water
  371.  
  372. let safetyRatio 1.2
  373.  
  374. let quantity ((getAvgConsumptionNextYear * safetyRatio) - riceInStorage - average-production)
  375.  
  376. if quantity < 0
  377. [
  378. set quantity 0
  379. ]
  380.  
  381. let neededArea precision (quantity / rice-production-per-km2) 2
  382.  
  383. let real-water-value (estimateWaterValue (neededArea + used-area))
  384.  
  385. let utility-import-normal (utilityImport quantity)
  386. let utility-import-dry (utilityImport quantity)
  387.  
  388. let utility-doNothing-normal (utilityDoNothing average-production)
  389. let utility-doNothing-dry (utilityDoNothing average-production)
  390.  
  391. let utility-encourageProdution-normal (utilityEncourageProdution neededArea (real-water-value * normal-factor))
  392. let utility-encourageProdution-dry (utilityEncourageProdution neededArea (real-water-value * dry-factor))
  393.  
  394. let utility-increaseProduction-normal (utilityEncourageIncreaseProdution neededArea (real-water-value * normal-factor))
  395. let utility-increaseProduction-dry (utilityEncourageIncreaseProdution neededArea (real-water-value * dry-factor))
  396.  
  397. let mveValueImport precision (dry-probability * utility-import-dry + normal-probability * utility-import-normal) 2
  398. let mveValueDoNothing precision (dry-probability * utility-doNothing-dry + normal-probability * utility-doNothing-normal) 2
  399. let mveValueEncourage precision (dry-probability * utility-encourageProdution-dry + normal-probability * utility-encourageProdution-normal) 2
  400. let mveValueIncrease precision (dry-probability * utility-increaseProduction-dry + normal-probability * utility-increaseProduction-normal) 2
  401.  
  402. let minValue min (list mveValueImport mveValueDoNothing mveValueEncourage mveValueIncrease)
  403.  
  404. ifelse minValue = mveValueImport [
  405. import quantity
  406. ]
  407. [
  408. ifelse minValue = mveValueEncourage [
  409. encourage-production quantity
  410. ]
  411. [
  412. ifelse minValue = mveValueIncrease [
  413. increase-production quantity
  414. ]
  415. [
  416. set maintain-counter maintain-counter + 1
  417. ]
  418. ]
  419. ]
  420. end
  421.  
  422. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  423. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  424. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Utility Procedures ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  425.  
  426. ;; Utility function representing the decision of doing nothing
  427. to-report utilityDoNothing [avgProduction]
  428. let safetyRatio 1.2
  429. let ratio (riceInStorage + avgProduction) / (getAvgConsumptionNextYear * safetyRatio)
  430.  
  431. let utility 0
  432.  
  433. ifelse ratio < 1
  434. [
  435. set utility MAX-VALUE
  436. ]
  437. [
  438. set utility -1
  439. ]
  440.  
  441. show word (utility) (" DoNothing")
  442. report utility
  443. end
  444.  
  445. ;; Utility function representing the decision of importing a specific rice quantity
  446. to-report utilityImport [quantity]
  447. if quantity = 0
  448. [
  449. report MAX-VALUE
  450. ]
  451.  
  452. let transportation-price base-transportation-price
  453.  
  454. ifelse quantity > 5000
  455. [
  456. set transportation-price base-transportation-price * 0.75
  457. ]
  458. [
  459. if quantity > 2000
  460. [
  461. set transportation-price base-transportation-price * 0.8
  462. ]
  463. ]
  464. let utility precision (quantity * (price-per-kg-dup + transportation-price + base-importation-preparation-price)) 2
  465. show word (utility) (" Import")
  466. report utility
  467. end
  468.  
  469. ;; Utility function representing the decision of encourage the production of the farmers that don't farm
  470. to-report utilityEncourageProdution [neededArea real-water-value]
  471. if neededArea = 0
  472. [
  473. report MAX-VALUE
  474. ]
  475.  
  476. let water-needed (neededArea + used-area) * rice-production-per-km2 * water-needed-per-kg
  477.  
  478. let utility 0
  479. let landFactor 0
  480. let waterFactor (water-needed / real-water-value)
  481. if waterFactor > 1
  482. [
  483. set waterFactor waterFactor ^ e
  484. ]
  485.  
  486. show waterFactor
  487.  
  488. ifelse available-area-encourage = 0
  489. [
  490. set utility MAX-VALUE
  491. ]
  492. [
  493. let difference available-area-increase - neededArea
  494. ifelse difference > 0
  495. [
  496. set landFactor 1
  497. ]
  498. [
  499. set landFactor (neededArea / available-area-encourage)
  500. ]
  501. let happinessFactor 0.1
  502. set utility precision ((land-preparation-cost * neededArea) + (seed-price-per-kg + labour-price-per-kg + fertilizers-price-per-kg) * (averageProductionIn5years neededArea water-needed) * happinessFactor * waterFactor * landFactor) 2
  503. ]
  504. show word (utility) (" Encourage")
  505. report utility
  506. end
  507.  
  508. ;; Utility function representing the decision of encouraging the increase of production by the farmers that already have lands ready for producing
  509. to-report utilityEncourageIncreaseProdution [neededArea real-water-value]
  510. if neededArea = 0
  511. [
  512. report MAX-VALUE
  513. ]
  514.  
  515. let water-needed (neededArea + used-area) * rice-production-per-km2 * water-needed-per-kg
  516.  
  517. let utility 0
  518. let landFactor 0
  519. let waterFactor (water-needed / real-water-value)
  520.  
  521. if waterFactor > 1
  522. [
  523. set waterFactor waterFactor ^ e
  524. ]
  525.  
  526.  
  527. ifelse available-area-increase = 0
  528. [
  529. set utility MAX-VALUE
  530. ]
  531. [
  532. let difference available-area-increase - neededArea
  533. ifelse difference > 0
  534. [
  535. set landFactor 1
  536. ]
  537. [
  538. set landFactor (neededArea / available-area-increase)
  539. ]
  540. let happinessFactor 0.15
  541. set utility precision (((seed-price-per-kg + labour-price-per-kg + fertilizers-price-per-kg) * (averageProductionIn5years neededArea water-needed)) * waterFactor * happinessFactor * landFactor) 2
  542. ]
  543. show word (utility) (" Increase")
  544. report utility
  545. end
  546.  
  547. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  548. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  549. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Bought Land Handler ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  550.  
  551. ;; Sum all the lands
  552. to-report sumLands [listToSum]
  553. let sumLand 0
  554. foreach listToSum[
  555. n -> set sumLand (sumLand + first n)
  556. ]
  557. report sumLand
  558. end
  559.  
  560. ;; Removes the first element if the tick is equal to the actual tick
  561. to-report removeOnLimitFirstElement [usedLand]
  562. if length usedLand != 0 [
  563. let element first usedLand
  564. let newList []
  565. if last element = ticks
  566. [
  567. set newList but-first usedLand
  568. report newList
  569. ]
  570. ]
  571. report usedLand
  572. end
  573.  
  574. ;; Adds a element [km2 endTick] to the list of lands of the parameter "usedLand"
  575. to-report addElementToTheList [element usedLand]
  576. let newList lput element usedLand
  577. report newList
  578. end
  579.  
  580.  
  581. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  582. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  583. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Estimate procedures ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  584.  
  585. ;; Gets the average consumption of the population for the next year (12 months)
  586. to-report getAvgConsumptionNextYear
  587. let estimatedPopulation population + int (population * random-normal ((avg-population-growth / 100)) ((deviation-population-growth / 100 )))
  588. let avgPopulation (population + estimatedPopulation) / 2
  589. let consumption precision (12 * rice-consumption * avgPopulation * 1000) 2
  590.  
  591. report consumption
  592. end
  593.  
  594.  
  595. ;; gets the average production for the next year (12 months)
  596. to-report getAvgProductionNextYear [water]
  597. report precision (3 * (min list (water / water-needed-per-kg) (used-area * rice-production-per-km2)) * production-to-waste) 2
  598. end
  599.  
  600.  
  601. ;; Estimated Average Production for 5 years of a terrain of defined dimension
  602. to-report averageProductionIn5years [dimension water]
  603. report precision (3 * 5 * (min list (water / water-needed-per-kg) (dimension * rice-production-per-km2)) * production-to-waste) 2
  604. end
  605.  
  606.  
  607. ;; Estimates the water needed for the land
  608. to-report estimateWaterValue [land-area]
  609. let water-needed land-area * rice-production-per-km2 * water-needed-per-kg
  610. let amplitude (water-needed / 2)
  611. let randomFactor 1 / 2
  612.  
  613. let value precision ((water-needed + (amplitude * (cos((180 / pi) * ((ticks mod 12) / 2))))) + random-normal 0 (amplitude * randomFactor)) 2
  614.  
  615. report value
  616. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement