Обновил код Неша

This commit is contained in:
2024-11-14 19:49:49 +03:00
parent 9d7bfab252
commit 5bad80df69

View File

@@ -343,16 +343,10 @@
\subsection{Повторяющаяся дилемма заключённого} \subsection{Повторяющаяся дилемма заключённого}
\subsubsection{Равновесие Нэша} \subsubsection{Равновесие Нэша}
Функция \texttt{nashEquilibriumStrategy}, код которой представлен в листинге~\ref{lst:nashEquilibriumStrategy}, реализует равновесие Нэша. Функция рекурсивная, она принимает на вход список действий оппонента, список уже сгенерированных действий и число -- счётчик количества ходов. Функция завершается, когда достигается максимум ходов, либо когда заканчиваются ходы оппонента. Также она использует вспомогательную функцию \texttt{indexOf}. Она принимает на вход некоторый список и элемент этого списка, а возвращает индекс первого совпавшего с указанным элемента. Она возвращает список ходов игрока в соответствии со стратегией. Функция \texttt{nashEquilibriumStrategy}, код которой представлен в листинге~\ref{lst:nashEquilibriumStrategy}, реализует равновесие Нэша. Функция рекурсивная, она принимает на вход список действий оппонента, список уже сгенерированных действий и число -- счётчик количества ходов. Функция завершается, когда достигается максимум ходов, либо когда заканчиваются ходы оппонента. Она возвращает список ходов игрока в соответствии со стратегией.
\begin{lstlisting}[caption={Код функций, резализующих стратегию в соответствии с равновесием Нэша.}, label={lst:nashEquilibriumStrategy}] \begin{lstlisting}[caption={Код функции, резализующей стратегию в соответствии с равновесием Нэша.}, label={lst:nashEquilibriumStrategy}]
indexOf :: (Eq t) => [t] -> t -> Int
indexOf [] _ = -1
indexOf (x : xs) target
| x == target = 0
| otherwise = 1 + indexOf xs target
nashEquilibriumStrategy :: [Char] -> [Char] -> Int -> [Char] nashEquilibriumStrategy :: [Char] -> [Char] -> Int -> [Char]
nashEquilibriumStrategy opponentMoves generatedMoves n = nashEquilibriumStrategy opponentMoves generatedMoves n =
if n <= 100 && length opponentMoves > 0 if n <= 100 && length opponentMoves > 0
@@ -360,13 +354,12 @@
nashEquilibriumStrategy (tail opponentMoves) (generatedMoves ++ [nextStep]) (n + 1) nashEquilibriumStrategy (tail opponentMoves) (generatedMoves ++ [nextStep]) (n + 1)
else generatedMoves else generatedMoves
where where
cases = [[' П', ' С'], [' П', ' П']] cases = [[' С', ' С'], [' С', ' П'], [' П', ' С'], [' П', ' П']]
results = [[0, 10], [5, 5]] results = [[1, 1], [10, 0], [0, 10], [5, 5]]
result = p_years = min (results !! 1 !! 1) (results !! 3 !! 1)
[ min (results !! 0 !! 1) (results !! 1 !! 1), s_years = min (results !! 0 !! 1) (results !! 2 !! 1)
max (results !! 0 !! 0) (results !! 1 !! 0) nextStep | p_years <= s_years = ' П'
] | otherwise = ' С'
nextStep = cases !! indexOf results result !! 1
\end{lstlisting} \end{lstlisting}
\subsubsection{Прощающая стратегия} \subsubsection{Прощающая стратегия}