海盗分金问题的一种解答
创始人
2025-05-29 02:09:32
  • 欢迎对非前言部分感兴趣的同学与我讨论

前言

  • 人的一生充满了意外 真的意外

  • 有时候我也受某些同学的启发,觉得自己应该去写点古典诗歌或者科幻小说去养活自己而不是苦逼得学量子力学+热统

  • 还有学科学计算

  • 我们培养一个理论物理学家有多么不容易

  • 往少了说,对于强基计划的同学而言,至少要读8年,还是在少写好几篇论文的情况下......

  • 当然

  • 不排除人家直接润 白培养八年

  • 一句话 乐

  • 物理学院也是很冷漠的 当然只是绝对意义上的 相对于其他学院嘛 好多了

  • 活着

  • 有的人活着就已经用尽了全力

  • 有的物理人活着就已经透支了下辈子的全力

  • 我是比较幸运的

  • 当然有些人本身就已经很幸运的,但还是不太自知

  • 比如某学院某课程某教师 刘星他吧 草房子顶

  • ..一身穿三万元算奢侈

  • ..车子开三十万元的算奢侈

  • ...

  • 没有什么好评价的

海盗分金问题

图片来源于网络 原链接

海盗分金问题的几种解题思路与分析

  • 首先我们要知道海盗分金问题的几个重要环节

  • 海盗为什么要同意这样一种方案

  • 多少海盗同意才能通过这一方案

  • 其次我们要知道这个问题到底有没有解

  • 解的存在性

  • 解的唯一性

  • 事实上,我们忽略掉数学上的证明,直接给出结论

  • 金币足够多时,解是存在且不唯一的

  • 金币不够多时,解不一定存在

  • 解存在的意义是:第一位分金币的人必然可以使他的方案被通过从而不被扔进海里

热力学方法

  • 付费内容

本文提出的一种解法

  • 本文的解法可能存在较大的误差

  • 事实上,本文的解法也不是正确的解法,只是一个相对靠谱的解法,这一点在之后会提到

  • 正确的解法反正我没有找到

解法针对的情况

  • 当且仅当海盗在这一轮分得的金币大于这一轮方案被否决时能获得的金币的最大值,海盗才会同意这一方案

  • 当且仅当同意人数不少于半数时方案才可通过

代码实现

import matplotlib.pyplot as plt
import numpy as np
import time#pass when greater and equal
#see more people to be killedCoins = 100
Pirate = 10
Pass = 0.5def distribute(i,Share,Pirate):count = 0for j in range(i):count += check(Share,i,j)if count/Pirate >= Pass:return Trueelse:flag = Truewhile flag:J = find_min(Share,i)#print("J=",J)Share[i][J] += 1Share[i][i] -= 1#print(Share)#time.sleep(0.5)count = 0for j in range(i):count += check(Share,i,j)#print("count=",count)if (1+count)/(1+i) >= Pass:#print("(1+count)/i=",(1+count)/i)#print("Successfully!")print(Share)flag = Falsereturn Truedef find_min(Share,i):Sum = np.zeros(i-1)for j in range(i-1):Sum[j] = max(Share[j+1:i,j])Sum[j] -= Share[i][j] #print("Sum=",Sum)A = np.where(Sum>=0)#print("A=",A)J = np.where(min(Sum[A])==Sum[A])[0][0]#print("J=",J)#print("find Sum=",Sum)return A[0][J]def check(Share,i,j):T = Share[j+1:i,j]try:M = max(T)except:M = 0#print("Share[j+1:i,j]:",T)#print("max(T)",M)#print("Share[i][j]",Share[i][j])if Share[i][j] > M:#print("i=",i,"YES!")return 1else:return 0def share(Coins,Pirate,Pass):if Pirate == 1:return Coinselif Pirate == 2:return np.array([0,Coins])elif Pirate == 3:return np.array([1,0,Coins-1])elif Pirate == 4:return np.array([0,1,0,Coins-1])elif Pirate == 5:return np.array([2,0,1,0,Coins-3])Share = np.zeros((Pirate,Pirate))Share[0][0] = CoinsShare[1][0] = 0Share[1][1] = CoinsShare[2][0] = 1Share[2][1] = 0Share[2][2] = Coins-1Share[3][0] = 0Share[3][1] = 1Share[3][2] = 0Share[3][3] = Coins-1Share[4][0] = 2Share[4][1] = 0Share[4][2] = 1Share[4][3] = 0Share[4][4] = Coins-3for i in range(5,Pirate):Share[i][i] = Coinsif distribute(i,Share,i):print("SUCCESSFULLY:(i)=",i)passelse:print("ERROR:(i)=",i)return ShareS = share(Coins,Pirate,Pass)
f = open("0.txt","w")
for i in range(len(S)):f.write(str(i)+" ")f.write(str(S[i][i])+"\n")
f.close()

[[100.   0.   0.   0.   0.   0.   0.   0.   0.   0.][  0. 100.   0.   0.   0.   0.   0.   0.   0.   0.][  1.   0.  99.   0.   0.   0.   0.   0.   0.   0.][  0.   1.   0.  99.   0.   0.   0.   0.   0.   0.][  2.   0.   1.   0.  97.   0.   0.   0.   0.   0.][  0.   2.   0.   1.   0.  97.   0.   0.   0.   0.][  0.   0.   2.   2.   1.   0.  95.   0.   0.   0.][  3.   0.   0.   0.   2.   1.   0.  94.   0.   0.][  0.   3.   3.   0.   0.   2.   1.   0.  91.   0.][  0.   0.   0.   3.   3.   0.   2.   1.   0.  91.]]

本文给出的解的分析

  • 这个解是否正确呢,很明显是错误的,因为第五轮时的分配方案不唯一,这导致第六轮以及之后的轮数,分配方案不唯一,从而忽略掉某些解

  • 考虑到我们需要得到解最大值,我们的分析是有问题的,至少是不严谨的

  • 比如我们调整第五轮的分配方案

[[100.   0.   0.   0.   0.   0.   0.   0.   0.   0.][  0. 100.   0.   0.   0.   0.   0.   0.   0.   0.][  1.   0.  99.   0.   0.   0.   0.   0.   0.   0.][  0.   1.   0.  99.   0.   0.   0.   0.   0.   0.][  0.   2.   1.   0.  97.   0.   0.   0.   0.   0.][  2.   0.   0.   1.   0.  97.   0.   0.   0.   0.][  0.   0.   2.   2.   1.   0.  95.   0.   0.   0.][  3.   0.   0.   0.   2.   1.   0.  94.   0.   0.][  0.   3.   3.   0.   0.   2.   1.   0.  91.   0.][  0.   0.   0.   3.   3.   0.   2.   1.   0.  91.]]

相关内容

热门资讯

退市苏吴:股票于12月9日进入... 新京报贝壳财经讯 退市苏吴12月16日公告,公司A股股票于2025年12月12日、2025年12月1...
云南3名村民擅入封闭矿硐窒息死... 出事硐口警示标志 今年8月22日,云南迪庆州维西县白济汛乡3名村民私自破坏长期停用探矿硐封堵设施进入...
甘露特钠迎转机,复星医药拟控股... 12月15日,复星医药宣布,控股子公司复星医药产业与绿谷(上海)医药科技有限公司(“绿谷医药”)及其...
“铁饭碗”迟早要打破? 文/洛水钟鸣(识局微信公共账号zhijuzk)到了今天,谁要再说体制内是“金饭碗”,只能说明他太不了...
卖早餐的蜜雪冰城,被嫌弃了? 近日,蜜雪冰城在大连、西安、南宁和杭州4座试点城市上线早餐产品。 图源:蜜雪冰城小程序 产品线分...