วิธีสลับลูกบอลสี


10

ฉันมีลูก 400 ลูกโดยที่ 100 เป็นสีแดง 40 เป็นสีเหลือง 50 สีเขียวสีเขียว 60 เป็นสีฟ้า 70 สีม่วงสีม่วง 80 เป็นสีดำ (ลูกบอลที่มีสีเดียวกันเหมือนกัน)

ฉันต้องการอัลกอริทึมการสับที่มีประสิทธิภาพดังนั้นหลังจากการสับลูกอยู่ในรายการและ

ลูกบอล 3 ลูกติดต่อกันใด ๆ ที่ไม่ใช่สีเดียวกัน เช่นฉันไม่สามารถมี "สีแดง, สีแดง, สีแดง, สีเหลือง .... "

และการเรียงสับเปลี่ยนทั้งหมดมีความ "เท่าเทียมกัน" ที่น่าจะเกิดขึ้น (ดีถ้าการแลกเปลี่ยนประสิทธิภาพกับความเป็นกลางดีพอฉันไม่รังเกียจประสิทธิภาพมากกว่าความเป็นกลาง)

ฉันพยายามดัดแปลง Fisher-Yates-Knuth แต่ผลลัพธ์ไม่เหมาะ

ทำไม Fisher-Yates ไม่ดีพอ? ในฐานะที่เป็นปีที่ adopts การแปลงผกผัน Monte Carlo และการกระจายสัญญาณถือว่าลูกบอลสีเดียวกันต่างกันนั่นคือมันจะสร้างผลลัพธ์แบบเอนเอียงสำหรับความต้องการของฉัน

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

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


3
คุณพยายามปรับคำตอบจากคำถามอื่นที่คุณถามหรือไม่ คำถามทั้งสองดูเหมือนกันมาก :)
Gopi

@Gopi: ใช่และฉันหวังว่าคำตอบสำหรับคำถามใด ๆ ที่จะนำแรงบันดาลใจให้กับคนอื่น ๆ
colinfang

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

3
@ George B: เราได้อธิบายถึงสาเหตุที่กระบวนการนี้มีอคติกับคำถามที่เกี่ยวข้องอื่น ๆ ดังที่ David Eppstein อธิบายในคำตอบของเขาสำหรับคำถามนั้นมีอัลกอริทึมการเขียนโปรแกรมแบบไดนามิกที่ใช้θ(nk) เวลาที่ไหน kคือจำนวนสี บางสิ่งที่มีประสิทธิภาพยิ่งขึ้นก็ดี -θ(nk/2).
Peter Shor

2
@GeorgeB แม้ว่าแนวทางของ David Eppstein มีราคาถูกกว่าฉันก็สนใจที่จะแก้ปัญหานี้ด้วยวิธี MCMC
Peter Shor

คำตอบ:


7

สิ่งที่คุณต้องการสำหรับลูกโซ่มาร์คอฟที่จะมาบรรจบกันเพื่อการกระจายเท่ากันในทุกลำดับลูกที่เป็นไปได้คือมันสามารถย้อนกลับได้: ความน่าจะเป็นที่จะเคลื่อนที่จากลำดับ i ตามลำดับ jเหมือนกับการเคลื่อนที่ในทิศทางตรงกันข้าม ฉันจึงเสนอให้คุณใช้การเคลื่อนย้ายต่อไปนี้ (ด้วยการแจกแจงความน่าจะเป็นคงที่บางอย่างเพื่อเลือกประเภทของการเคลื่อนย้ายที่จะทำ) เพื่อดำเนินการลูกโซ่มาร์คอฟในลำดับที่เป็นไปได้ทั้งหมด ในตัวอย่างต่อไปนี้ "การวิ่ง" คือความต่อเนื่องสูงสุดของลูกบอลที่มีสีเดียวกัน ห่วงโซ่มาร์คอฟนี้อาศัยการมีสีอย่างน้อยสามสี

  1. เลือกสองวิ่งโดยการสุ่ม หากคุณสามารถแลกเปลี่ยนพวกเขาและยังคงมีลำดับทางกฎหมายให้ทำเช่นนั้น

  2. เลือกสองวิ่งที่อยู่ติดกัน หากคุณสามารถแลกเปลี่ยนพวกเขาและยังคงมีลำดับทางกฎหมายให้ทำเช่นนั้น

  3. เลือกสองวิ่งที่มีสีเดียวกัน แจกจ่ายบอลในพวกเขาแบบสุ่มในความเป็นไปได้ทางกฎหมาย (ดังนั้นหากจำนวนสูงสุดของลูกบอลในการวิ่งครั้งเดียวคือ 3 และคุณมี 5 ลูกรวมในการเลือกสองครั้งแรกจะมีโอกาสได้ลูกบอล 2 หรือ 3 เท่ากันถ้า มีลูกบอลทั้งหมด 3 ลูกลูกแรกมีโอกาสเท่ากันที่จะได้รับ 1 หรือ 2 ถ้ามีลูกทั้งหมด 4 ลูก 1, 2 และ 3 มีโอกาสเท่ากัน)

  4. เลือกสี Ciสุ่ม. พิจารณาลำดับS ของลูกบอลกับลูกบอลสีทั้งหมด Ciลบออก ตอนนี้เลือกสุ่มสองคะแนนมาS ที่สัมผัสลูกบอลสีที่แตกต่างกัน

    หากมีสองสีวิ่งCi ที่จุดทั้งสองนี้ในลำดับเดิม Sและไม่ใช่ความยาวสูงสุดย้ายลูกบอลจากหนึ่งไปยังอีกด้วยโดยแต่ละทิศทางที่เลือกด้วยความน่าจะเป็น½

    ข หากมีสองสีวิ่งCi ที่จุดทั้งสองนี้ในลำดับเดิม Sแต่หนึ่งอันคือความยาวสูงสุดและอีกอันไม่ได้ย้ายลูกบอลจากความยาวสูงสุดไปยังอันที่สั้นกว่าโดยมีความน่าจะเป็น½

    ค. หากมีเพียงหนึ่งสีวิ่งCi ที่หนึ่งในสองจุดต่อไปนี้ Sด้วยความน่าจะเป็น½ย้ายลูกบอลหนึ่งลูกจากการวิ่งไปยังจุดอื่น

    d หากไม่มีการเรียกใช้สีCi ที่จุดใดจุดหนึ่งหรือหากมีความยาวสูงสุดที่จุดทั้งสองนี้

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

คุณจะบอกได้อย่างไรว่าสิ่งนี้เกิดขึ้นเมื่อไหร่ ฉันขอแนะนำให้ดูเอนโทรปีของลำดับนี้และหยุดเมื่อมันหยุดเพิ่มขึ้น คุณคำนวณเอนโทรปีได้อย่างไร มีสองคำหลักในการคำนวณเอนโทรปีคือการกระจายความยาวของรันและลำดับของสีที่แต่ละการรันมี สำหรับการแจกแจงความยาวรันสมมติว่ามีni,k วิ่งของสี i ด้วยความยาว k. การมีส่วนร่วมของเหล่านี้เพื่อเอนโทรปีคือ

i log2 (kni,kni,1 ni,2  ni,r),
ที่ไหน rความยาวสูงสุดที่อนุญาตได้ของการวิ่ง ตอนนี้ให้เราพิจารณาการมีส่วนร่วมของลำดับสีเพื่อเอนโทรปี สมมติว่ามีmi,j สถานที่ที่มีสี i ตามด้วยสีใดสีหนึ่งทันที j (ดังนั้น mi,i=0) การมีส่วนร่วมของสิ่งนี้เพื่อเอนโทรปีคือ
i log2 (jmi,jmi,1 mi,2  mi,c),
ที่ไหน c คือจำนวนสี

(ในความสนใจของความถูกต้องแจ้งให้เราทราบว่าเรากำลังออกผลงานจำนวนมากให้กับเอนโทรปีซึ่งรวมถึงสีของลูกบอลลูกแรก แต่สิ่งเหล่านี้เป็นเงื่อนไขการสั่งซื้อที่ต่ำกว่า

UPDATE:

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


0

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

วิธีการที่สวยงามมาก แต่ไม่ชัดเจนอย่างเห็นได้ชัดเพื่อให้แน่ใจว่าสีที่ได้รับการกระจายอย่างสม่ำเสมอคือการใช้ลำดับความคลาดเคลื่อนต่ำ

สมมติว่าคุณมี N=400 ลูกบอลหมายเลขจาก 1 ถึง Nและคุณค่าของเมล็ด s.

ตรวจสอบให้แน่ใจว่าลูกบอลทั้งหมดที่มีสีเดียวกันถูกกำหนดหมายเลขอย่างต่อเนื่อง นั่นคือในกรณีของคุณปล่อยให้ 100 ลูกแรกเป็นสีแดง 40 ลูกต่อไปเป็นสีเหลืองสีเขียว 50 ลูกต่อไปเป็นต้น

จากนั้นจัดสรร kth บอลค่า xk ดังนั้น:

xk=(s+kϕ)(mod1),
ที่ไหน
  • ϕ=1+52=1.61803399...อัตราส่วนทองคำ
  • (mod1) ผู้ประกอบการที่ใช้เวลาส่วนของการโต้แย้ง
  • s คือ 'ค่า' ที่คงที่ที่คุณต้องการ

นั่นคือแต่ละคน N ลูกจะได้รับการจัดสรรมูลค่า xk ซึ่งจะอยู่ระหว่าง 0 ถึง 1 เสมอ

ตอนนี้เพียงแค่สั่งลูกบอลในลำดับจากน้อยไปมาก xk ราคา.

ตัวอย่างเช่นการใช้ค่าเมล็ดของ s=0ลูกบอลจะถูกสั่งดังนี้:

{B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K}
(where "B"= Blue, and "K" = Black).

Finally, if you wish to take a different sample, simply select a different seed value, s.

Python code for this allocating the xk is as follows:

n=400

phi = (1+pow(5,0.5))/2
x = np.zeros(n)                 
s = np.random.uniform(0,1)
for i in range(n):
    x = (s + phi*(i+1)) %1

print (s)
print (x)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.