作者shingai (吸收正能量)
看板Python
标题[问题] 遍历对战效率问题
时间Sat Jul 15 17:14:30 2023
问题:
昨天使用chatgpt请它协助我下面叙述:
八支队伍A,B,C,D,E,F,G,任两队比赛一场,比赛结果只有三种:胜、败、和,规则是胜
利者积分得2分,败者积分得0分,平手两队各积分得1分。
请利用pyhton帮我模拟出上述问题,遍历所有对战统计情形,
若满足队伍A总积分值至少赢过4个队伍的总积分值时,A队伍与其他队伍的胜、败、和之
数量,然後取全部比完後满足条件的最小A总积分值
---
它回复:请问您希望考虑到所有可能的对战结果吗?
这样的模拟可能需要考虑到非常庞大的组合数量,因此执行时间可能会很长。
如果您愿意等待,我们可以进行完整的模拟,但请注意执行时间可能会很久。
或者,如果您有特定的条件或限制,我们可以根据那些条件进行模拟,以加快
计算速度。请让我知道您的选择。
---
我加上一些叙述:
限制为:比完C(8,2)=28场後,满足队伍A总积分值至少赢过4个队伍的总积分值时,A队伍
的所有可能积分
---
它回复:
from itertools import combinations
teams = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] # 队伍名称
total_games = 28 # 总比赛场次
min_a_score = float('inf') # A队的最小积分值,初始设定为正无穷大
def calculate_scores(results):
scores = {team: 0 for team in teams} # 初始化队伍得分
for (team1, team2), result in results.items():
if result == 'win':
scores[team1] += 2
scores[team2] += 0
elif result == 'loss':
scores[team1] += 0
scores[team2] += 2
else: # tie
scores[team1] += 1
scores[team2] += 1
return scores
# 遍历所有可能的对战结果
results = {}
for teams_comb in combinations(teams, 2):
for result in ['win', 'loss', 'tie']:
results[teams_comb] = result
# 计算每种对战结果的积分情况
scores = calculate_scores(results)
# 检查是否满足条件
sorted_scores = sorted(scores.items(), key=lambda x: x[1], reverse=True)
a_winning_teams = [team for team, score in sorted_scores[:4]]
# A赢过的队伍
if 'A' in a_winning_teams:
if len(a_winning_teams) == 4 and scores['A'] < min_a_score:
min_a_score = scores['A']
print(f"A队在至少赢过4个队伍的情况下的最小积分值为:{min_a_score}")
但这跑出来根本不行,後来想想会不会是所有结果总共有3^28太大
(不过不是才大约14位数,没道理电脑无法处理10^99次方问题)
它code内 results[teams_comb] = result 这样写怪怪的吧,没有办法记录到
谁胜、负还是和
想问看看有没有高手能给我修程式的方向,另外这种问题是不是用套件itertool比较省
事?(套件应该也是基於一些演算法论文等做出来的,时间效率应该不差吧?!)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.27.210.24 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1689412472.A.02E.html
1F:→ lycantrope: 垃圾进垃圾出 07/15 17:57
2F:→ ddavid: 你为什麽会期待 ChatGPT 在一次 prompt 就一定给你正确程 07/16 01:11
3F:→ ddavid: 式?熟练使用的工程师都知道本来就要检查它出来的逻辑然後 07/16 01:12
4F:→ ddavid: 看要手动修正或对它提出勘误建议让它修正啊XD 07/16 01:12
5F:→ ddavid: 它的优点就是很快帮你把看起来可行的框架写出来了,剩下细 07/16 01:13
6F:→ ddavid: 节如果你都看出问题在哪了,修正很快吧 07/16 01:13
7F:→ aalexx: 有点想吐槽一下3^28 07/16 15:49
8F:嘘 aalexx: 10^99又是哪里来的神秘数字?按部就班学吧 07/16 15:57
9F:→ wuyiulin: results[teams_comb] = result 看起来就很 hashTable, 07/17 01:56
10F:→ wuyiulin: 你先学怎麽写程式吧。 07/17 01:56
11F:推 ddavid: 我猜他不懂的是为什麽那样可以记录谁胜谁负,他没注意程 07/17 09:24
12F:→ ddavid: 式里就是纪录一个对战 Pair 中第一队的胜负,而记了一队 07/17 09:24
13F:→ ddavid: ,第二队的胜负当然也就知道了这个逻辑XD 07/17 09:24