//
// main.cpp
// Simplex
//
// Created by Lettiery on 02/05/16.
// Copyright © 2016 Lettiery. All rights reserved.
//
#include <iostream>
#include <vector>
#include "Simplex.h"
using namespace std;
void imprimirModelo(double model, int n_variaveis, int n_rest, vector<vector<double> >);
vector<vector<double> > lerModelo(int * n_restricoes, int * n_variaveis, double * model);
vector<vector<double> > criarModelo(int * n_restricoes, int * n_variaveis, double * model);
int main(int argc, const char * argv[]) {
int n_restricoes, n_variaveis;
double model;
vector<vector<double> > tablo;
char c;
cout << "Deseja inserir um modelo? (Y/N): ";
cin >> c;
if(c == 'Y' || c == 'y'){
tablo = lerModelo(&n_restricoes, &n_variaveis, &model);
}else{
tablo = criarModelo(&n_restricoes, &n_variaveis, &model);
}
//vector<vector<double> > tablo = lerModelo(&n_restricoes, &n_variaveis, &model);
//vector<vector<double> > tablo = criarModelo(&n_restricoes, &n_variaveis, &model);
imprimirModelo(model, n_variaveis, n_restricoes, tablo);
Simplex alg (model , n_variaveis, n_restricoes, tablo);
alg.imprimirTablo();
alg.primal();
return 0;
}
vector<vector<double> > criarModelo(int * n_restricoes, int * n_variaveis, double * model){
*model = -1.0;// minimizar
*n_variaveis = 2;
*n_restricoes = 3;
vector<vector<double> > tablo((*n_restricoes) + 1, vector<double>( (*n_variaveis) + (*n_restricoes) + 1 , 0));
tablo[0][0] = 0;// inicia z = 0
tablo[0][1] = 1.12; tablo[0][2] = 1.23;//1.12x1 + 1.23x2
tablo[1][1] = 1; tablo[1][2] = 0; tablo[1][0] = 300;// 3x1 + 1x2+ 0x2 <= 15
tablo[2][1] = 0; tablo[2][2] = 1; tablo[2][0] = 270;// 2x1 + 2x2 + 2x3 <= 20
tablo[3][1] = -1; tablo[3][2] = -1; tablo[3][0] = -500;
for(int c = 1; c < tablo[0].size();c++){
tablo[0][c] *= *model;
}
return tablo;
}
vector<vector<double> > lerModelo(int * n_restricoes, int * n_variaveis, double * model){
char max;
printf("Entrada do Modelo\n\n");
printf("MAXIMIZAR? (Y/N): "); scanf("%c", &max);
printf("Quantidade do variáveis: "); scanf("%d", n_variaveis);
printf("Quantidade de restrições: "); scanf("%d", n_restricoes);
vector<vector<double> > tablo((*n_restricoes) + 1, vector<double>( (*n_variaveis) + (*n_restricoes) + 1 , 0));
if (max == 'Y' || max=='y'){
*model = 1.0;
}else{
*model = -1.0;
}
tablo[0][0] = 0;// inicia z = 0
printf("Valores da FO:\n");
for (int c = 1; c <= *n_variaveis; c++) {// lendo FO
printf("X%d: ", c);
cin >> tablo[0][c];
tablo[0][c] *= *model;// zj-cj
}
for (int l = 1; l <= *n_restricoes; l++) {// lendo restricoes
printf("\nRestrição %d:\n", l);
for (int c = 1; c <= *n_variaveis; c++) {
printf("X%d: ", c);
cin >> tablo[l][c];
}
printf("Restrição %d <= ", l);
cin >> tablo[l][0];
}
return tablo;
}
void imprimirModelo(double model, int n_variaveis, int n_restricoes, vector<vector<double> > tablo){
cout << "\nModelo\n";
if(model == 1.0){
cout << "Max Z = ";
}else{
cout << "Min Z = ";
}
for(int c = 1; c <= n_variaveis; c++){
printf("%0.fX%d", tablo[0][c] * model , c);
if(c < n_variaveis){
cout << " + ";
}
}
cout << endl;
for(int l = 1; l <= n_restricoes; l++){
for(int c = 1; c <= n_variaveis; c++){
printf("%0.fX%d", tablo[l][c] , c);
if(c < n_variaveis){
cout << " + ";
}
}
printf(" <= %0.f\n", tablo[l][0] );
}
cout << endl;
}