⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cqtmodelvisualizer.cpp

📁 强化学习算法(R-Learning)难得的珍贵资料
💻 CPP
字号:
// Copyright (C) 2003
// Gerhard Neumann (gerhard@igi.tu-graz.ac.at)

//                
// This file is part of RL Toolbox.
// http://www.igi.tugraz.at/ril_toolbox
//
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. The name of the author may not be used to endorse or promote products
//    derived from this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "cqtmodelvisualizer.h"

#ifdef RL_TOOLBOX_USE_QT

#include <qgrid.h>
#include <qapplication.h>
#include <qpushbutton.h>
#include <qcheckbox.h>
#include <qfont.h>
#include <qlayout.h>
#include <qlabel.h>
#include <math.h>
#include <qgroupbox.h>
#include <qlistbox.h>

CQTModelVisualizer::CQTModelVisualizer( QWidget *parent, const char *name) : QWidget(parent, name)
{
	setPalette( QPalette( QColor( 250, 250, 200) ) );
	drawWidget = new QWidget(this);
	drawWidget->setBackgroundColor(QColor( 250, 250, 250));

	QCheckBox *drawCheckBox = new QCheckBox(this, "drawModel");
	drawCheckBox->setText( tr( "Draw Model" ) );
	drawCheckBox->setChecked(true);


	setFixedSize(500, 400);

	QVBoxLayout *layout = new QVBoxLayout(this);

	layout->addWidget(drawWidget);
	layout->addWidget(drawCheckBox);
	layout->setStretchFactor(drawWidget, 10);

	connect(drawCheckBox, SIGNAL(toggled ( bool )), this, SLOT(enableDrawModel(bool))); 

	drawModel = true;

	painter = NULL;
	pixMap = NULL;
}

CQTModelVisualizer::~CQTModelVisualizer()
{
	delete painter;
	delete pixMap;
	delete drawWidget;
}

QSizePolicy CQTModelVisualizer::sizePolicy() const
{
	return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
}

void CQTModelVisualizer::paintEvent(QPaintEvent * )
{
	drawState();
}

void CQTModelVisualizer::showEvent(QShowEvent *)
{
	if (pixMap == NULL)
	{
		pixMap = new QPixmap(drawWidget->size());
		painter = new QPainter(pixMap);
	}
}

void CQTModelVisualizer::drawState()
{
	pixMap->fill( drawWidget->backgroundColor());     // fill with widget background

	//	painter->begin(pixMap);
	painter->resetXForm();
	doDrawState(painter);

	bitBlt( drawWidget, QPoint(0,0), pixMap );
}

void CQTModelVisualizer::nextStep(CStateCollection *oldState, CAction *action, CStateCollection *nextState)
{
	if (drawModel)
	{
		newDrawState(nextState);
		drawState();
	}
}

void CQTModelVisualizer::enableDrawModel(bool drawModel)
{
	this->drawModel = drawModel;
}



CQTTextStateViewer::CQTTextStateViewer(CStateProperties *properties, QWidget *parent , const char *name) : QWidget(parent, name), CStateObject(properties)
{
	discreteStateEdits = new std::list<QLineEdit *>();
	continuousStateEdits = new std::list<QLineEdit *>();

	int rows = 0;

	if (properties->getNumContinuousStates() > properties->getNumDiscreteStates())
	{
		rows = properties->getNumContinuousStates() + 2;
	}
	else
	{
		rows = properties->getNumDiscreteStates() + 2;
	}
	QGridLayout *grid = new QGridLayout(this,  rows, 2, 10, 10);

	QLabel *TextLabel = new QLabel( this, NULL );
	TextLabel->setText( tr( "Discrete States" ) );

	grid->addWidget(TextLabel, 0,0, Qt::AlignCenter );

	TextLabel = new QLabel( this, NULL );
	TextLabel->setText( tr( "Continuous States" ) );

	grid->addWidget(TextLabel, 0, 1,Qt::AlignCenter );

	for (unsigned int i = 0; i < (unsigned int) (rows - 2); i++)
	{
		QLineEdit *discStateEdit = new QLineEdit(this);
		discStateEdit->setReadOnly(true);
		if ( i >= properties->getNumDiscreteStates())
		{
			discStateEdit->setEnabled(false);
		}
		grid->addWidget(discStateEdit, i + 1, 0,Qt::AlignCenter);
		discreteStateEdits->push_back(discStateEdit);
	}

	for (unsigned int i = 0; i < (unsigned int) (rows - 2); i++)
	{
		QLineEdit *contStateEdit = new QLineEdit(this);
		contStateEdit->setReadOnly(true);
		if ( i >= properties->getNumContinuousStates())
		{
			contStateEdit->setEnabled(false);
		}
		grid->addWidget(contStateEdit, i + 1, 1, Qt::AlignCenter);
		continuousStateEdits->push_back(contStateEdit);
	}

	QCheckBox *drawCheckBox = new QCheckBox(this, "drawModel");
	drawCheckBox->setText( tr( "Show Values" ) );
	drawCheckBox->setChecked(true);

	drawModel = true;

	connect(drawCheckBox, SIGNAL(toggled ( bool )), this, SLOT(enableDrawModel(bool))); 

	grid->addMultiCellWidget(drawCheckBox,  rows - 1, rows - 1, 0, 1);

	adjustSize();
}

CQTTextStateViewer::~CQTTextStateViewer()
{
	delete discreteStateEdits;
	delete continuousStateEdits;
}

void CQTTextStateViewer::enableDrawModel(bool drawModel)
{
	this->drawModel = drawModel;
}

void CQTTextStateViewer::nextStep(CStateCollection *oldState, CAction *action, CStateCollection *newState)
{
	if (drawModel)
	{
		std::list<QLineEdit *>::iterator it;
		unsigned int i = 0;

		CState *state = newState->getState(properties);

		for ( i = 0, it = discreteStateEdits->begin(); i < properties->getNumDiscreteStates(); it ++, i++)
		{
			QLineEdit *lineEdit = (*it);
			lineEdit->setText(QString::number(state->getDiscreteState(i)));
		}

		for ( i = 0, it = continuousStateEdits->begin(); i < properties->getNumContinuousStates(); it ++, i++)
		{
			QLineEdit *lineEdit = (*it);
			lineEdit->setText(QString::number(state->getContinuousState(i)));
		}
	}
}

CQTTextContinuousActionViewer::CQTTextContinuousActionViewer(CContinuousActionProperties *properties, QWidget *parent , const char *name) : QWidget(parent, name)
{

	this->properties = properties;
	this->continuousActionEdits = new std::list<QLineEdit *>();

	int rows = properties->getNumActionValues() + 2;
	
	QGridLayout *grid = new QGridLayout(this,  rows, 1, 10, 10);

	QLabel *TextLabel = new QLabel( this, NULL );
	TextLabel->setText( tr( "Action Values" ) );

	grid->addWidget(TextLabel, 0,0, Qt::AlignCenter );

	for (int i = 0; i < rows - 2; i++)
	{
		QLineEdit *continuousActionEdit = new QLineEdit(this);
		continuousActionEdit->setReadOnly(true);
		grid->addWidget(continuousActionEdit, i + 1, 0,Qt::AlignCenter);
		continuousActionEdits->push_back(continuousActionEdit);
	}

	QCheckBox *drawCheckBox = new QCheckBox(this, "drawModel");
	drawCheckBox->setText( tr( "Show Values" ) );
	drawCheckBox->setChecked(true);

	drawModel = true;

	connect(drawCheckBox, SIGNAL(toggled ( bool )), this, SLOT(enableDrawModel(bool))); 

	grid->addWidget(drawCheckBox,  rows - 1, rows - 1);

	adjustSize();
}

CQTTextContinuousActionViewer::~CQTTextContinuousActionViewer()
{
	delete continuousActionEdits;
}

void CQTTextContinuousActionViewer::enableDrawModel(bool drawModel)
{
	this->drawModel = drawModel;
}

void CQTTextContinuousActionViewer::nextStep(CStateCollection *oldState, CAction *action, CStateCollection *newState)
{
	if (drawModel)
	{
		std::list<QLineEdit *>::iterator it;
		unsigned int i = 0;

		CContinuousAction *contAction = dynamic_cast<CContinuousAction *>(action);

		for ( i = 0, it = continuousActionEdits->begin(); i < properties->getNumActionValues(); it ++, i++)
		{
			(*it)->setText(QString::number(contAction->getActionValue(i)));
		}
	}
}


CQTTextRewardViewer::CQTTextRewardViewer(CRewardFunction *rewardFunction, QWidget *parent, const char *name) : QWidget(parent, name), CSemiMDPRewardListener(rewardFunction)
{
	int rows = 2;

	QGridLayout *grid = new QGridLayout(this,  rows, 2, 10, 10);

	QLabel *TextLabel = new QLabel( this, NULL );
	TextLabel->setText( tr( "Reward:" ) );

	grid->addWidget(TextLabel, 0,0, Qt::AlignCenter );

	rewardEdit = new QLineEdit(this);
	rewardEdit->setReadOnly(true);
	grid->addWidget(rewardEdit, 0, 1,Qt::AlignCenter);

	QCheckBox *drawCheckBox = new QCheckBox(this, "drawModel");
	drawCheckBox->setText( tr( "Show Values" ) );
	drawCheckBox->setChecked(true);

	drawModel = true;

	connect(drawCheckBox, SIGNAL(toggled ( bool )), this, SLOT(enableDrawModel(bool))); 

	grid->addMultiCellWidget(drawCheckBox,  rows - 1, rows - 1, 0, 1);

	adjustSize();
}

void CQTTextRewardViewer::nextStep(CStateCollection *oldState, CAction *action, rlt_real reward, CStateCollection *newState)
{
	if (drawModel)
	{
		rewardEdit->setText(QString::number(reward));
	}
}

void CQTTextRewardViewer::enableDrawModel(bool drawModel)
{
	this->drawModel = drawModel;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -