作者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/m.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