Skip to content

Commit c6ab31f

Browse files
committed
edit names of variables and technical docs
1 parent 878784a commit c6ab31f

File tree

2 files changed

+68
-48
lines changed

2 files changed

+68
-48
lines changed

mastermind-testing-algorithms.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,13 @@ def higher_is_better(first, second):
9696
# Vraci mnoziny potomku vzhledem k danemu kodu a velikosti techto mnozin
9797
def create_next_partition(next_guess, possible_codes, len_pegs, len_colours, all_scores):
9898
partition_table = [0]*len(all_scores)
99-
partition_of_codes = [[] for i in range(len(all_scores))]
99+
partition = [[] for i in range(len(all_scores))]
100100
for code in possible_codes:
101101
temp_score = evaluate_codes(code, next_guess, len_pegs, len_colours)
102102
index_of_temp_score = all_scores.index(temp_score)
103103
partition_table[index_of_temp_score] += 1
104-
partition_of_codes[index_of_temp_score].append(code)
105-
return partition_table, partition_of_codes
104+
partition[index_of_temp_score].append(code)
105+
return partition_table, partition
106106

107107

108108
# Nalezne nejlepsi pokus pro dany stav, valuaci a strategii, vraci tento pokus, velikosti mnozin potomku a mnoziny potomku
@@ -112,52 +112,52 @@ def find_best_guess(possible_codes, len_pegs, len_colours, all_scores, all_codes
112112
best_partition_table_value = -1
113113
else:
114114
best_partition_table_value = len(possible_codes)
115-
best_partition:list[int] = []
115+
best_partition_table:list[int] = []
116116
best_next_guess = -1
117-
best_partition_with_codes = []
117+
best_partition = []
118118
# Pokud je mnozina kandidatu jednoprvkova, vraci jediny kod
119119
if len(possible_codes) == 1:
120-
return possible_codes[0], best_partition, best_partition_with_codes
120+
return possible_codes[0], best_partition_table, best_partition
121121
# Overeni krajniho pripadu
122122
elif len(possible_codes) == 0:
123123
return [], [], []
124124
# Vyber prvniho tahu, v pripade, ze je urceny prvni tah, algoritmus jej vybere
125125
elif len(possible_codes) == len_colours**len_pegs and start_code != None:
126-
temp_partition_table, partition_of_codes = create_next_partition(start_code, possible_codes, len_pegs, len_colours, all_scores)
126+
temp_partition_table, temp_partition = create_next_partition(start_code, possible_codes, len_pegs, len_colours, all_scores)
127127
temp_partition_table_value = partition_table_function(temp_partition_table)
128128
# Zapsani do hodnot na vystupu
129-
best_partition = temp_partition_table
129+
best_partition_table = temp_partition_table
130130
best_next_guess = start_code
131-
best_partition_with_codes = partition_of_codes
131+
best_partition = temp_partition
132132
# V pripade vyberu pouze z kandidatu
133133
elif choose_from_candidates == True:
134134
for code in possible_codes:
135-
temp_partition_table, partition_of_codes = create_next_partition(code, possible_codes, len_pegs, len_colours, all_scores)
135+
temp_partition_table, temp_partition = create_next_partition(code, possible_codes, len_pegs, len_colours, all_scores)
136136
temp_partition_table_value = partition_table_function(temp_partition_table)
137137
# v kazde iteraci porovnavame valuaci s aktualni nejlepsi hodnotou, protoze vybirame kod s nejvyssi nebo nejnizsi valuaci
138138
if compare_function(temp_partition_table_value, best_partition_table_value):
139139
best_partition_table_value = temp_partition_table_value
140-
best_partition = temp_partition_table
140+
best_partition_table = temp_partition_table
141141
best_next_guess = code
142-
best_partition_with_codes = partition_of_codes
142+
best_partition = temp_partition
143143
# V obecnem pripade vybirame dalsi kod z celeho prostoru kodu
144144
else:
145145
for code in all_codes:
146-
temp_partition_table, partition_of_codes = create_next_partition(code, possible_codes, len_pegs, len_colours, all_scores)
146+
temp_partition_table, temp_partition = create_next_partition(code, possible_codes, len_pegs, len_colours, all_scores)
147147
temp_partition_table_value = partition_table_function(temp_partition_table)
148148
if compare_function(temp_partition_table_value, best_partition_table_value):
149149
best_partition_table_value = temp_partition_table_value
150-
best_partition = temp_partition_table
150+
best_partition_table = temp_partition_table
151151
best_next_guess = code
152-
best_partition_with_codes = partition_of_codes
152+
best_partition = temp_partition
153153
# V pripade, ze vice kodu nabyva nejlepsi strategie chceme prednostne vybrat kod z mnoziny kandidatu
154154
if temp_partition_table_value == best_partition_table_value and (best_next_guess not in possible_codes) and (code in possible_codes):
155155
best_partition_table_value = temp_partition_table_value
156-
best_partition = temp_partition_table
156+
best_partition_table = temp_partition_table
157157
best_next_guess = code
158-
best_partition_with_codes = partition_of_codes
158+
best_partition = temp_partition
159159

160-
return best_next_guess, best_partition, best_partition_with_codes
160+
return best_next_guess, best_partition_table, best_partition
161161

162162

163163
# Vraci vysledky algoritmu, pro kazdy stav hleda nejlepsi dalsi pokus a tim prochazi strom daneho algoritmu
@@ -224,14 +224,14 @@ def solve_one_game(len_pegs, len_colours, secret_code, partition_table_function,
224224
# Dokud neni tajny kod uhodnut
225225
while score != [len_pegs,0]:
226226
len_guesses +=1
227-
next_guess, next_partition, best_partition_with_codes = find_best_guess(possible_codes, len_pegs, len_colours, all_scores, all_codes, partition_table_function, compare_function, start_code, choose_from_candidates)
227+
next_guess, next_partition_table, best_partition = find_best_guess(possible_codes, len_pegs, len_colours, all_scores, all_codes, partition_table_function, compare_function, start_code, choose_from_candidates)
228228
b,w = evaluate_codes(secret_code, next_guess, len_pegs, len_colours)
229229
print(next_guess, b, w)
230230
score = [b,w]
231231
# pokud hra neni dohrana, je aktualizovana mnozina kandidatu po tomto kole hry
232232
if score != [len_pegs,0]:
233233
score_index = all_scores.index([b,w])
234-
possible_codes = best_partition_with_codes[score_index]
234+
possible_codes = best_partition[score_index]
235235
return len_guesses
236236

237237

@@ -252,8 +252,8 @@ def get_valuation_of_first_guess(len_pegs, len_colours, start_code, partition_ta
252252

253253
# Testuje algoritmy s pevně daným prvním pokusem
254254
# get_results_of_algorithm(len_pegs, len_colours, [1,1,2,2], find_max, lower_is_better, False)
255-
get_results_of_algorithm(len_pegs, len_colours, [1,1,2,2], find_entropy, higher_is_better, False)
256-
# get_results_of_algorithm(len_pegs, len_colours, [1,1,2,3], find_number_of_parts, higher_is_better, False)
255+
# get_results_of_algorithm(len_pegs, len_colours, [1,2,3,4], find_entropy, higher_is_better, False)
256+
get_results_of_algorithm(len_pegs, len_colours, [1,1,2,3], find_number_of_parts, higher_is_better, False)
257257

258258

259259
# Spustí algoritmus pro daný tajný kód

technical-docs.md

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,83 @@
11
# Technická dokumentace
2-
Tohle je technická dokumentace programu Mastermind - testování algoritmů
2+
Tohle je technická dokumentace programu Mastermind - testování algoritmů. Byla vytvořena jako příloha k bakalářské práci Logik - algoritmy a strategie.
33

44
## Obsah
55
Dokumentace obsahuje popisy jednotlivých funkcí a jejich propojení.
66
- [Process](#installation)
7-
- [Functions](#functions)
8-
- [main_function](#main_function)
9-
- [Global variables]
7+
- [Proměnné](#proměnné)
8+
- [Funkce](#funkce)
9+
10+
## Proměnné
11+
len_pegs - označuje počet pozic, v bakalářské práci tuto hodnotu značíme písmenem $n$.
12+
13+
len_colours - určuje počet barev (v práci jako $k$).
14+
15+
all_scores - seznam všech ohodnocení v $H_{n,k}$
16+
17+
all_codes - seznam všech kódů $H_{n,k}$
18+
19+
start_code - volba prvního pokusu, aby algoritmus nemusel procházet všechny kódy
20+
21+
possible_codes - Množina kandidátů aktuálního stavu.
22+
23+
partition - Množina potomků aktuální množiny kandidátů
24+
25+
partition_table - Velikosti množin potomků množiny kandidátů
26+
27+
secret_code - tajný kód
28+
29+
partition_table_function - proměnná uchovávající aktuálně používanou valuaci (find_max, find_entropy, find_number_of_parts)
30+
31+
compare_function - proměnná uchovávající aktuálně používanou strategii (higher_is_better, lower_is_better)
32+
33+
choose_from_candidates - proměnná, která udává, zda algoritmus vybírá kódy pro další pokusy pouze z množiny kandidátů (True), anebo z celého prostoru kódů (False)
34+
35+
partition_table_value - uchovává hodnotu valuace pro danou množinu kandidátů a kód.
36+
1037

1138
## Funkce
1239

1340
#### evaluate_codes
14-
Funkce evaluate_codes na vstupu dostane dva kódy a počet pozic a barev. Vrátí ohodnocení těchto dvou kódů. Nejprve spočítá počet černých kolíčků a pčty výskytů barev v obou kódech. Následně vypočítá počet bílých kolíčků podle definice ohodnocení.
41+
Funkce evaluate_codes na vstupu dostane dva kódy a počet pozic a barev. Vrátí ohodnocení těchto dvou kódů. Nejprve spočítá počet černých kolíčků a počty výskytů barev v obou kódech. Následně vypočítá počet bílých kolíčků podle definice ohodnocení.
1542

1643
#### generate_all_codes
17-
Funkce generate_all_codes vygeneruje seznam všech kódů podle zadaného počtu pozic a počtu barev. Prochází všechna čísla od nuly do k^n - 1 a každé číslo konvertuje do kódu, který v lexikografickém pořadí odpovídá danému číslu.
44+
Funkce generate_all_codes vygeneruje seznam všech kódů podle zadaného počtu pozic a počtu barev. Prochází všechna čísla od nuly do $k^n - 1$ a každé číslo konvertuje do kódu, který v lexikografickém pořadí odpovídá danému číslu.
1845

1946
#### generate_all_scores
2047
Tato funkce vygeneruje seznam všech možných ohodnocení pro zadaný počet pozic len_pegs. Nezohledňuje počet barev, a tedy pro dvě barvy generuje i ohodnocení, která mají lichý počet bílých kolíčků. Díky použitým valuacím a strategiím to ale na algoritmech nic nezmění.
2148

2249
#### find_max
23-
Funkce pro zadané velikosti |K_{u,r}| vrátí maximální hodnotu.
50+
Funkce pro zadané velikosti $|K_{u,r}|$ vrátí maximální hodnotu.
2451

2552
#### find_entropy
26-
Funkce pro zadané velikosti |K_{u,r}| vrátí entropii tohoto rozdělení. Entropie je před vrácením výsledku zaokrouhlena na 7 desetinných míst, protože při různém pořadí výpočtu entropie se tento součet zaokrouhluje jinak a nevracel by rovnosti pro stejné rozdělení potomků.
53+
Funkce pro zadané velikosti $|K_{u,r}|$ vrátí entropii tohoto rozdělení. Entropie je před vrácením výsledku zaokrouhlena na 7 desetinných míst, protože při různém pořadí výpočtu entropie se tento součet zaokrouhluje jinak a nevracel by rovnosti pro stejné rozdělení potomků.
2754

2855
#### find_number_of_parts
29-
Funkce pro zadané velikosti |K_{u,r}| vrátí počet neprázdných potomků.
56+
Funkce pro zadané velikosti $|K_{u,r}|$ vrátí počet neprázdných potomků.
3057

3158
#### lower_is_better
3259
Tato funkce slouží na místo strategie. Porovnává hodnoty valuací a vrací pravdivostní hodnoty, zda je první množina menší než druhá. Ve výsledku napomáhá k nalezení minimální hodnoty valuace.
3360

3461
#### higher_is_better
3562
Tato funkce slouží na místo strategie. Porovnává hodnoty valuací a vrací pravdivostní hodnoty, zda je první množina větší než druhá.Ve výsledku napomáhá k nalezení maximální hodnoty valuace.
3663

37-
------------------------------------------------------------ Find expected size - doplnit nebo vymazat ---- ------------------------------------------------------
38-
3964
#### create_next_partition
40-
Tato funkce bere jako argumenty množinu kandidátů K (possible codes) a další pokus u. Vrátí počty prvků v potomcích K_{u,r} pro všechna ohodnocení r.
65+
Tato funkce bere jako argumenty množinu kandidátů $K$ (possible codes) a další pokus $u$. Vrátí počty prvků v potomcích $K_{u,r}$ pro všechna ohodnocení $r \in S_{n,k}$.
4166

4267
#### find_best_guess
43-
Tato funkce pro aktuální stav a zvolenou valuaci a strategii vrátí odpovídající další pokus.
68+
find_best_guess(possible_codes, len_pegs, len_colours, all_scores, all_codes, partition_table_function, compare_function, start_code=None, choose_from_candidates=False)
4469

45-
#### get_results_of_algorithm
46-
Toto je hlavní funkce, která testuje algoritmy. Prochází stavový prostor a pro každý stav nalezne další pokus. Počty pokusů přičítá v případě, kdy zkoumá potomka s ohodnocením (len_pegs,0)
70+
Tato funkce pro aktuální stav a zvolenou valuaci a strategii vrátí odpovídající další pokus. Vychází z proměnné possible_codes - množiny kandidátů. Projde celý prostor kódů (případně pouze množinu kandidátů) a pro každý kód (code) nalezne potomky množiny kandidátů vzhledem k tomuto kódu (temp_partition) a jejich velikosti (temp_partition_table). O to se stará funkce create_next_partition. Dále nalezne valuaci aktuálního kódu (temp_partition_table_value) a porovná ji s aktuální nejlepší hodnotou z hlediska zvolené strategie (compare_function). Ve chvíli, kdy je aktuální hodnota valuace menší, respektive větší (podle zvolené strategie) než průběžná nejlepší hodnota valuace (best_partition_table_value), program aktualizuje nejlepší hodnoty valuace, potomků a velikostí potomků. Pokud se valuace aktuálního kódu rovná průběžné nejlepší hodnotě valuace, program zkontroluje, jestli byl průběžně nejlepší kód kandidát. Pokud nebyl a aktuální kód je kandidátem, algoritmus aktualizuje nejlepší hodnoty valuace, potomků a velikostí potomků.
4771

72+
Díky tomu, že algoritmy vybírají lexikograficky nejmenší kódy z množiny kódů s nejlepší valuací (případně průniku této množiny s množinou kandidátů), tak stačí uchovávat pouze první kód s nejlepší hodnotou valuace. Případně stačí kontrolovat, zda náleží do množiny kandidátů.
4873

49-
#### solve_one_game
50-
Tato funkce je implementací algoritmu 1 v bakalářské práci. Na vstupu vezme počet pozic a barev, tajný kód, valuaci, strategii, případný pevně stanovený první pokus a True/False hodnotu, jestli se další pokus vybírá pouze z kandidátů.
74+
Ve chvíli, kdy program projde všechny kódy, ze kterých vybírá, vrátí zvolený nejlepší kód pro tento stav (best_next_guess). Společně s ním vrací i proměnné best_partition_table a best_partition.
5175

52-
Z důvodu zrychlení algoritmu je průběžný nejlepší další pokus uchováván v průběhu prohledávání všech kódů jako dalšího pokračování. Díky tomu, že další pokus je vybírán jako lexikograficky nejmenší kód, který minimalizuje/maximalizuje valuaci, stačí si uchovávat vždy aktuální nejlepší hodnotu a fakt, jestli je aktuálně nejlepší kód kandidátem.
76+
#### get_results_of_algorithm
77+
Toto je hlavní funkce, která testuje algoritmy. Prochází stavový prostor a pro každý stav nalezne další pokus. Počty pokusů přičítá v případě, kdy zkoumá potomka vzhledem k ohodnocení $(n ,0)$.
78+
79+
#### solve_one_game
80+
Tato funkce je implementací algoritmu $1$ v bakalářské práci. Na vstupu vezme počet pozic a barev, tajný kód, valuaci, strategii, případný pevně stanovený první pokus a True/False hodnotu, jestli se další pokus vybírá pouze z kandidátů.
5381

5482
Pokud další pokus dostal maximální ohodnocení, shoduje se s tajným kódem a hra končí.
5583

@@ -63,14 +91,6 @@ Tato funkce vrátí hodnotu valuace pro nějaký první pokus a zadanou valuaci.
6391

6492

6593

66-
## globální proměnné
67-
len_pegs - tato proměnná označuje počet pozic, v práci tuto hodnotu značíme písmenem n.
68-
len_colours - tato hodnota určuje počet barev (v práci jako k).
69-
all_scores - seznam všech ohodnocení v H_{n,k}
70-
all_codes - seznam všech kódů H_{n,k}
71-
start_code - volba prvního pokusu, aby algoritmus nemusel procházet všechny kódy
72-
possible_codes - Množina kandidátů aktuálního stavu.
73-
7494

7595

7696

0 commit comments

Comments
 (0)