ทำให้เกิดการหยุดชะงักสูงสุดในการสำรวจความคิดเห็นของฟาง


9

บริบท

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

  • สามารถดูผลลัพธ์ปัจจุบันก่อนลงคะแนนได้
  • มักจะเป็นไปได้ที่จะเลือกหลายตัวเลือกซึ่งจะได้รับการปฏิบัติเช่นเดียวกับถ้าคุณลงคะแนนหลายครั้งหนึ่งตัวสำหรับแต่ละตัวเลือก

สิ่งหนึ่งที่สนุกกว่าการทำโพลสำรวจความคิดเห็นกำลังยุ่งกับผลลัพธ์ การหยุดชะงักมีสองประเภทหลัก:

  • การหยุดชะงักง่ายๆซึ่งคุณลงคะแนนให้กับตัวเลือกทั้งหมด
  • การหยุดชะงักขั้นสูงที่คุณเลือกอย่างมีกลยุทธ์เพื่อลงคะแนนเพื่อเพิ่มผล

ในการท้าทายนี้คุณจะเขียนโปรแกรมสำหรับการหยุดชะงักขั้นสูง

คณิตศาสตร์

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

เอนโทรปีของรายการตัวเลข[x1, x2, ..., xn]นั้นได้มาจากสมการต่อไปนี้จากวิกิพีเดีย P(xi)ความน่าจะเป็นของซึ่งเป็นxi xi / total_num_of_votesหากตัวเลือกได้รับคะแนนโหวตเป็นศูนย์จนถึงจะไม่รวมอยู่ในการสรุป (เพื่อหลีกเลี่ยงlog(0)) เพื่อจุดประสงค์ของเราลอการิทึมสามารถอยู่ในฐานที่คุณเลือก

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

ตัวอย่างเช่นเอนโทรปีของการ[3,2,1,1]ประมาณ1.277โดยใช้ฐานอี

ขั้นตอนต่อไปคือการกำหนดรูปแบบการลงคะแนนที่นำไปสู่การเพิ่มขึ้นของเอนโทรปี ฉันสามารถลงคะแนนสำหรับตัวเลือกชุดย่อยใด ๆ ได้ตัวอย่างเช่นการลงคะแนนของฉันอาจเป็น[1,0,1,0]ได้ [4,2,2,1]ถ้าสิ่งเหล่านี้เป็นคะแนนโหวตของฉันแล้วนับสุดท้ายคือ การคำนวณเอนโทรปี1.273ใหม่ให้ลดเอนโทรปีซึ่งหมายความว่านี่เป็นความพยายามอย่างยิ่งยวดที่จะหยุดชะงัก นี่คือตัวเลือกอื่น ๆ :

don't vote
[3,2,1,1] -> 1.277

vote for everything
[4,3,2,2] -> 1.342

vote for the 1s
[3,2,2,2] -> 1.369

vote for the 2 and 1s
[3,3,2,2] -> 1.366

จากนี้เราสามารถสรุปได้ว่ารูปแบบการลงคะแนนที่ดีที่สุดคือ[0,0,1,1]เนื่องจากมันให้การเพิ่มขึ้นของเอนโทรปี

อินพุต

อินพุตเป็นรายการที่ไม่ว่างเปล่าของจำนวนเต็มที่ไม่ได้เพิ่มและไม่เป็นลบ ตัวอย่างเช่น[3,3,2,1,0,0], หรือแม้กระทั่ง[123,23,1] [4]รูปแบบที่เหมาะสมใด ๆ ที่อนุญาต

เอาท์พุต

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

เกณฑ์การชนะ

นี่คือโค้ดกอล์ฟซึ่งมีจำนวนไบต์น้อยกว่าดีกว่า

กรณีทดสอบ

[3,2,1,1] -> [0,0,1,1]  (from 1.227 to 1.369)

[3,3,2,1,0,0] -> [0,0,0,1,1,1] (from 1.311 to 1.705)

[123,23,1] -> [0,1,1] (from 0.473 to 0.510)

[4] -> [0] OR [1] (from 0 to 0)

[7,7,6,6,5] -> [0,0,1,1,1] (from 1.602 to 1.608)

[100,50,1,1] -> [0,1,1,1] (from 0.707 to 0.761)

ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าเราต้องการลดปริมาณเอนโทรปี
CalculatorFeline

1
กรณีทดสอบดูเหมือนจะสอดคล้องกับฮิวริสติก "เพิ่มค่าต่ำกว่าค่าเฉลี่ย" คุณช่วยรวมกรณีทดสอบที่ซับซ้อนได้ไหม?
xnor

@ xnor เนื่องจากเอนโทรปีนั้นถูกขยายให้ใหญ่ที่สุดด้วยการกระจายแบบสม่ำเสมอนั่นจะเป็นวิธีแก้ปัญหาที่ดี! ในความเป็นจริงมันอาจเป็นกลยุทธ์ที่ดีที่สุดเสมอ ... บางทีใครบางคนอาจนึกถึงกรณีที่ดี
Simmons

คำตอบ:


3

Mathematica, 19 44 ไบต์

... (เสียงดังบ่น)

(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&

ทดสอบ:

{Test, data, goes, here};
(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&
%%+Boole/@%

นี้ล้มเหลว{100,50,1,1}ที่จะส่งกลับผลในเอนโทรปีของ{False, False, True, True} อัตราผลตอบแทนถัวเอนโทรปีของ 0.758{False, True, True, True}0.761
IPoiler

@IPoiler ขอบคุณสำหรับการค้นหา testcase นั้น
PhiNotPi

1
(ร้องไห้และตาย)
CalculatorFeline

2
ต่อที่นี่นี่ควรจะถูกลบ
Rɪᴋᴇʀ

1
..แก้ไขแล้ว. (บ่นเสียงดังมากขึ้น)
CalculatorFeline


1

MATL , 24 ไบต์

FTinZ^tG+!ts/tYl*s4#X<Y)

สิ่งนี้ใช้ได้กับภาษา / คอมไพเลอร์เวอร์ชั่น 13.0.0ซึ่งเร็วกว่าความท้าทาย

ลองออนไลน์!

คำอธิบาย

FT        % array [0 1]
in        % take input and push its length
Z^        % Cartesian power. This gives all possible vote patterns, each on a row
t         % duplicate (will be indexed into at the end to produce the result)
G         % push input again
+         % element-wise addition with broadcast
!         % transpose
ts/       % duplicate. Divide each column by its sum
tYl       % duplicatte. Take natural logarithm
*         % element-wise multiplication
s         % sum of each column. Gives minus entropy produce by each vote pattern
4#X<      % arg max
Y)        % index into original array of voting patterns. Implicitly display

ตัวอย่าง

นี่คือตัวอย่างของการทำงาน สำหรับอินพุต[3 2 2]อาร์เรย์ของรูปแบบการลงคะแนนที่เป็นไปได้ (ผลิตโดยZ^) คือ

[ 0 0 0
  0 0 1
  0 1 0
  0 1 1
  1 0 0
  1 0 1
  1 1 0
  1 1 1 ]

โดยที่แต่ละแถวเป็นรูปแบบ สิ่งนี้ถูกเพิ่มไปยังต้นฉบับ[3 2 0]พร้อมการออกอากาศ ( G+) นั่นหมายถึง[3 2 0]การทำซ้ำ8ครั้งในแนวตั้งและเพิ่มองค์ประกอบที่จะให้

[ 3 2 2
  3 2 3
  3 3 2
  3 3 3
  4 2 2
  4 2 3
  4 3 2
  4 3 3 ]

นี่คือ transposed และแต่ละคอลัมน์จะถูกหารด้วยผลรวมแต่ละอัน ( !ts/):

[ 0.4286    0.3750    0.3750    0.3333    0.5000    0.4444    0.4444    0.4000
  0.2857    0.2500    0.3750    0.3333    0.2500    0.2222    0.3333    0.3000
  0.2857    0.3750    0.2500    0.3333    0.2500    0.3333    0.2222    0.3000 ]

การคูณด้วยลอการิทึมของมันและรวมแต่ละคอลัมน์ ( tYl*s) ให้ลบเอนโทรปี:

[ -1.0790   -1.0822   -1.0822   -1.0986   -1.0397   -1.0609   -1.0609   -1.0889 ]

เอนโทรปีลบจะลดลง ( 4#X<) โดย4รูปแบบการลงคะแนนเสียง, th ซึ่งสอดคล้อง ( Y)) เพื่อผลสุดท้าย[0 1 1]

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