Лабораторная работа №1 (990940)
Текст из файла
Лабораторная работа №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 <robot*> 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<WPARAM>(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<HCURSOR>(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<RobotVec.size();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
ActiveRobot++;
if(ActiveRobot>=RobotVec.size())
ActiveRobot=0;
Robot=RobotVec.at(ActiveRobot);
temp=Robot->FindNearest();
if(temp==NULL)
res= 0;
else
res=1;
break;
case 2: //find dangerous
temp=Robot->FindDangerousEnemy();
if(temp==NULL)
res= 0;
else
res=1;
break;
case 3: // joinable
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















