Лабораторные работы (2008) (Лабораторная работа №1)

Посмотреть архив целиком







Лабораторная работа №1 по курсу

«Теория игр и исследование операций»















Выполнил : студент группы А-16-05
Семенов Андрей Владимирович









Москва 2008









Содержание



Постановка задачи ……………………………………………………………… 3


Описание предметной области………………………………………………. 3


Описание табличной модели ………………………………………………… 5


Пример работы…………………………………………………………………… 9


Приложение……………………………………………………………………… 10




























Постановка задачи


Сформировать модель принятия решений в виде совокупности таблиц решений и написать модуль-интерпретатор для данной модели.







Описание предметной области


Данная модель имитирует поведение «роботов» разного цвета, со следующими допущениями:


модель поведения роботов определяется количеством «жизни».


«роботы» одного цвета могут объединяться друг с другом, при условии, что их общий размер жизни не превысит определенного максимума.


Количество жизни каждого «робота» определяется случайным образом.


«Роботы» разных цветов поглощают друг, друга и остается тот, у которого количество «жизни» больше.



Конечное состояние достигается в случае, когда остается один «робот» или «роботы» одного цвета.


Окно программы-интерпретатора:



Описание табличной модели


Модель включает в себя три таблицы, содержащие правила поведения для «роботов» при определенных условиях. Все таблицы полны и противоречивы.

Таблица №1 (Поведение роботов)






«Роботы» могут двигаться только на одну клетку по вертикали или горизонтали, а также может ждать (не передвигаться).


Шаг «робота» в какую-либо сторону зависит от того, имеются ли рядом другие «роботы». Логика такова, что «роботы» одного цвета стараются объединиться, роботы разных цветов стараются поглотить друг друга. Причем «роботы» с меньшим количеством «жизни» стараются убежать от робота противника с большим количеством «жизни».







Таблица №2 (Чистилище)








Определение итогов игры: роботу присваивается звание Sinner, если количество убитых противников равно 2. Killer-3.

Devil- больше 3. Good-1. Saint-0.








Таблица №3(Финал)





Когда на поле остаются два «робота» включается третья таблица. Оба «робота» движутся друг к другу.


Оптимизированная трансляция


Таблица №1


Таблица №2


Таблица №3



Пример работы






Приложение


модуль-интерпретатор был реализован на языке Borland C++


//---------------------------------------------------------------------------


// robotsDlg.cpp : implementation file

//


#include "stdafx.h"

#include "robot.h"

#include "robots.h"

#include "rates.h"

#include "robotsDlg.h"

#include "TMessage.h"

#include "Field.h"

#include "PictureBox.h"


#ifdef _DEBUG

#define new DEBUG_NEW

#endif


#define SIMPR_MESSAGE "KAWAII_SIMPR"

#define CONDITIONS 0

#define ACTIONS 1

static UINT SimprMessage = RegisterWindowMessage(SIMPR_MESSAGE);

CMutex g_m;


Field* MyField;

rates purgatory;

// CAboutDlg dialog used for App About

vector RobotVec;

int ActiveRobot=0;

robot* Robot;


class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

enum { IDD = IDD_ABOUTBOX };


protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

// Implementation

protected:

DECLARE_MESSAGE_MAP()

};


CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}


BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()



// CrobotsDlg dialog





CrobotsDlg::CrobotsDlg(CWnd* pParent /*=NULL*/)

: CDialog(CrobotsDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}


void CrobotsDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Control(pDX, IDC_BUTTON1, start);

DDX_Control(pDX, IDC_BUTTON2, stop);

//DDX_Control(pDX, IDC_PICTURE, Pic);

DDX_Control(pDX, IDC_PICTURE, Pic);

DDX_Control(pDX, IDC_TEXT, RateText);

}


BEGIN_MESSAGE_MAP(CrobotsDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, &CrobotsDlg::OnBnClickedButton1)

ON_REGISTERED_MESSAGE(SimprMessage,&CrobotsDlg::OnSimpr)

ON_BN_CLICKED(IDC_BUTTON2, &CrobotsDlg::OnBnClickedButton2)

// ON_BN_CLICKED(IDC_BUTTON3, &CrobotsDlg::OnBnClickedButton3)

ON_BN_CLICKED(IDOK, &CrobotsDlg::OnBnClickedOk)

ON_STN_CLICKED(IDC_PICTURE, &CrobotsDlg::OnStnClickedPicture)

END_MESSAGE_MAP()



// CrobotsDlg message handlers


BOOL CrobotsDlg::OnInitDialog()

{

CDialog::OnInitDialog();


// Add "About..." menu item to system menu.


// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);


CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}


// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon


// TODO: Add extra initialization here


Pic.Init();

return TRUE; // return TRUE unless you set the focus to a control

}


void CrobotsDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}


// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.


void CrobotsDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting


SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);


// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;


// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}


// The system calls this function to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CrobotsDlg::OnQueryDragIcon()

{

return static_cast(m_hIcon);

}



void CrobotsDlg::OnBnClickedButton1()

{

// TODO: Add your control notification handler code here

MyField=new Field(Pic.FieldWidth,Pic.FieldHeight);

//MyField->Pic=this->Pic;

robot* c;

for(int i=0;i<20;i++)

{

c=MyField->PutRandomRobot();

RobotVec.push_back(c);

}

Pic.DrawField();

start.EnableWindow(0);

stop.EnableWindow(1);

//c->MakeRandMove();

ActiveRobot=0;

//delete(c);

//SendMessage(SimprMessage, 0, 0);

}


void CrobotsDlg::OnBnClickedButton2()

{

CSingleLock lock(&g_m);

lock.Lock();

//if(r==WAIT_OBJECT_0)

{//mutex

while(RobotVec.size()!=0)

{

delete(RobotVec.at(RobotVec.size()-1));

RobotVec.resize(RobotVec.size()-1);

}

//RobotVec.clear();

delete(MyField);

start.EnableWindow(1);

stop.EnableWindow(0);

}

lock.Unlock();

}



LRESULT CrobotsDlg::OnSimpr(WPARAM wParam, LPARAM lParam)

{

//int i=0;

CString z;

bool exit=false;

bool same=true;

if(!stop.IsWindowEnabled())

exit=1;

if(RobotVec.size()<=1)

exit=1;

bool AnotherCommand=0;

for(int i=0;i

if(RobotVec.at(i)->command!=RobotVec.at(0)->command)

same=0;

if(exit||same)

{

if(stop.IsWindowEnabled())

{

if(MyField->NeedRedraw)

Pic.DrawField();

OnBnClickedButton2();

}

return 0;

}


if(MyField->NeedRedraw)

Pic.DrawField();

//if(count==0)ActiveRobot++;

//if(count==4)count=0;

//else count++;


//robot* Robot=RobotVec.at(ActiveRobot);

CSingleLock lock(&g_m);

lock.Lock();

Sleep(2);

robot* temp;

//if(ActiveRobot==0){

// i++;

//}

//DWORD r=WaitForSingleObject(Sync,INFINITE);

//if(r==WAIT_OBJECT_0)

//robot* r=RobotVec.at(0);

bool res;

TMessage m;

m.WParam=wParam;

m.LParam=lParam;

m.Result=0;//do not need

m.Msg=0;//do not need

memcpy_s(&m.WParamLo,sizeof(INT16)*6,&m.WParam,sizeof(INT32)*3);

switch(m.WParamHi)

{

case CONDITIONS: // Условия

switch(m.WParamLo)

{

case 1: // Таблица 1

switch(m.LParam) // Номер условия

{

case 1: //find any robot

//detect active


Случайные файлы

Файл
36174.rtf
ch_of_gr.doc
42294.rtf
75793-1.rtf
32417.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.