...
 
Commits (3)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.2.0, 2020-01-27T10:46:33. -->
<!-- Written by QtCreator 4.2.0, 2020-02-13T01:48:04. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
......
......@@ -30,8 +30,8 @@ private slots:
void on_btnAplicar_clicked();
void onModelDataChanged();
void onTablaModelVerticalScrollChanged(int value);
void onTablaModelFamilyVerticalScrollChanged(int value);
void onTablaModelCellClicked(const QModelIndex &);
void onTablaModelFamilyVerticalScrollChanged(int value);
void onTablaModelFamilyCellClicked(const QModelIndex &);
void onCantidadValueChanged(int i);
......@@ -40,12 +40,11 @@ signals:
public:
explicit DataEditorWidget(QWidget *parent = 0);
~DataEditorWidget();
Simulation* getSimulacion() { return this->simulacion; }
bool getHuboCambios() { return this->huboCambios; }
~DataEditorWidget();
void nuevaSimulacion(QString ruta);
void actualizarNombreViviendas();
bool guardar();
......
data;
set C := c2 c0 c1;
set V := v0 v1 v2;
param p : v0 v1 v2 :=
c2 3 2 1
c0 1 2 3
c1 2 3 1
;
end;
\ No newline at end of file
data;
set C := c2 c0 c1;
set V := v0 v1 v2;
param S := 2;
param p : v0 v1 v2 :=
c2 3 2 1
c0 1 2 3
c1 2 3 1
;
end;
\ No newline at end of file
Reading model section from GLPK/Modelos/MTAV.mod...
GLPK/Modelos/MTAV.mod:29: warning: unexpected end of file; missing end statement inserted
29 lines were read
Reading data section from GLPK/Datos/MTAV_pref.dat...
GLPK/Datos/MTAV_pref.dat:13: warning: final NL missing before end of file
13 lines were read
Generating resultado...
Generating z_menorIgual...
Generating unicaAsignacionCoperativista_mayorIgual...
Generating unicaAsignacionCoperativista_menorIgual...
Generating unicaAsignacionCasa_mayorIgual...
Generating unicaAsignacionCasa_menorIgual...
Model has been successfully generated
lpx_simplex: original LP has 16 rows, 10 columns, 49 non-zeros
lpx_simplex: presolved LP has 15 rows, 10 columns, 48 non-zeros
lpx_adv_basis: size of triangular part = 15
* 8: objval = 2.000000000e+000 infeas = 0.000000000e+000 (0)
* 15: objval = 1.500000000e+000 infeas = 1.110223025e-016 (0)
OPTIMAL SOLUTION FOUND
Integer optimization begins...
Objective function is integral
+ 15: mip = not found yet >= -inf (1; 0)
+ 20: mip = 3.000000000e+000 >= 2.000000000e+000 33.3% (3; 0)
+ 24: mip = 2.000000000e+000 >= 2.000000000e+000 0.0% (4; 1)
+ 24: mip = 2.000000000e+000 >= tree is empty 0.0% (0; 9)
INTEGER OPTIMAL SOLUTION FOUND
Time used: 0.0 secs
Memory used: 0.2M (178873 bytes)
lpx_print_mip: writing MIP problem solution to `GLPK/Soluciones/MTAV_pref.sol'...
set C;
/* cooperativistas */
set V;
/* viviendas */
param p{c in C, v in V};
/* prioridades de los cooperativistas por las viviendas */
var x{c in C, v in V}, binary;
/* indica si el cooperativista c es asignado a la vivienda v */
var z, integer;
/* variable auxiliar para representar la mínima satisfacción */
minimize resultado: z;
s.t. z_menorIgual{c in C}: z >= sum{v in V} p[c,v] * x[c,v];
/* busco que z sea menor o igual que la satisfacción de cada cooperativista c */
s.t. unicaAsignacionCoperativista_mayorIgual{c in C}: sum{v in V} x[c,v] >= 1;
s.t. unicaAsignacionCoperativista_menorIgual{c in C}: sum{v in V} x[c,v] <= 1;
/* el cooperativista c solo tiene una vivienda asignada */
s.t. unicaAsignacionCasa_mayorIgual{v in V}: sum{c in C} x[c,v] >= 1;
s.t. unicaAsignacionCasa_menorIgual{v in V}: sum{c in C} x[c,v] <= 1;
/* la vivienda v solo tiene un cooperativista asignado */
set C;
/* cooperativistas */
set V;
/* viviendas */
param S;
/* satisfacción */
param p{c in C, v in V};
/* prioridades de los cooperativistas por las viviendas */
var x{c in C, v in V}, binary;
/* indica si el cooperativista c es asignado a la vivienda v */
minimize s: sum{c in C, v in V} p[c,v] * x[c,v];
/* preferencias acumuladas */
s.t. unicaAsignacionCoperativista_mayorIgual{c in C}: sum{v in V} x[c,v] >= 1;
s.t. unicaAsignacionCoperativista_menorIgual{c in C}: sum{v in V} x[c,v] <= 1;
/* el cooperativista c solo tiene una vivienda asignada */
s.t. unicaAsignacionCasa_mayorIgual{v in V}: sum{c in C} x[c,v] >= 1;
s.t. unicaAsignacionCasa_menorIgual{v in V}: sum{c in C} x[c,v] <= 1;
/* la vivienda v solo tiene un cooperativista asignado */
s.t. z_menorIgual{c in C}: sum{v in V} p[c,v] * x[c,v] <= S;
/* nivel de satisfacción */
\ No newline at end of file
Problem: MTAV
Rows: 16
Columns: 10 (10 integer, 9 binary)
Non-zeros: 49
Status: INTEGER OPTIMAL
Objective: resultado = 2 (MINimum) 1.5 (LP)
No. Row name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 resultado 2
2 z_menorIgual[c2]
0 -0
3 z_menorIgual[c0]
1 -0
4 z_menorIgual[c1]
1 -0
5 unicaAsignacionCoperativista_mayorIgual[c2]
1 1
6 unicaAsignacionCoperativista_mayorIgual[c0]
1 1
7 unicaAsignacionCoperativista_mayorIgual[c1]
1 1
8 unicaAsignacionCoperativista_menorIgual[c2]
1 1
9 unicaAsignacionCoperativista_menorIgual[c0]
1 1
10 unicaAsignacionCoperativista_menorIgual[c1]
1 1
11 unicaAsignacionCasa_mayorIgual[v0]
1 1
12 unicaAsignacionCasa_mayorIgual[v1]
1 1
13 unicaAsignacionCasa_mayorIgual[v2]
1 1
14 unicaAsignacionCasa_menorIgual[v0]
1 1
15 unicaAsignacionCasa_menorIgual[v1]
1 1
16 unicaAsignacionCasa_menorIgual[v2]
1 1
No. Column name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 x[c2,v0] * 0 0 1
2 x[c2,v1] * 1 0 1
3 x[c2,v2] * 0 0 1
4 x[c0,v0] * 1 0 1
5 x[c0,v1] * 0 0 1
6 x[c0,v2] * 0 0 1
7 x[c1,v0] * 0 0 1
8 x[c1,v1] * 0 0 1
9 x[c1,v2] * 1 0 1
10 z * 2
End of output
Problem: MTAV_empate
Rows: 16
Columns: 9 (9 integer, 9 binary)
Non-zeros: 54
Status: INTEGER OPTIMAL
Objective: s = 4 (MINimum) 4 (LP)
No. Row name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 s 4
2 unicaAsignacionCoperativista_mayorIgual[c2]
1 1
3 unicaAsignacionCoperativista_mayorIgual[c0]
1 1
4 unicaAsignacionCoperativista_mayorIgual[c1]
1 1
5 unicaAsignacionCoperativista_menorIgual[c2]
1 1
6 unicaAsignacionCoperativista_menorIgual[c0]
1 1
7 unicaAsignacionCoperativista_menorIgual[c1]
1 1
8 unicaAsignacionCasa_mayorIgual[v0]
1 1
9 unicaAsignacionCasa_mayorIgual[v1]
1 1
10 unicaAsignacionCasa_mayorIgual[v2]
1 1
11 unicaAsignacionCasa_menorIgual[v0]
1 1
12 unicaAsignacionCasa_menorIgual[v1]
1 1
13 unicaAsignacionCasa_menorIgual[v2]
1 1
14 z_menorIgual[c2]
2 2
15 z_menorIgual[c0]
1 2
16 z_menorIgual[c1]
1 2
No. Column name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 x[c2,v0] * 0 0 1
2 x[c2,v1] * 1 0 1
3 x[c2,v2] * 0 0 1
4 x[c0,v0] * 1 0 1
5 x[c0,v1] * 0 0 1
6 x[c0,v2] * 0 0 1
7 x[c1,v0] * 0 0 1
8 x[c1,v1] * 0 0 1
9 x[c1,v2] * 1 0 1
End of output
SORTEO,test
CANTIDAD_VIVIENDAS,9
-,v1,v2,v3,v4,v5,v6,v7,v8,v9
M,1,2,3,4,5,6,7,8,9
S,2,3,1,7,3,6,5,4,7
A,6,2,1,2,4,3,5,6,7
P,2,8,9,7,6,4,5,3,1
O,1,4,5,2,3,6,7,8,9
I,4,5,7,6,3,2,8,9,1
U,9,8,7,6,5,1,2,3,4
Y,1,2,3,4,9,8,7,6,5
T,9,8,7,6,5,4,3,2,1
SORTEO,test
CANTIDAD_VIVIENDAS,3
-,v1,v2,v3
M,1,2,3
S,2,3,1
A,3,2,1
......@@ -101,7 +101,6 @@ QString GLPK::generarEntradaGLPK_MTAV(){
QString strC = "";
QString strV = "";
QString strP = "";
QList<int> cRandom;
......
#include "householdseditorwidget.h"
#include "ui_householdseditorwidget.h"
// CONSTRUCTOR
HouseHoldsEditorWidget::HouseHoldsEditorWidget(QWidget *parent) :
QDialog(parent),
ui(new Ui::houseHoldsEditorWidget)
......@@ -9,11 +10,13 @@ HouseHoldsEditorWidget::HouseHoldsEditorWidget(QWidget *parent) :
ui->setupUi(this);
}
// DESTRUCTOR
HouseHoldsEditorWidget::~HouseHoldsEditorWidget()
{
delete ui;
}
// METHODS
void HouseHoldsEditorWidget::abrirDialog(Simulation * simulacion){
tablaModel = new QStandardItemModel(simulacion->getCantidad(), 1,this);
......
......@@ -12,7 +12,7 @@
#include <QCloseEvent>
// CONSTRUCTOR
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
......@@ -44,9 +44,9 @@ MainWindow::MainWindow(QWidget *parent) :
this->houseHoldsEditor = new HouseHoldsEditorWidget();
this->configEditor = new ConfigurationWidget();
// connect(this->houseHoldsEditor, SIGNAL(simulationChanged(Simulation*)), this, SLOT(on_simulacionNombreViviendas_changed(Simulation*)));
connect(this->dataEditor, SIGNAL(ruta_changed(QString)), this, SLOT(on_changeStatusBarText(QString)));
// Initial Simulation setup
if (settings.value("CARGAR_ULTIMO_SORTEO").toBool()
&& QFile::exists(settings.value("RUTA_ULTIMO_SORTEO").toString())){
this->dataEditor->nuevaSimulacion(settings.value("RUTA_ULTIMO_SORTEO").toString());
......@@ -56,18 +56,21 @@ MainWindow::MainWindow(QWidget *parent) :
this->dataEditor->nuevaSimulacion(NULL);
}
} else
this->dataEditor->nuevaSimulacion(QString::null);
this->dataEditor->nuevaSimulacion(NULL);
setCentralWidget(this->dataEditor);
QDir::setCurrent(QCoreApplication::applicationDirPath());
}
// DESTRUCTOR
MainWindow::~MainWindow()
{
delete ui;
}
// METHODS
// ToolBar buttons
void MainWindow::on_actionNuevo_triggered()
{
if (this->chequeoGuardar())
......
......@@ -14,6 +14,7 @@
#include <QDir>
// CONSTRUCTORS
Simulation::Simulation(int viviendas): settings(QCoreApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat)
{
this->cantidad = viviendas;
......@@ -28,6 +29,8 @@ Simulation::Simulation() : settings(QCoreApplication::applicationDirPath() + "/c
}
// METHODS
void Simulation::setPreferencias(QHash<int, QStringList> preferencias)
{
this->preferencias.clear();
......@@ -137,14 +140,11 @@ void Simulation::guardar()
if (settings.value("CSV_DELIMITER").toInt() == 1) delimiter = ";";
QFile fileSimulacion(this->ruta);
fileSimulacion.open(QIODevice::ReadWrite);
QTextStream streamSimulacion(&fileSimulacion);
streamSimulacion << "SORTEO" << delimiter << this->nombre << "\n";
streamSimulacion << "CANTIDAD_VIVIENDAS" << delimiter << QString::number(this->cantidad) << "\n";
streamSimulacion << "-";
for (int i=0; i < this->viviendasMapeo.count(); i++){
......@@ -309,8 +309,6 @@ QString Simulation::validar()
// - que cada fila tenga todas las preferencias elegidas y que no se repitan
QStringList familias;
for (int i=0; i < this->preferencias.count(); i++){
QString familiaNombre = this->preferencias[i].at(0);
......
......@@ -9,7 +9,7 @@ class Simulation
{
private:
QString nombre;
QString ruta;
QString ruta; // Path to file
int cantidad;
QHash<int, QStringList> preferencias;
QHash<QString, int> preferenciasMapeoNumero;
......@@ -24,6 +24,8 @@ public:
Simulation();
Simulation(int viviendas);
// Unless setPreferencias, trivial getters & setters
void setNombre(QString nombre) { this->nombre = nombre; }
void setCantidad(int cantidad) { this->cantidad = cantidad; }
void setRuta(QString ruta) { this->ruta = ruta; }
......@@ -44,6 +46,8 @@ public:
QHash<int, QString> getViviendasMapeo() { return this->viviendasMapeo; }
QHash<int, QString> getAsignaciones() { return this->asignaciones; }
// Methods
static Simulation* cargar(QString ruta);
QString generarReporte(QString ruta);
QString validar();
......
......@@ -9,6 +9,7 @@
#include <QStandardItem>
#include <QList>
// CONSTRUCTOR
SimulationResultWidget::SimulationResultWidget(QWidget *parent) :
QDialog(parent),
ui(new Ui::SimulationResultWidget)
......@@ -17,20 +18,23 @@ SimulationResultWidget::SimulationResultWidget(QWidget *parent) :
ui->setupUi(this);
}
// DELETER
SimulationResultWidget::~SimulationResultWidget()
{
delete ui;
}
// METHODS
void SimulationResultWidget::abrirDialog(Simulation *simulacion)
{
this->simulacion = simulacion;
this->ui->txtNombre->setText(this->simulacion->getNombre());
tablaModel = new QStandardItemModel(this->simulacion->getCantidad(), 2,this);
tablaModel = new QStandardItemModel(this->simulacion->getCantidad(), 3,this);
tablaModel->setHorizontalHeaderItem(0, new QStandardItem(QString("Familia")));
tablaModel->setHorizontalHeaderItem(1, new QStandardItem(QString("Asignacion")));
tablaModel->setHorizontalHeaderItem(2, new QStandardItem(QString("Preferencia")));
QHash<int, QString> asignaciones = this->simulacion->getAsignaciones();
QHash<int, QStringList> preferencias = this->simulacion->getPreferencias();
......@@ -39,9 +43,13 @@ void SimulationResultWidget::abrirDialog(Simulation *simulacion)
for (int i = 0; i < asignaciones.count(); i++){
tablaModel->setItem(i,0, new QStandardItem(preferencias[i].at(0)));
QString vivienda = this->simulacion->getViviendasMapeo()[asignaciones[i].toInt()];
QString vivienda = this->simulacion->getViviendasMapeo()[asignaciones[i].toInt()];
tablaModel->setItem(i,1, new QStandardItem(vivienda));
QString preferencia = preferencias[i].at(asignaciones[i].toInt() + 1);
tablaModel->setItem(i,2, new QStandardItem(preferencia));
}
QList<QStandardItem*> lista;
lista.append(new QStandardItem(QString("Res")));
......@@ -57,6 +65,7 @@ void SimulationResultWidget::abrirDialog(Simulation *simulacion)
showResults();
}
// ACTIONS
void SimulationResultWidget::on_btnExportarAPdf_clicked()
{
......