わら世論調査に最大の混乱を引き起こす


9

環境

わら世論調査は、単純な/非公式の世論調査の作成を目的としたウェブサイトです。オプションのリストが提供され、ユーザーは選択肢を選択でき、投票が集計されます。わら投票には2つの非常に重要な機能があります。

  • 投票する前に現在の結果を見ることができます
  • 多くの場合、複数のオプションを選択できます。これは、各オプションに1つずつ、複数回投票した場合と同じように扱われます。

わら世論調査を作るよりも楽しいことの1つは、結果をいじることです。中断には主に2つのタイプがあります。

  • すべてのオプションに投票する単純な混乱
  • 効果を最大化するために投票するオプションを戦略的に選択する高度な混乱。

この課題では、高度な混乱のためのプログラムを作成します。

数学

数学的に単純に言えば、投票のエントロピーが高いほど、投票はより混乱していると言えます。 つまり、単一のオプションがすべての投票を持つ投票はまったく中断されませんが、すべてのオプションが同じ数の投票を持つ投票は最大に中断されます(これが最終的な目標です)。

数値リストのエントロピーは、[x1, x2, ..., xn]ウィキペディアの次の方程式で与えられます。P(xi)の確率xiですxi / total_num_of_votes。オプションがこれまでに投票数0の場合、そのオプションは合計に含まれません(を避けるためlog(0))。私たちの目的では、対数は任意の底に置くことができます。

ここに画像の説明を入力してください

例として、のエントロピー[3,2,1,1]1.277、底eを使用しておよそです。

次のステップは、エントロピーの最大の増加につながる投票パターンを決定することです。オプションの任意のサブセットに投票できるので、たとえば、私の投票はになる可能性があります[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 2016

@xnorは、エントロピーが均一分布で最大化されることを考えると、優れたヒューリスティックになります!実際、それは常に最適な戦略でさえあるかもしれません。
シモンズ

回答:


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そのテストケースを見つけてくれてありがとう。
PhiNotPi 2016

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

これがどのように機能するかの例です。inputの[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 ]

これは転置され、各列は各合計(!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<によって()最小化されます。4Y)[0 1 1]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.