Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在选举中投票的算法_Ruby_Algorithm - Fatal编程技术网

Ruby 在选举中投票的算法

Ruby 在选举中投票的算法,ruby,algorithm,Ruby,Algorithm,有人能帮我解决这个问题吗 我们最近举行了3个职位的选举 共有6名候选人 每个成员可以投3票,但不能对同一个人投超过一次票 共投了134张选票。402票总数 最后的计票结果是 result = {a:91, b:66, c:63, d:63, e:60, f:59} 我可以很容易地确定20张可能的独特选票 result.keys.combination(3).to_a 但很明显,考虑到可能的组合数量,暴力将是不可能的耗时,所以我希望有人能提供一种算法来实际解决这个问题 我试图找到一种合理有效的

有人能帮我解决这个问题吗

我们最近举行了3个职位的选举

共有6名候选人

每个成员可以投3票,但不能对同一个人投超过一次票

共投了134张选票。402票总数

最后的计票结果是

result = {a:91, b:66, c:63, d:63, e:60, f:59}
我可以很容易地确定20张可能的独特选票

result.keys.combination(3).to_a
但很明显,考虑到可能的组合数量,暴力将是不可能的耗时,所以我希望有人能提供一种算法来实际解决这个问题


我试图找到一种合理有效的方法来确定单个可能的计票结果,但如果你能提供多个或所有可能的计票结果,那将是令人惊讶的。

如果任何人拥有超过三分之一的可能选票,或者如果票数不是三的倍数,则没有可能的答案

如果剩下至少三张选票,并且没有人拥有超过三分之一的可能选票,则决定一张选票,让前三名候选人各投一票,并将其总数减少一票

这一过程要么停止,要么停止,要么停止,有人拥有超过三分之一的选票。我认为最糟糕的情况是投票数N+1,N,N,N,N,你去N,N-1,N-1,在这里,计数没有减少一点,但没有达到三分之一,所以我认为你可以继续这个过程来计算所有投票数


显然,存在许多不同的等效计数。在两个候选者中不重叠的任何一对动作至少有一种可能的替代解释。生成多个解决方案的一种方法是随机选择可能的选票,但必须遵守一个约束条件,即任何总数都不能超过可能剩余选票的三分之一。另一种方法是随机地重新排列答案,然后再进行排序,尽管我没有证明任何特定的一组小的重新排列会使可能的解决方案集连接起来

如果任何人拥有超过三分之一的可能投票,或者如果投票数不是三的倍数,则没有可能的答案

如果剩下至少三张选票,并且没有人拥有超过三分之一的可能选票,则决定一张选票,让前三名候选人各投一票,并将其总数减少一票

这一过程要么停止,要么停止,要么停止,有人拥有超过三分之一的选票。我认为最糟糕的情况是投票数N+1,N,N,N,N,你去N,N-1,N-1,在这里,计数没有减少一点,但没有达到三分之一,所以我认为你可以继续这个过程来计算所有投票数


显然,存在许多不同的等效计数。在两个候选者中不重叠的任何一对动作至少有一种可能的替代解释。生成多个解决方案的一种方法是随机选择可能的选票,但必须遵守一个约束条件,即任何总数都不能超过可能剩余选票的三分之一。另一种方法是随机重新排列答案,然后按照答案进行排序,尽管我还没有证明任何特定的一组小的重新排列会使一组可能的解决方案连接起来

我不敢相信我会如此执着于此,但感谢@mcdowella让我摆脱它

我们可以一直随机地洗牌和移动列表,直到得到一个每个组正好包含3个元素的列表。这无疑是一种蛮力,但就单一结果而言,它相当有效,尽管不可预测

result = {a: 91, b: 66, c: 63, d: 63, e: 60, f: 59} 

votes = result.map { |candidate, count| [candidate] * count }

def build_election(arr)
  134.times.map do |x| 
    arr.shuffle.select {|a| !a.empty? }.first(3).map do |s| 
      s.pop
    end 
  end 
end
@a = build_election(votes.map(&:dup)) until @a&.all? {|s| s.size == 3}

我真不敢相信我被困在这个问题上了,但谢谢你@mcdowella让我摆脱了它

我们可以一直随机地洗牌和移动列表,直到得到一个每个组正好包含3个元素的列表。这无疑是一种蛮力,但就单一结果而言,它相当有效,尽管不可预测

result = {a: 91, b: 66, c: 63, d: 63, e: 60, f: 59} 

votes = result.map { |candidate, count| [candidate] * count }

def build_election(arr)
  134.times.map do |x| 
    arr.shuffle.select {|a| !a.empty? }.first(3).map do |s| 
      s.pop
    end 
  end 
end
@a = build_election(votes.map(&:dup)) until @a&.all? {|s| s.size == 3}

虽然人们可以使用启发式算法为给定的结果找到可行的解决方案,但由于这是一个NP难问题,因此无法保证这一点。它可以表示为整数线性规划ILP。原则上,ILP软件将确定可行的解决方案或报告不存在可行的解决方案。我说这是原则上的,因为这个问题很可能在现有的时间内无法解决

此ILP问题具有20x6=120个非负整数值变量和6个约束

变量包括:

倪:投票次数i=1,2,…,20

这是20张选票中的一张

已知常数有两种类型:

aij:如果选票i包含对候选人j的投票,则等于1, i=1,2,…,20,j=1,…,6,否则为零

vj:候选人j将获得的票数,j=1,…,6

约束条件如下

∑iniaij=vj,j=1,…,6

ni>=0和整数值,i=1,2,…,20

第一组约束确保每个候选人都收到 指定的票数。第二组约束条件隐含在ILP中

ILP的目标函数也可以根据约束条件最大化或最小化。这里只需要一个可行解,因此目标函数可以表示为

最大0x1


或者类似的东西。

尽管可以使用启发式算法为给定的结果找到可行的解决方案,但由于这是一个NP难问题,因此无法保证这一点。它可以表示为整数线性规划ILP。原则上,ILP软件将确定可行的解决方案或报告不存在可行的解决方案。我说这是原则上的,因为这个问题很可能在现有的时间内无法解决

此ILP问题具有20x6=120个非负整数值变量和6个约束

变量包括:

倪:投票次数i=1,2,…,20

这是20张选票中的一张

已知常数有两种类型:

aij:如果选票i包含对候选人j的投票,则等于1, i=1,2,…,20,j=1,…,6,否则为零

vj:候选人j将获得的票数,j=1,…,6

约束条件如下

∑iniaij=vj,j=1,…,6

ni>=0和整数值,i=1,2,…,20

第一组约束确保每个候选人获得指定数量的选票。第二组约束条件隐含在ILP中

ILP的目标函数也可以根据约束条件最大化或最小化。这里只需要一个可行解,因此目标函数可以表示为

最大0x1


或者类似的东西。

比如,让我们想想更简单的事情。你有N小片面包和M小片

你必须用独特的配料制作N个小吃。显然,如果存在Mi>N,这是不可能的

确定单一可能计票的合理有效方法

把面包片排成一行。从第一片面包开始,把第一种配料摊开。吃第二种配料,依此类推,直到你吃到最后一片面包。回到第一片面包,继续躺在上面。继续,直到你用完所有的配料

需要“设置” 结果={a:91,b:66,c:63,d:63,e:60,f:59} 选票=134 如果result.values.any?{| v | v>选票}| | result.values.sum%选票数!=0 提出“不公平选举!” 终止 选票=ballots.times.map{Set.new} i=0 结果:每个do |候选人投票| 是的,是的
选票[i%选票]让我们想想更简单的事情,例如。你有N小片面包和M小片

你必须用独特的配料制作N个小吃。显然,如果存在Mi>N,这是不可能的

确定单一可能计票的合理有效方法

把面包片排成一行。从第一片面包开始,把第一种配料摊开。吃第二种配料,依此类推,直到你吃到最后一片面包。回到第一片面包,继续躺在上面。继续,直到你用完所有的配料

需要“设置” 结果={a:91,b:66,c:63,d:63,e:60,f:59} 选票=134 如果result.values.any?{| v | v>选票}| | result.values.sum%选票数!=0 提出“不公平选举!” 终止 选票=ballots.times.map{Set.new} i=0 结果:每个do |候选人投票| 是的,是的
选票【i%选票】谢谢你,我只是被精神困住了,这帮了大忙。当我有机会的时候,我会发布一个单一的搜索解决方案。谢谢你,我只是被精神困住了,这帮了我很大的忙。当我有机会的时候,我会发布一个单一的搜索解决方案。我尝试了不同的结果值,效果很好。然而,这项计划肯定不会奏效。例如,假设有3名候选人,A、B和C,每名候选人将获得2张选票,每张选票有2个名字。假设最初,在随机化之后,数组是[['C','C'],['A','A'],['B','B']。然后,你将选择['C'、'A']作为第一轮投票,留下['C']、['A'、['B'、'B']。接下来,在随机化之后,假设您的数组是['A']、['C']、['B']、'B']。然后选择['A','C']作为选票,留下[[]、[]、['B'、'B']]……在下一步,您会遇到一个问题,因为您希望从两个数组中的每个数组中选择一个元素,但只有一个非空数组,即['B','B']。如果在每一步中按从大到小的大小对数组进行排序,问题可能会小一些,但仍然无法保证找到解决方案。一种可能是添加一个外部循环,如果找不到答案,将重试一次,最多可尝试指定的次数。顺便说一句,如果你是其中一个候选人,我会假设它必须是e,在这种情况下,我希望你下次好运。@CarySwove
我曾经考虑过限制循环次数,甚至用一组来看看我能在这个限制内打出多少次。至于我没有参选的结果,尽管我只是一个纯粹的旁白,但我目前正在进行一场法律斗争,涉及某些未具名的国家机构,反对上述举行此类选举的协会。这听起来很有趣。让我们在另一个堆栈交换中了解它。有一天,我很想听听你们是如何找到去切斯特斯普林斯的路的……我尝试了各种各样的结果,效果很好。然而,这项计划肯定不会奏效。例如,假设有3名候选人,A、B和C,每名候选人将获得2张选票,每张选票有2个名字。假设最初,在随机化之后,数组是[['C','C'],['A','A'],['B','B']。然后,你将选择['C'、'A']作为第一轮投票,留下['C']、['A'、['B'、'B']。接下来,在随机化之后,假设您的数组是['A']、['C']、['B']、'B']。然后选择['A','C']作为选票,留下[[]、[]、['B'、'B']]……在下一步,您会遇到一个问题,因为您希望从两个数组中的每个数组中选择一个元素,但只有一个非空数组,即['B','B']。如果在每一步中按从大到小的大小对数组进行排序,问题可能会小一些,但仍然无法保证找到解决方案。一种可能是添加一个外部循环,如果找不到答案,将重试一次,最多可尝试指定的次数。顺便说一句,如果你是候选人之一,我会假设它必须是e,在这种情况下,我希望你下次好运。@CarySwoveland我曾想过限制循环,甚至用一个集合来看看我能在该限制内获得多少点击。至于我没有参选的结果,尽管我只是一个纯粹的旁白,但我目前正在进行一场法律斗争,涉及某些未具名的国家机构,反对上述举行此类选举的协会。这听起来很有趣。让我们在另一个堆栈交换中了解它。有一天我很想听听你是如何找到去切斯特泉的路的……欢迎。我以为你迟早会来这里,对这个问题有一个深思熟虑的解释。感谢您的关注,但我相信您可以想出某种解决方案,并且可能比我的旋转木马猎枪更优雅。欢迎。我以为你迟早会来这里,对这个问题有一个深思熟虑的解释。谢谢你看一看,但我相信你能想出一些解决办法,而且可能比我旋转木马上的猎枪更优雅。你能回顾一下我的答案吗?你能回顾一下我的答案吗?很好的答案!。。回答得好!