Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
#1

Дилемма заключённого - C++

17.08.2012, 19:16. Просмотров 1160. Ответов 9
Метки нет (Все метки)

Оригинал здесь:
http://ru.wikipedia.org/wiki/%D0%9F%...BD%D1%8B%D1%85
Собственно дилемма:
Поймали двух злодеев, которые совершили одно и то же преступление. Есть подозрения, что они действовали по сговору, а это уже более тяжёлая статья. Так что их начинают допрашивать, изолировав друг от друга. Каждому заключённому предлагают сделку: сдаёшь напарника - освобождаем тебя, а он получает 10 лет. Если ты молчишь и он молчит - получаете по полгода. Если оба друг друга сдаёте - получаете по два года. И вот они сидят и думают, как им поступить.

Повторяющаяся дилемма заключённого:
Вот здесь уже поинтереснее. Заключённые подставляют своих напарников (или не подставляют), а потом им объявляют результат, после чего круг повторяется, но уже с учётом предыдущих событий. В результате побеждает заключённый, набравший наименьшее количество лет.
Пишем программу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "PrisonerOne.h"
#include "PrisonerTwo.h"
 
#define LENGTH 1000 //Количество итераций
 
using namespace std;
 
int main()
{
    //Дилемма заключённого:
    //Поймали двух преступников, допрашивают каждого по отдельности
    //Если первый доносит на второго, а второй молчит, то второй получает 10 лет, первого освобождают
    //Если второй доносит на первого, то в точности наоборот.
    //Если оба молчат, то оба получают год. Вообще, в оригинальной формулировке - полгода. Но хочется использовать целые.
    //Наконец, если оба доносят, оба получают два года.
    //Табличку нарисуем:
    //------------------------------------------------------------------------------
    //|                      |   Заключённый Б молчит   |   Заключённый Б стучит   |
    //------------------------------------------------------------------------------
    //| Заключённый А молчит |     Оба получают год     | А - 10 лет, Б - свободен |
    //------------------------------------------------------------------------------
    //| Заключённый А стучит | Б - 10 лет, А - свободен |  Оба получают два года   |
    //------------------------------------------------------------------------------
    //Итак. Сначала оба заключённых будут случайно генерировать стучать или молчать. Для затравки. Потом будут какие-то более интеллектуальные алгоритмы.
    unsigned short int OneYears = 0; //Сколько лет получает игрок 1
    unsigned short int TwoYears = 0; //Сколько лет получает игрок 2
    int Result = 0; //Результат. Некоторые стратегии используют результат предыдущего хода. Значения: 0 - начало, 1 - оба молчат, 2 - А предал Б, 3 - Б предал А, 4 - оба сдают друг друга.
    for(int Round = 0; Round < LENGTH; Round++)
    {
        cout << endl << "Round #" << Round << endl;
        int OneBetray = PrisonerOne(Result);
        int TwoBetray = PrisonerTwo(Result);
        //Дальше проверяем, что получилось:
        if(OneBetray == 0 && TwoBetray == 0) //Если оба молчали
        {
            //Увеличим срок у обоих на год
            OneYears += 1;
            TwoYears += 1;
            Result = 1;
            cout << "Both of them keeped silence" << endl << "So that, both of them get a year of prison" << endl;
        }
        if(OneBetray == 1 && TwoBetray == 0) //Если первый предал второго, а второй молчал
        {
            //У второго увеличиваем срок на 10 лет
            TwoYears += 10;
            Result = 2;
            cout << "Prisoner two have been betrayed by his companion" << endl << "So, prisoner two get 10 years, while another prisoner enjoys his freedom" << endl;
        }
        if(OneBetray == 0 && TwoBetray == 1) //Если второй предал первого, а первый молчал
        {
            //У первого увеличиваем срок на 10 лет
            OneYears += 10;
            Result = 3;
            cout << "Prisoner two have betrayed another prisoner" << endl << "His is such an asshole! But he is free asshole! And his friend is in prison for 10 years" << endl;
        }
        if(OneBetray == 1 && TwoBetray == 1) //Если оба донесли друг на друга
        {
            //У обоих увеличиваем срок на 2 года
            OneYears += 2;
            TwoYears += 2;
            Result = 4;
            cout << "They have betrayed each other" << endl << "So, two years is enough for both of them" << endl;
        }
        cout << "Score:" << endl;
        cout << "Player One: " << OneYears << endl;
        cout << "Player Two: " << TwoYears << endl;
    }
    return 0;
}
Где PrisonerOne.h и PrisonerTwo.h - заголовочные файлы с "искусственным интеллектом".
Вики вещает, что лучшая стратегия - Око за око. То есть, первым ходом молчишь, потом отвечаешь тем же, что тебе сделали на предыдущем ходе. Она у меня реализована за PrisonerTwo (файл в аттаче).
В общем, чего я от вас, собственно, хочу. Стратегий. Пишем в PrisonerOne.h и PrisonerTwo.h функцию ИИ, которая принимает один аргумент - результат предыдущего хода, и выносит своё решение, основываясь на этом аргументе (ну или как-то ещё, монетку там подбрасывает, не суть).

Как-то длинновато получилось и не совсем в раздел для начинающих, но суть, я думаю, понятна.
Вложения
Тип файла: 7z Prisoners Dilemma.7z (736.0 Кб, 37 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2012, 19:16     Дилемма заключённого
Посмотрите здесь:

Дилемма с отображением типа флоат - C++
Подскажите пожалуйста, почему при выводе на экран с файла выборки появляются не сами числа, а что-то типо этоого:1.00221-е324 и т.д. хотя...

Удалить часть текста, заключённого в скобки - Turbo Pascal
3. Удалить в заданном тексте часть текста, заключённого в скобки (вместе со скобками). пацы оч срочно!!!

Найти площадь кольца, заключённого между двумя окружностями - Turbo Pascal
Описать функцию Rings(R1,R2), вещественного типа, ноходящую площадь кольца, заключённого между двумя окружностями с общим центром и...

В заданном тексте удалить часть текста заключённого в скобки - Turbo Pascal
помогите! в заданном тексте удалить часть текста заключённого в скобки!!

Напечатать площадь прямоугольника, заключённого между двумя парами прямых - C (СИ)
д.з.1. Написать программу, которая запрашивает у пользователя два значения координат по оси x и два значения координат по оси y, а затем...

Задание и раскрытие переменной внутри блока команд, заключённого в скобки - CMD/BAT
Батник: Set /p a=Введите echo Вы ввели %a% pause срабатывает правильно: запрашивается строка ввода, вводишь, и он выводит что...

Дилемма с анимацией - Программирование Android
Всем здравствуйте. У меня такая ситуация: скидывают мне ПСДшные заготовки и хмл файл с описанием анимации для такой заготовки....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
17.08.2012, 20:10     Дилемма заключённого #2
Я бы сделал так:
- ИИ получал результат предыдущего раунда.
-- ИИ анализирует ход.
--- Как говорит википедия - лучше отвечать тем же, что было в прошлом раунде по отношению к тебе
---- Но чтобы был шанс случайности, делаешь генерацию случайного числа, но на каждый ответ разные диапазоны. Например, ответ 1 - числа 1..3, ответ 2 - числа 4..10 (если ответ 2 должен быть вероятнее всего). Ну как-то так.

Ну или я не понял задание
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
20.08.2012, 13:18  [ТС]     Дилемма заключённого #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <windows.h>
#include <stdlib.h>
#include <time.h>
 
int PrisonerTwo(int Result) //ÏðèГ*ГЁГ¬Г*ГҐГІ ðåçóëüòГ*ГІ ïðåäûäóùåãî õîäГ* ГЄГ*ГЄ Г*ðãóìåГ*ГІ. Íåîáõîäèìî Гў Г*åêîòîðûõ Г±ГІГ°Г*ГІГҐГЈГЁГїГµ.
{
    srand((unsigned)time(NULL));
    Sleep(rand()%1000); //ÂîòêГ*ВёГ¬, ÷òîáû ðåøåГ*ГЁГї áûëè Г°Г*Г§Г*ûå. ГЂ ГІГ® ïîëó÷Г*ГҐГІГ±Гї îäГ*Г® ГЁ òîæå âðåìÿ Г§Г*ГЇГіГ±ГЄГ*, ñîîòâåòñòâåГ*Г*Г®, îäГ*Г® ГЁ ГІГ® æå ðåøåГ*ГЁГҐ.
    int Rnd = rand()%10; //ГѓГҐГ*ГҐГ°Г*öèÿ ñëó÷Г*Г©Г*îñòè.
    if(Result == 1)
    {
        if(Rnd <= 3)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    if(Result == 2)
    {
        if(Rnd <= 3)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    if(Result == 3)
    {
        if(Rnd <= 3)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    if(Result == 4)
    {
        if(Rnd <= 3)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    if(Result == 0)
    {
        return 0;
    }
}
Так?
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2012, 13:35     Дилемма заключённого #4
Thirteen, в моём понимании задача решается вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <ctime>
#include <iostream>
using namespace std;
 
int main()
{
    srand(time(0));
    //×èñëî ãîäîâ îòñèäêè Г§Г*êëþ÷¸Г*Г*ûõ
    double nYears1 = 0;
    double nYears2 = 0;
    int nRounds = 0;//×èñëî "Г°Г*ГіГ*äîâ" (êîë-ГўГ® ïðèâîäîâ ГЎГ*Г*äèòîâ)
    cout<<"Enter num of rounds : ";cin>>nRounds;
    for(int iRound = 0; iRound < nRounds; iRound++)
    {
        //Г‚Г*ðèГ*Г*ГІ èñõîäГ* äîïðîñГ*
        switch(rand()%2)
        {
        case 0://Ìîë÷Г*Г*ГЁГҐ îáîèõ
            nYears1 += 0.5;
            nYears2 += 0.5;
            break;
        case 1://1 Г±Г¤Г*Г« âòîðîãî (Г±ГІГіГЄГ*Г· ÷¸ðòîâ)
               //Г* âòîðîé ìîë÷Г*Г« (ìóæèê ìëÿ!)=)
            //ГЊГ» Г*ГҐ Г§Г*Г*ГҐГ¬ ГЄГІГ® êîãî Г±Г¤Г*Г«
            //ГЁ ïîýòîìó ГЈГҐГ*åðèðóåì ñëó÷Г*Г©Г*îñòü
            //Гў Г±ГІГіГЄГ*Г·ГҐГ±ГІГўГҐ
            if(rand()%1)//Г‡Г*Г±ГІГіГ·Г*Г« 1-Г©
                nYears2 += 10;
            else        //Г‡Г*Г±ГІГіГ·Г*Г« 2-Г©
                nYears1 += 10;
            break;
        case 3://ГЋГЎГ* Г±Г¤Г*ëè äðóã äðóãГ*
            nYears1 += 2;
            nYears2 += 2;
            break;
        }
        cout<<"Round   : "<<iRound + 1<<":\n";
        cout<<"nYears1 : "<<nYears1<<endl;
        cout<<"nYears2 : "<<nYears2<<endl;
    }
    return 0;
}
http://liveworkspace.org/code/c5ef3a...58735c9a26834c
Миниатюры
Дилемма заключённого  
-=ЮрА=-
20.08.2012, 13:36
  #5

Не по теме:

Из отработки можно заключить что среди 2-х заключённых всегда 1-н стукач другой мотает срок

Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
20.08.2012, 13:39     Дилемма заключённого #6
Thirteen, Что то типа того Можно такой принцип раскрутить по более, чтобы более зависимость ощущалась.

-=ЮрА=-, Если я правильно понимаю, девушка спрашивает, как придумать интересный ИИ, а не как реализовать саму дилемму (это она поняла).
-=ЮрА=-
20.08.2012, 14:11
  #7

Не по теме:

Цитата Сообщение от Neon-z Посмотреть сообщение
как придумать интересный ИИ,
- можно пояснить что такое ИИ (искусственный интеллект или Игрок Игрок) ?

PS:
Цитата Сообщение от Neon-z Посмотреть сообщение
Например, ответ 1 - числа 1..3, ответ 2 - числа 4..10 (если ответ 2 должен быть вероятнее всего).
- это нечёткая логика и к данной задаче она непреминима, особенно в той интрепритации диапазонов в которой указываешь
ответ 1 диапазон 1-3
ответ 2 диапазон 4-10
Уже неравенство диапазонов - а стало быть различная вероятность исходов...

Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
20.08.2012, 14:15     Дилемма заключённого #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Уже неравенство диапазон а стало быть различная вероятность исходов...
Я пример показал Я не сказал применять такое соотношение) Это просто в голову пришло такое соотношение
А насчет логики спорить не буду я в программировании чуть более года и мне с Вами нет смысла спорить
Но я считаю, что как вариант - можно пробовать

P.S> а ИИ - в моем понимании - интеллект.
-=ЮрА=-
20.08.2012, 14:22
  #9

Не по теме:

Цитата Сообщение от Neon-z Посмотреть сообщение
Но я считаю, что как вариант - можно пробовать
- попробовать можно но оправданность нечёткой логики для решения строго детерминированной задачи смущает неоправданной сложностью реализации отнесенной к полученному результату. Тут практически простое подбрасывание монеты (орёл или решка, только исходов 3), а один из исходов тройки определяет ещё два связанных события("сдал первый второй нет", "сдал второй первый нет")...
Если уж есть желание втиснуть нечёткую логику то легче уж такое в Matlab реализовывать, на плюсах код выйдет неоправданно громоздким)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2012, 14:43     Дилемма заключённого
Еще ссылки по теме:

Непонятная дилемма - PHP БД
Написал небольшой сайтик на Ubuntu12.04 сервер xamp стоял надо было перенести сайтик на другую машину с windows 7 xamp поставил с сайта...

Дилемма с ядрами - Планшеты, ebook
Доброго всем времени суток. Суть такова: обладаю планшетом DNS Airtab m974w, на чипе allwinner A10, андроид 4.0.4 с версией ядра 3.0.8+....

C# сетевая дилемма - C#
Доброго времени суток! Уважаемы форумчане, имеющие опыт разработки Клиент-Серверных приложений. Интересуюсь, где лучше использовать...

Есть небольшая дилемма - MS Access
Добрый вечер! У меня такая ситуация. Есть набор таблиц,а также набор запросов,в которых вычисляется для каждой таблицы своя формула. Создал...

Небольшая дилемма с Fedora - RedHat, Fedora Linux
Здравствуйте! Установил себе Fedora 23 и сразу несколько вопросов: 1. Не работает клавиша Ctrl в комбинациях. 2. За курсором мыши...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
22.08.2012, 14:43  [ТС]     Дилемма заключённого #10
Давно меня не было что-то...
Neon-z, Правильно. Мне нужен интересный ИИ. Здесь задача не на реализацию. Это я умею. Вот сочинить алгоритм... Здесь нужно творческое мышление.

В общем с Вашим вариантом такие результаты:
ЗК1:ЗК2Око за окоСлучайныйОЗО(со случайностью)
Око за око1000:10001497:14972325:2335
Случайный1531:15411682:16523058:3008
ОЗО (со случайностью)2483:24933310:31801516:1496

Википедия пока права. Око за око набирает наименьшее кол-во лет.
Можно ещё попробовать ОЗО с прощением воткнуть.
Вообще, действительно, если сделать агрессивную стратегию, которая всегда предаёт, то её сделает более добрая стратегия, потому что за молчание меньше лет дают. Хотя у слишком доброй очень высокий риск быть преданной.
Действительно дилемма.
Ещё варианты?
Yandex
Объявления
22.08.2012, 14:43     Дилемма заключённого
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru