Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Priscila Ramos

C++ Problemas na leitura do arquivo de dados

Recommended Posts

Boa tarde. Quando copilo o código abaixo aparece a mensagem "argumento inválido".  Alguém pode me ajudar ? Obrigada.

 


#include <iostream>
#include <vector>
#include <pthread.h>
#include <ilcplex/ilocplex.h>

int N_ITENS;
int N_PERIODOS;
std::vector<double> Capacidade;
std::vector<double> TempoProducao;
std::vector<double> CustoEstoque;
std::vector<double> TempoSetup;
std::vector<double> CustoSetup;
std::vector<std::vector<double>> Demanda;
std::vector<std::vector<double>> M;
class Subproblema;
class Mestre;

class Modelo
{
    public:
        IloEnv env;
        IloModel model;
        IloCplex cplex;
        IloObjective objective;

        //construtores
        Modelo(){
            env = IloEnv();
            model = IloModel(env);
            cplex = IloCplex(env);
        }

        ~Modelo(){
            model.end();
            cplex.end();
            env.end();
        }

        //metodos
        void setStream(std::ostream& st){
            cplex.setOut(st);
        }

        void setStreamOff(){
            cplex.setOut(env.getNullStream());
        }

        void solve(){
            cplex.solve();
        }

        IloNum getObjective(){
            return cplex.getObjValue();
        }

        IloCplex::CplexStatus getStatus(){
            return this->cplex.getCplexStatus();
        }
};

class Mestre : public Modelo
{
    public:

        IloNumVarArray X;   //variaveis lambda
        IloNumArray Coef;   //coeficientes de lambda
        IloRangeArray Range1;
        IloRangeArray Range2;

        //construtores
        Mestre(){
            this->objective = IloMinimize(this->env);

            this->criar_modelo();

            this->model.add(this->objective);
            this->cplex.extract(this->model);
        }

        ~Mestre(){};

		//metodos
        void criar_modelo(){

            //criar array de variaveis e coeficientes
            X = IloNumVarArray(this->env);
            Coef = IloNumArray(this->env);

            //cria Range1
            Range1 = IloRangeArray(this->env, N_ITENS);
            for(auto i=0; i<N_ITENS; i++){
                Range1[i] = IloRange(this->env, 1, 1);
            }
            this->model.add(Range1);

            //cria Range2
            Range2 = IloRangeArray(this->env, N_PERIODOS);
            for(auto t=0; t<N_PERIODOS; t++){
                Range2[t] = IloRange(this->env, 0, Capacidade[t]);
            }
            this->model.add(Range2);
        }

        void adicionar_coluna(Subproblema* sub);

        void criar_colunas_artificiais(){
            const double BIGM = 50000;

            for(auto i=0; i<N_ITENS; i++){
                IloNumColumn newCol = this->objective(BIGM);
                Coef.add(BIGM);

                //Range1
                newCol += Range1[i](1.0);

                IloNumVar newVar(newCol, 0.0, 1.0);
                this->model.add(newVar);
                X.add(newVar);
            }
        }
};

class Subproblema : public Modelo
{
	public:

        int i;  //indice do subproblema

        IloNumVarArray X;
        IloNumVarArray E;
        IloNumVarArray Y;

        //construtores
        Subproblema(int index){
            this->objective = IloMinimize(this->env);

            this->i = index;
            this->criar_modelo();

            this->model.add(this->objective);
            this->cplex.extract(this->model);
        }

        ~Subproblema(){};

        //metodos
        void criar_modelo(){

            //define as variaveis do modelo
            X = IloNumVarArray(this->env, N_PERIODOS);
            E = IloNumVarArray(this->env, N_PERIODOS);
            Y = IloNumVarArray(this->env, N_PERIODOS);

            for(auto t=0; t<N_PERIODOS; t++){
                X[t] = IloNumVar(this->env, 0, IloInfinity, ILOFLOAT);
                E[t] = IloNumVar(this->env, 0, IloInfinity, ILOFLOAT);
                Y[t] = IloNumVar(this->env, 0, 1, ILOBOOL);
            }

            //define as restricoes
            for(auto t=0; t<N_PERIODOS; t++){
                //conservacao de estoque
                if(t==0){
                    this->model.add(E[t] == X[t] - Demanda[this->i][t]);
                }else{
                    this->model.add(E[t] == E[t-1] + X[t] - Demanda[this->i][t]);
                }

                //o lote e limitado pela capacidade ou demanda dos periodos restantes
                this->model.add(X[t] <= M[this->i][t] * Y[t]);
            }
        }

        void update_objective(Mestre* mestre){
            //seta os coeficientes das variaveis
            for(auto t=0; t<N_PERIODOS; t++){
                double dual2 = mestre->cplex.getDual(mestre->Range2[t]);
                this->objective.setLinearCoef(X[t], - dual2 * TempoProducao[this->i]);
                this->objective.setLinearCoef(E[t], CustoEstoque[this->i]);
                this->objective.setLinearCoef(Y[t], CustoSetup[this->i] - dual2 * TempoSetup[this->i]);
            }
            this->objective.setConstant(- mestre->cplex.getDual(mestre->Range1[this->i]));
        }

        double get_custo_coluna(){
            //calcula custo do plano de producao (coluna)
            double f = 0;
            for(auto t=0; t<N_PERIODOS; t++){
                f += CustoSetup[this->i] * this->cplex.getValue(Y[t])
                     + CustoEstoque[this->i] * this->cplex.getValue(E[t]);
            }
            return f;
        }

        double get_g(int t){
            //calcula tempo de (setup + producao) do item i no periodo t
            return TempoSetup[this->i] * this->cplex.getValue(Y[t])
                    + TempoProducao[this->i] * this->cplex.getValue(X[t]);
        }
};

void Mestre::adicionar_coluna(Subproblema* sub){

    double custo = sub->get_custo_coluna();
    IloNumColumn newCol = this->objective(custo);
    Coef.add(custo);

    //Range1
    newCol += Range1[sub->i](1.0);

    //Range2
    for(auto t=0; t<N_PERIODOS; t++){
        newCol += Range2[t](sub->get_g(t));
    }

    IloNumVar newVar(newCol, 0.0, 1.0);
    this->model.add(newVar);
    X.add(newVar);
}

void ler_dados(std::string arquivo){

    std::ifstream in(arquivo.c_str());

    in >> N_ITENS;
    std::cout << "Numero de itens: " << N_ITENS << std::endl;

    in >> N_PERIODOS;
    std::cout << "Numero de periodos: " << N_PERIODOS << std::endl;

    double aux;
    in >> aux;
    in >> aux;

//    std::cout << "Capacidade:" << std::endl;
    for(auto i=0; i<N_PERIODOS; i++){
        Capacidade.push_back(aux);
//        std::cout << " " << Capacidade[i];
    }

//    std::cout << "\nTempo de producao:" << std::endl;
    for(auto i=0; i<N_ITENS; i++){
        in >> aux;
        TempoProducao.push_back(aux);
//        std::cout << " " << TempoProducao[i];
    }

//    std::cout << "\nCusto de estoque:" << std::endl;
    for(auto i=0; i<N_ITENS; i++){
        in >> aux;
        CustoEstoque.push_back(aux);
//        std::cout << " " << CustoEstoque[i];
    }

//    std::cout << "\nTempo de setup:" << std::endl;
    for(auto i=0; i<N_ITENS; i++){
        in >> aux;
        TempoSetup.push_back(aux);
//        std::cout << " " << TempoSetup[i];
    }

//    std::cout << "\nCusto de setup:" << std::endl;
    for(auto i=0; i<N_ITENS; i++){
        in >> aux;
        CustoSetup.push_back(aux);
//        std::cout << " " << CustoSetup[i];
    }

//    std::cout << "\nDemanda:" << std::endl;
    for(auto i=0; i<N_ITENS; i++){
        Demanda.push_back(std::vector<double>(N_PERIODOS, 0));
    }

    for(auto t=0; t<N_PERIODOS; t++){
        for(auto i=0; i<N_ITENS; i++){
            in >> Demanda[i][t];
//            std::cout << " " << Demanda[i][t];
        }
//        std::cout << std::endl;
    }

    //calcula M
    for(auto i=0; i<N_ITENS; i++){
        M.push_back(std::vector<double>(N_PERIODOS, 0));
        for(auto t=0; t<N_PERIODOS; t++){
            double soma = 0;
            for(auto j=t; j<N_PERIODOS; j++){
                soma += Demanda[i][j];
            }
            double x = (Capacidade[t] - TempoSetup[i]) / TempoProducao[i];
            M[i][t] = std::min(x, soma);
        }
    }
    std::cout << std::endl;
}

int main(int argc, char* argv[]){

    if(argc != 2){
        std::cout << "Argumento invalido." << std::endl;
        return 0;
    }

    ler_dados(argv[1]);

    std::cout << "\n== geração de colunas ==============\n" << std::endl;

    //criar os subproblemas
    std::vector<Subproblema*> Sub;
    for(auto i=0; i<N_ITENS; i++){
        Subproblema* sub = new Subproblema(i);
        sub->setStreamOff();
        Sub.push_back(sub);
    }

    //criar o mestre
    Mestre mestre;
    mestre.setStreamOff();
    mestre.criar_colunas_artificiais();

    //algoritmo de geração de colunas
    const double EPS = 1.0e-5;
    std::vector<double> custoSub(N_ITENS, 0.0);
    int novaColuna = 0;
    int iter = 0;

    do{

        iter++;
        std::cout << "Iteracao " << iter << std::endl;

        mestre.solve();
        std::cout << std::setprecision(10) << "mestre = " << mestre.getObjective() << std::endl;

        novaColuna = 0;

        for(auto i=0; i<N_ITENS; i++){
            Sub[i]->update_objective(&mestre);
            Sub[i]->solve();
//            std::cout << "status = " << Sub[i]->getStatus() << std::endl;
            custoSub[i] = std::min(Sub[i]->getObjective(), 0.0);
//            std::cout << std::setprecision(10) << "sub[" << i << "]= " << custoSub[i] << std::endl;
        }

        for(auto i=0; i<N_ITENS; i++){
            if(custoSub[i] < -EPS){
                mestre.adicionar_coluna(Sub[i]);
                novaColuna++;
//                std::cout << std::setprecision(10) << "sub[" << i << "]= " << custoSub[i] << std::endl;
            }
        }

        std::cout << std::endl;
    }while(novaColuna > 0);

    double gc = mestre.getObjective();
    std::cout << std::setprecision(10) << "GC = " << gc << std::endl;

    for(auto i=0; i<N_ITENS; i++){
        delete Sub[i];
    }

    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente você n receberá ajuda por que não é possivel compilar seu programa, pois falta ilcplex/ilocplex.h. Talvez você poderia dar mias detalhes em que parte do seu programa falha etc.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema nesse código está sendo porque você apenas está abrindo a aplicação sem passar nada no main, no seu caso, o argv precisa ser passado alguma informação antes de ser aberto, no caso você precisa passar o caminho do arquivo antes de abrir, poderia usar o cmd do Windows para isso ou terminal se você usar Linux, ou poderia criar uma outra aplicação que executaria o seu programa passando o caminho do arquivo usando a função system, existe varias formas de se fazer isso.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, vangodp disse:

Provavelmente você n receberá ajuda por que não é possivel compilar seu programa, pois falta ilcplex/ilocplex.h. Talvez você poderia dar mias detalhes em que parte do seu programa falha etc.

 

O ilcplex/ilocplex.h já foi incluído no código. O algoritmo não encontra o caminho para ler o arquivo de dados, como sugeriu o colega o Cyer.  Obrigada. 

adicionado 3 minutos depois
1 hora atrás, cyer disse:

O problema nesse código está sendo porque você apenas está abrindo a aplicação sem passar nada no main, no seu caso, o argv precisa ser passado alguma informação antes de ser aberto, no caso você precisa passar o caminho do arquivo antes de abrir, poderia usar o cmd do Windows para isso ou terminal se você usar Linux, ou poderia criar uma outra aplicação que executaria o seu programa passando o caminho do arquivo usando a função system, existe varias formas de se fazer isso.

Oi. Uso o Windows. Dentre as várias maneiras de contornar esse problema, qual  você  sugeri ?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Priscila Ramos apenas sugiro que use o seguinte código abaixo, com isso você não precisaria criar nada ou usar algum outro método.

 

Não esqueça de colocar o nome do arquivo dentro das "\\"

 

É necessário que o seu arquivo esteja na mesma pasta que o aplicativo.

 

NÃO REMOVA AS \\.

 

Exemplo:

strcat(caminhoarquivo, "\\meuarquivo.txt");

int main(int argc, char* argv[]){

    /*
    if(argc != 2){
        std::cout << "Argumento invalido." << std::endl;
        return 0;
    }

    ler_dados(argv[1]);
    */

    char caminhoarquivo[MAX_PATH] = { 0 };
    GetCurrentDirectoryA(MAX_PATH, caminhoarquivo);

    // Apenas coloque o nome do seu arquivo e o tipo do seu aquivo na linha baixo dentro das "\\"
    // Exemplo: "\\meuarquivo.txt"
    strcat(caminhoarquivo, "\\"); // Não remova as \\ é necessario coloque o nome do arquivo e o tipo depois das \\
                                        
    ler_dados(caminhoarquivo);

    std::cout << "\n== geração de colunas ==============\n" << std::endl;

    //criar os subproblemas
    std::vector<Subproblema*> Sub;
    for(auto i=0; i<N_ITENS; i++){
        Subproblema* sub = new Subproblema(i);
        sub->setStreamOff();
        Sub.push_back(sub);
    }

    //criar o mestre
    Mestre mestre;
    mestre.setStreamOff();
    mestre.criar_colunas_artificiais();

    //algoritmo de geração de colunas
    const double EPS = 1.0e-5;
    std::vector<double> custoSub(N_ITENS, 0.0);
    int novaColuna = 0;
    int iter = 0;

    do{

        iter++;
        std::cout << "Iteracao " << iter << std::endl;

        mestre.solve();
        std::cout << std::setprecision(10) << "mestre = " << mestre.getObjective() << std::endl;

        novaColuna = 0;

        for(auto i=0; i<N_ITENS; i++){
            Sub[i]->update_objective(&mestre);
            Sub[i]->solve();
            //            std::cout << "status = " << Sub[i]->getStatus() << std::endl;
            custoSub[i] = std::min(Sub[i]->getObjective(), 0.0);
            //            std::cout << std::setprecision(10) << "sub[" << i << "]= " << custoSub[i] << std::endl;
        }

        for(auto i=0; i<N_ITENS; i++){
            if(custoSub[i] < -EPS){
                mestre.adicionar_coluna(Sub[i]);
                novaColuna++;
                //                std::cout << std::setprecision(10) << "sub[" << i << "]= " << custoSub[i] << std::endl;
            }
        }

        std::cout << std::endl;
    }while(novaColuna > 0);

    double gc = mestre.getObjective();
    std::cout << std::setprecision(10) << "GC = " << gc << std::endl;

    for(auto i=0; i<N_ITENS; i++){
        delete Sub[i];
    }

    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×