Saman Anketinde maksimal bozulmaya neden olur


9

bağlam

Straw Poll , basit / gayri resmi anketlerin oluşturulması için hazırlanmış bir web sitesidir. Seçeneklerin bir listesi ile, kullanıcı seçimlerini seçebilir ve oylar hesaplanır. Saman Anketinin iki çok önemli özelliği vardır:

  • Oylamadan önce mevcut sonuçları görmek mümkündür
  • Her seçenek için birden fazla oy vermiş gibi muamele gören birden fazla seçenek seçmek genellikle mümkündür.

Straw Polls yapmaktan daha eğlenceli olan tek şey, sonuçlarla uğraşmaktır. İki ana aksama türü vardır:

  • Tüm seçenekler için oy verdiğiniz basit aksama
  • Etkiyi en üst düzeye çıkarmak için hangi seçeneklere oy vereceğinizi stratejik olarak seçtiğiniz gelişmiş aksama.

Bu zorlukta, gelişmiş aksama için bir program yazacaksınız .

Matematik

Matematiksel olarak basitçe söylemek gerekirse , oyların entropisi ne kadar yüksek olursa, bir anketin o kadar kesintiye uğradığını söyleyebiliriz . Bu, tek bir seçeneğin tüm oylara sahip olduğu bir anketin hiçbir şekilde kesintiye uğramayacağı anlamına gelirken, her seçeneğin eşit sayıda oyu olduğu bir anketin maksimum düzeyde kesintiye uğradığı anlamına gelir (bu nihai hedeftir).

Bir sayı listesinin entropisi, [x1, x2, ..., xn]wikipedia'dan aşağıdaki denklemle verilir. P(xi)olasılığıdır xi, olduğu xi / total_num_of_votes. Bir seçenek şimdiye kadar sıfır oy aldıysa, sadece toplamda yer almaz (kaçınmak için log(0)). Bizim amacımız için, logaritma seçtiğiniz herhangi bir bazda olabilir.

resim açıklamasını buraya girin

Örnek olarak, entropisi [3,2,1,1]yaklaşık olarak 1.277, e tabanını kullanır .

Bir sonraki adım, hangi oy modelinin entropide en büyük artışa yol açtığını belirlemektir. Seçeneklerin herhangi bir alt kümesine oy verebilirim, örneğin benim oyum olabilir [1,0,1,0]. Eğer bunlar benim oyum olsaydı, son çeteledir [4,2,2,1]. Entropinin yeniden hesaplanması, entropide 1.273bir azalma sağlar , bu da bunun bozulmaya yönelik korkunç bir girişim olduğu anlamına gelir. İşte diğer bazı seçenekler:

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

Buradan, optimal oylama modelinin[0,0,1,1] entropide en büyük artışı verdiği için olduğu sonucuna varabiliriz .

Giriş

Girdi, boş olmayan, negatif olmayan tam sayıların bir listesidir. Örnekler arasında [3,3,2,1,0,0], [123,23,1]ve hatta vardır [4]. Herhangi bir makul biçime izin verilir.

Çıktı

Çıktı, doğruluk ve falsey değerlerinin bir listesidir (girdi ile aynı uzunluktadır); burada gerçekler, maksimum bozulmaya neden olmak istiyorsam oy kullanmam gereken seçenekleri temsil eder. Birden fazla oy pusulası aynı entropiyi veriyorsa, bunlardan biri verilebilir.

Kazanan Ölçüt

Bu kod golf, daha az bayt daha iyidir.

Test Durumları

[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)

Entropiyi azaltmak istiyorsak ne olacağını merak ediyorum .
CalculatorFeline

1
Test senaryoları sezgisel "Ortalamanın altında değerleri artırın" ile tutarlı görünmektedir. Bazı daha zorlayıcı test vakaları ekleyebilir misiniz?
xnor

@xnor, entropinin düzgün bir dağılımla maksimize edildiği göz önüne alındığında, bu iyi bir buluşsal yöntem olacaktır! Aslında, her zaman en uygun strateji bile olabilir .. Belki birisi iyi bir durum düşünebilir?
Bir Simmons

Yanıtlar:


3

Mathematica, 19 44 bayt

... (yüksek sesle şikayetçi)

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

Ölçek:

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

Bu {100,50,1,1}döndüğü yerde başarısız olur ve {False, False, True, True}entropisine neden olur 0.758. {False, True, True, True}bir entropi verir 0.761.
IPoiler

@IPoiler bu test çantasını bulduğun için teşekkürler.
PhiNotPi

1
(Cries and dies)
Hesap MakinesiFeline

2
Buraya Bu silinmelidir.
Rɪᴋᴇʀ

1
..Sabit. (daha gürültülü şikayetçi)
CalculatorFeline


1

MATL , 24 bayt

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

Bu , dilin / derleyicinin 13.0.0 sürümü ile çalışır;

Çevrimiçi deneyin!

açıklama

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

Misal

İşte nasıl çalıştığına bir örnek. Giriş için [3 2 2], (üretilen mümkün oy desen dizisi Z^) olduğu

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

burada her satır bir örüntüdür. Bu [3 2 0]yayın ( G+) ile orijinaline eklenir . Bu [3 2 0], 8zamanları dikey olarak çoğaltılır ve daha sonra vermek için element olarak eklenir

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

Bu aktarılır ve her sütun her bir toplamla bölünür ( !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 ]

Logaritması ile çarpılması ve her bir sütunun ( tYl*s) toplanması entropi eksi verir:

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

Eksi entropi, oy sonucuyla en aza indirilir ( 4#X<) ve bu da nihai sonuca4 ( Y)) karşılık gelir .[0 1 1]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.