ซ้อนกันหากแบบสอบถามในบริบทของแพตช์ NetLogo

ฉันต้องการเปลี่ยนสีของแพทช์เป็นสีเขียวภายใต้เงื่อนไขเหล่านี้:

- หากมีแผ่นสีน้ำเงินสองแผ่นในคอลัมน์เดียวกันและระยะห่างน้อยกว่า 25 AND

- หากมีแพทช์สีเหลืองในคอลัมน์เดียวกันและระหว่างแพทช์สีน้ำเงินที่เลือกเหล่านี้

- จากนั้นเปลี่ยนสีของแพทช์ทั้งหมดที่ตรงตามเงื่อนไขเหล่านี้เป็นสีเขียว

ฉันกำลังดิ้นรนเพื่อสร้างมันขึ้นมาใน NetLogo ลองใช้ Nested Loop แต่หาทางไม่เจอ ขอบคุณสำหรับความช่วยเหลือใด ๆ และฉันได้เพิ่มรูปภาพตัวอย่างที่ฉันต้องการทำให้สำเร็จและทำเครื่องหมายตัวอย่างแพทช์สีน้ำเงิน

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ เพื่อแสดงสิ่งที่ฉันต้องการทำในโค้ด (ขออภัยเกี่ยวกับโค้ด):

     if any? patches with [pcolor = blue and
      (if any? patches with [pcolor = blue and pycor = ?(selected_first_blue's_pycor)
        if any? patches with [pcolor = yellow and pycor < ??(selected_first_blue's_pycor) and pycor > ?(selected_second_blue's_pycor)))
    [ask patches [set pcolor green]]

person Ecrin    schedule 28.05.2020    source แหล่งที่มา
comment
กรุณาโพสต์สิ่งที่คุณได้ลองและอธิบายว่ามันผิดพลาดอะไร   -  person underscore_d    schedule 28.05.2020
comment
เพิ่มตัวอย่างโค้ดเพื่อแสดงตรรกะของฉัน หากโครงสร้าง NetLogo ไม่เหมาะสม มีวิธีอื่นใดที่จะทำได้หรือไม่?   -  person Ecrin    schedule 28.05.2020


คำตอบ (1)


วิธีที่คุณเข้าใกล้มัน คุณต้องมีข้อความที่ค่อนข้างซับซ้อน เช่น:

let upper-blues patches with [color = blue and
   any? other patches with [color = blue and pxcor = [pxcor] of myself
        and pycor < [pycor] of myself and pycor > [pycor] of myself - 25]

ฉันเชื่อว่านี่จะง่ายกว่ามากในการมองมุมมองของแพตช์ที่คุณต้องการให้กลายเป็นสีเขียว หากฉันตีความเงื่อนไขของคุณอย่างถูกต้อง แพตช์นั้นจะต้องหาแพตช์สีเหลืองที่ใกล้ที่สุดด้านบน/ล่าง/ที่ จากนั้นตรวจสอบว่ามีแพตช์สีน้ำเงินสองแพตช์ที่คร่อมทั้งสีเหลืองและตัวมันเอง โดยมีแพตช์สีน้ำเงินอยู่ใกล้กันเพียงพอหรือไม่ ฉันถือว่าคุณปิดการห่อแล้ว

นี่คือแบบจำลองที่สมบูรณ์ที่ใส่เต่าสีแดงแทนที่จะเปลี่ยนแผ่นสีเขียว เพื่อให้คุณสามารถดูได้ว่าระบุแผ่นปะที่ถูกต้องหรือไม่

to setup
  clear-all
  ask patches [set pcolor white]
  ask n-of 100 patches [set pcolor blue]
  ask n-of 100 patches [set pcolor yellow]
end

to convert-to-green
  let turn-green nobody
  ask patches
  [ let my-column patches with [pxcor = [pxcor] of myself]
    let above-yellow min-one-of my-column with [pcolor = yellow and pycor >= [pycor] of myself][pycor]
    let above-blue ifelse-value (above-yellow != nobody) [min-one-of my-column with [pcolor = blue and pycor > [pycor] of above-yellow][pycor]][nobody]
    let below-yellow max-one-of my-column with [pcolor = yellow and pycor <= [pycor] of myself][pycor]
    let below-blue ifelse-value (below-yellow != nobody) [max-one-of my-column with [pcolor = blue and pycor < [pycor] of below-yellow][pycor]][nobody]
    if above-blue != nobody and below-blue != nobody and ([pycor] of above-blue - [pycor] of below-blue < 25)
    [ set turn-green (patch-set self turn-green)
    ]
  ]
  ask turn-green [sprout 1 [set color red]]
end

เมื่อคุณพอใจแล้ว การทำงานถูกต้องแล้ว ให้เปลี่ยน ask turn-green [sprout 1 [set color red]] เป็น ask turn-green [set pcolor green]

โค้ดนี้จะตรวจสอบแต่ละแพตช์ตามลำดับแบบสุ่ม และเพิ่มลงในชุดแพตช์ (เรียกว่าเทิร์นกรีน) หากตรงตามเงื่อนไข เมื่อทดสอบแพตช์ทั้งหมดแล้ว ชุดของแพตช์ที่เลือกจะเปลี่ยนสี วิธีนี้จะหลีกเลี่ยงปัญหาแพทช์สีเหลืองหรือสีน้ำเงินที่เปลี่ยนเป็นสีเขียวและไม่สามารถให้ตรวจสอบกับแพทช์ถัดไปได้

person JenB    schedule 28.05.2020
comment
ขอบคุณสำหรับการตอบกลับอย่างรวดเร็วและรหัส ฉันได้ลองแล้ว มีวงเล็บหายไปและเพิ่มถ้ามี? ตรวจสอบก่อนแต่ละรหัสในการถามแพตช์ อย่างไรก็ตาม คราวนี้จำเป็นต้องมีการตรวจสอบแพตช์ที่กำหนดอีกครั้งภายในการตรวจสอบที่เพิ่มเข้ามา ตัวอย่างเช่น ไม่ให้ข้อผิดพลาดใดๆ สำหรับแพตช์ด้านล่างสีเหลืองในบรรทัดนี้ ถ้ามี? แพทช์ที่มี [pcolor = blue และ pycor ‹ [pycor] ของด้านล่างสีเหลือง] นอกจากนี้ คุณแนะนำให้ฉันเรียกเก็บเงินจากเจ้าหน้าที่สองสามรายสำหรับงานนี้ด้วยการตรวจสอบแต่ละแพตช์ว่าเงื่อนไขน่าพอใจหรือไม่ หรือควรปฏิบัติตามบริบทของแพตช์หรือไม่ นอกจากนี้ยังปิดการห่อด้วย - person Ecrin; 28.05.2020
comment
set turn-green patch-set self turn-green - ข้อผิดพลาด: คาดหวังคำสั่ง สิ่งเดียวกันนี้เกิดขึ้นเกี่ยวกับเงื่อนไขที่ฉันระบุไว้ในความคิดเห็นก่อนหน้า ขอบคุณ. - person Ecrin; 28.05.2020
comment
ฉันได้ลองเวอร์ชันแก้ไขแล้ว ฉันหมายถึงว่ามันให้ข้อผิดพลาดเมื่อตัวอย่างด้านบนสีเหลืองว่างเปล่า: มีบ้างไหม? คาดว่าอินพุตจะเป็นชุดตัวแทน แต่ได้รับ NOBODY แทน ฉันหวังว่าฉันจะอธิบายสิ่งที่ฉันหมายถึงได้ - person Ecrin; 28.05.2020
comment
ฉันสามารถแก้ไขได้โดยพิจารณาแต่ละคอลัมน์ทีละคอลัมน์แล้วใช้แนวคิดด้านบนและล่างของคุณ ขอบคุณสำหรับความช่วยเหลือและเวลาของคุณ. แต่ฉันไม่พบปัญหากับโค้ดของคุณซึ่งดูเหมือนว่าจะสามารถแก้ปัญหาได้ด้วยโค้ดไม่กี่บรรทัดหรือบางทีฉันไม่สามารถเรียกใช้ได้ ยังไงก็ขอบคุณสำหรับความช่วยเหลือและแนวทาง - person Ecrin; 28.05.2020
comment
โอเค ฉันได้ทำไปแล้วเพื่อทดสอบโค้ด ดูเหมือนว่าจะทำงานได้ดี (แม้ว่าฉันจะต้องแก้ไขวงเล็บบางส่วน) - person JenB; 28.05.2020