На рисунках 1-3 приведены примеры папоротника Барнсли для разного количества точек (n). Во всех примерах в качестве начальной была выбрана точка с координатами (0, 0).
Дилемма заключённого — фундаментальная проблема в теории игр, согласно которой рациональные игроки не всегда будут сотрудничать друг с другом, даже если это в их интересах. Предполагается, что игрок (<<заключённый>>) максимизирует свой собственный выигрыш, не заботясь о выгоде других. В классическом варианте дилеммы заключённого два игрока могут выбрать одно из двух действий:
\textbf{Действие игрока 1}&\textbf{Действие игрока 2}&\textbf{Наказание игрока 1 / Наказание игрока 2}\\
&\textbf{Игрок 2: С}&\textbf{Игрок 2: П}\\
\hline
Сотрудничество & Сотрудничество & 1 год / 1 год\\
\textbf{Игрок 1: С}& 1 год / 1 год & 10 лет / 0 лет\\
\hline
Сотрудничество & Предательство&10 лет / 0 лет \\
\textbf{Игрок 1: П}& 0 лет / 10 лет&5 лет / 5 лет \\
\hline
Предательство & Сотрудничество & 0 лет / 10 лет \\
\hline
Предательство & Предательство & 5 лет / 5 лет \\
\hline
\end{tabularx}
\end{tabular}
\end{table}
В повторяющейся дилемме заключённого игра происходит периодически, и каждый игрок может «наказать» другого за несотрудничество ранее.
\subsection{Равновесие Нэша}
@@ -311,10 +309,10 @@
\subsubsection{Генерация новой точки}
Генерация новой точки происходит с помощью функции \texttt{genNextPoint} и вспомогательной функции \texttt{applyTransformation}, код которых представлен в листинге~\ref{lst:genDot}. \texttt{applyTransformation} принимает на вход исходную точку и случайное число от 0 до 1, затем выбирает и применяет к точке трансформацию в соответствии с заданными вероятностями, и возвращает новую точку. \texttt{genNextPoint} принимает на вход исходную точку, генерирует случайное число от 0 до 1, применяет функцию \texttt{applyTransformation} и возвращает новую точку.
Генерация новой точки происходит с помощью функции \texttt{genNextPoint} и вспомогательной функции \texttt{applyTransformation}, код которых представлен в листинге~\ref{lst:genDot}. \texttt{applyTransformation} принимает на вход исходную точку и случайное число от 0 до 1, затем выбирает и применяет к точке трансформацию в соответствии с заданными вероятностями, и возвращает новую точку. \texttt{genNextPoint} принимает на вход исходную точку и состояние генератора случайных чисел -- \texttt{gen}, генерирует случайное число от 0 до 1, применяет функцию \texttt{applyTransformation} и возвращает пару -- новую точку и новое состояние генератора случайных чисел.
\begin{lstlisting}[caption={Код функций для генераций новых точек в папоротнике Барнсли.}, label={lst:genDot}]
import System.Random (randomRIO)
import System.Random (StdGen, mkStdGen, randomR)
applyTransformation :: Point -> Float -> Point
applyTransformation point random
@@ -322,40 +320,33 @@
| random < 0.86 = transformation2 point
| random < 0.93 = transformation3 point
| otherwise = transformation4 point
genNextPoint :: Point -> IO Point
genNextPoint point = do
random <- randomRIO (0.0, 1.0 :: Float)
return $applyTransformation point random
\end{lstlisting}
genNextPoint :: StdGen -> Point -> (Point, StdGen)
genNextPoint gen point =
let (random, newGen) = randomR (0.0, 1.0 :: Float) gen
Функция \texttt{barnsleyFern}, код которой представлен в листинге~\ref{lst:barnsleyFern}, реализует рекурсивный алгоритм генерации списка точек, из которых состоит папоротник Барнсли. Функция принимает на вход начальную точку и число -- количество шагов рекурсии, а возвращает список точек папоротника Барнсли.
Функция \texttt{barnsleyFern}, код которой представлен в листинге~\ref{lst:barnsleyFern}, реализует рекурсивный алгоритм генерации списка точек, из которых состоит папоротник Барнсли. Функция принимает на вход текущее состояние генератора случайных чисел, начальную точку и число -- количество шагов рекурсии, а возвращает список точек папоротника Барнсли.
\begin{lstlisting}[caption={Код функции для построения папоротника Барнсли.}, label={lst:barnsleyFern}]
barnsleyFern :: Point -> Int -> IO [Point]
barnsleyFern _0= return []
barnsleyFern startPoint n = do
x' <- genNextPoint startPoint
xs <- barnsleyFern x' (n -1)
return (startPoint : xs)
\end{lstlisting}
barnsleyFern :: StdGen -> Point -> Int -> [Point]
barnsleyFern __ 0 = []
barnsleyFern gen startPoint n =
let (nextPoint, newGen) = genNextPoint gen startPoint
in startPoint : barnsleyFern newGen nextPoint (n - 1)
\end{lstlisting}
\subsection{Повторяющаяся дилемма заключённого}
\subsubsection{Равновесие Нэша}
Функция \texttt{nashEquilibriumStrategy}, код которой представлен в листинге~\ref{lst:nashEquilibriumStrategy}, реализует равновесие Нэша. Функция рекурсивная, она принимает на вход список действий оппонента, список уже сгенерированных действий и число -- счётчик количества ходов. Функция завершается, когда достигается максимум ходов, либо когда заканчиваются ходы оппонента. Также она использует вспомогательную функцию \texttt{indexOf}. Она принимает на вход некоторый список и элемент этого списка, а возвращает индекс первого совпавшего с указанным элемента. Она возвращает список ходов игрока в соответствии со стратегией.
Функция \texttt{nashEquilibriumStrategy}, код которой представлен в листинге~\ref{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
\begin{lstlisting}[caption={Код функции, резализующей стратегию в соответствии с равновесием Нэша.}, label={lst:nashEquilibriumStrategy}]
nashEquilibriumStrategy :: [Char] -> [Char] -> Int -> [Char]
nashEquilibriumStrategy opponentMoves generatedMoves n =
На Рис.~\ref{fig:output2} представлена повторяющаяся дилемма заключённого для прощающей стретегии при заданных ходах игрока: \texttt{['С', 'П', 'С', 'С', 'П', 'П', 'С', 'С', 'П', 'П']}. А на Рис.~\ref{fig:output3} для равновесия по Нэшу.
\caption{Повторяющаяся дилемма заключённого для равновесия по Нэшу.}
\label{fig:output3}
\end{figure}
\end{figure}
На Рис.~\ref{fig:output2} представлена повторяющаяся дилемма заключённого для прощающей стретегии при заданных ходах игрока: \texttt{['С', 'П', 'С', 'С', 'П', 'П', 'С', 'С', 'П', 'П']}. А на Рис.~\ref{fig:output3} для равновесия по Нэшу.
\newpage
\section*{Заключение}
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.