Decision Optimization

Decision Optimization

Delivers prescriptive analytics capabilities and decision intelligence to improve decision-making.


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
Expand all | Collapse all

模型代码可以运行,但最后显示Cplex_solve error!,请问下那部分出现了问题,具体是什么问题

  • 1.  模型代码可以运行,但最后显示Cplex_solve error!,请问下那部分出现了问题,具体是什么问题

    Posted 08/29/22 01:11 PM
    #include <ilcplex/ilocplex.h>
    #include <ilcplex/ilocplexi.h>
    #include <time.h>
    #include <math.h>

    #include <process.h>
    #include <conio.h>
    #include <dos.h>
    #include <memory.h>
    #include <iostream>
    #include <fstream>
    #include <stdlib.h>
    #include <stdio.h>

    using namespace std;
    ILOSTLBEGIN
    typedef IloArray<IloIntVarArray> IntVarMatrix;
    typedef IloArray<IloNumArray> IntMatrix;
    typedef IloArray<IloNumArray> NumMatrix;
    typedef IloArray<IloNumVarArray> NumVarMatrix;//二维变量
    typedef IloArray<NumVarMatrix> NumVarMatrix3d;//三维变量
    typedef IloArray<NumVarMatrix3d> NumVarMatrix4d;//四维变量


    #define myTiLim 3600
    #define Cmp 3 //number of company
    #define JobMax 1 //max number ofjobs
    #define MchMax 1 //max number of machines
    #define numTest 1 //number of instances

    //定义参数
    int Job[Cmp]; // number of jobs
    int Mch[Cmp]; // number of machines
    double p[Cmp][JobMax]; // Pij 企业i的工件j的加工时间
    double w[Cmp][JobMax][Cmp]; // 企业i的工件j在企业i^外包加工的费用
    double q[Cmp][MchMax]; // 企业i的机器im的单位加工能耗
    double v[Cmp][MchMax]; // 企业i的机器im的加工速度
    double e[Cmp][MchMax]; // 企业i的机器im的单位时间碳排放量
    double Time[Cmp][JobMax][Cmp][MchMax]; // 企业i的工件j在企业i^的机器i^m的加工时间

    int Numth; //test instance intex测试实例索引

    double EB;
    double SB;
    double SBI;
    double SBN;


    double UBcplex, LBcplex;
    double timeCP;
    double Gap;
    int nbConstraints, nbBivriables;

    const char* resultDir = "D:\\Cplex -Test\\caseResult-3.txt";
    ofstream resufile(resultDir);

    void initialize()
    {
    const char* FNstr{};
    FNstr = NULL;

    // 传入文件
    if (Numth == 0) FNstr = "D:\\Cplex -Test\\case-3.txt";

    ifstream infile(FNstr, ios::in);
    if (!infile) {
    cerr << "Open error:" << endl;
    exit(1);
    }

    // 1. I 企业集合
    // 企业个数
    cout << "\nCmp:" << Cmp << endl;
    // 2. J 各企业的订单集合
    // 订单数
    cout << "\n【Number of jobs per Cmp】" << endl;
    for (int i = 0; i < Cmp; i++) {
    infile >> Job[i];
    cout << Job[i] << "\t";
    }
    cout << endl;
    // 3. M 各企业的机器集合
    cout << "\n【Number of Mchs per Cmp】" << endl;
    for (int i = 0; i < Cmp; i++) {
    infile >> Mch[i];
    cout << Mch[i] << "\t";
    }

    // 4. P 企业i的工件j的加工时间pij
    cout << "\n【Processing time】" << endl;
    // 初始化
    for (int i = 0; i < Cmp; i++) {
    for (int j = 0; j < JobMax; j++) {
    p[i][j] = 0;
    }
    }
    cout << endl;
    // 赋值
    for (int i = 0; i < Cmp; i++) {
    for (int j = 0; j < Job[i]; j++) {
    infile >> p[i][j];
    cout << p[i][j] << "\t";
    }
    cout << endl;
    }
    cout << endl;
    //5. w(ij,i^): 企业i的工件j在企业i^的机器上加工的外包费用
    cout << "\n【Outsourcing cost 】" << endl;
    //初始化
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j < JobMax; j++) {
    for (int i2 = 0; i2 < Cmp; i2++) {
    w[i1][j][i2] = 0;
    }
    }
    }
    // 赋值
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j < Job[i1]; j++) {
    for (int i2 = 0; i2 < Cmp; i2++) {
    infile >> w[i1][j][i2];
    cout << w[i1][j][i2] << "\t";
    }
    cout << endl;
    }
    cout << endl;
    }

    //6. q_(i, m) : 企业i的机器im的单位加工能耗
    cout << "\n【Machine energy consumption】" << endl;
    // 初始化
    for (int i = 0; i < Cmp; i++) {
    for (int m = 0; m < MchMax; m++) {
    q[i][m] = 0;
    }
    }
    cout << endl;
    // 赋值
    for (int i = 0; i < Cmp; i++) {
    for (int m = 0; m < Mch[i]; m++) {
    infile >> q[i][m];
    cout << q[i][m] << "\t";
    }
    cout << endl;
    }
    cout << endl;
    //7. v_(i, m) : 企业i的机器im的加工速度
    cout << "\n【Machine speed】" << endl;
    // 初始化
    for (int i = 0; i < Cmp; i++) {
    for (int m = 0; m < MchMax; m++) {
    v[i][m] = 0;
    }
    }
    cout << endl;
    // 赋值
    for (int i = 0; i < Cmp; i++) {
    for (int m = 0; m < Mch[i]; m++) {
    infile >> v[i][m];
    cout << v[i][m] << "\t";
    }
    cout << endl;
    }
    cout << endl;
    //8. e_(i, m) : 企业i的机器im的单位时间碳排放量
    cout << "\n【Machine carbon emissionsn】" << endl;
    //初始化
    for (int i = 0; i < Cmp; i++) {
    for (int m = 0; m < MchMax; m++) {
    e[i][m] = 0;
    }
    }
    cout << endl;
    //赋值
    for (int i = 0; i < Cmp; i++) {
    for (int m = 0; m < Mch[i]; m++) {
    infile >> e[i][m];
    cout << e[i][m] << "\t";
    }
    cout << endl;
    }
    cout << endl;
    //9. P iji^m
    cout << "\n【Processing time on Mchs】" << endl;
    // 初始化
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j < JobMax; j++) {
    for (int i2 = 0; i2 < Cmp; i2++) {
    for (int m = 0; m < MchMax; m++) {
    Time[i1][j][i2][m] = 0;
    }
    }
    }
    }
    cout << endl;
    // 赋值 计算
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j < Job[i1]; j++) {
    for (int i2 = 0; i2 < Cmp; i2++) {
    for (int m = 0; m < Mch[i2]; m++) {
    Time[i1][j][i2][m] = p[i1][j] / v[i2][m];
    cout << Time[i1][j][i2][m] << "\t";
    }
    cout << endl;
    }
    cout << endl;
    }
    cout << endl;
    }
    cout << endl;

    getchar();

    infile.close();
    return;
    }



    int PQEBI()
    {
    IloEnv env;//环境设置
    IloModel model(env);//建模
    IloTimer timer(env);//loTimer表示 Concert Technology 模型中的计时器。它就像秒表一样工作。计时器报告 CPU 时间。在多线程环境中,我们将每个线程使用的 CPU 时间相加
    timer.start();
    try
    {
    // define decision variables
    //xijim, 0-1变量
    NumVarMatrix4d x(env, Cmp);
    for (int i1 = 0; i1 < Cmp; i1++) {
    x[i1] = NumVarMatrix3d(env, Job[i1]);
    for (int j = 0; j < Job[i1]; j++) {
    x[i1][j] = NumVarMatrix(env, Cmp);
    for (int i2 = 0; i2 < Cmp; i2++) {
    x[i1][j][i2] = IloNumVarArray(env, Mch[i2], 0, 1, ILOINT);
    }
    }
    }
    //Ci^m,机器的最大完工时间
    NumVarMatrix C(env, Cmp);
    for (int i2 = 0; i2 < Cmp; i2++) {
    C[i2] = IloNumVarArray(env, Mch[i2], 0, IloInfinity);
    }
    //Wij,工件的外包成本
    NumVarMatrix W(env, Cmp);
    for (int i1 = 0; i1 < Cmp; i1++) {
    W[i1] = IloNumVarArray(env, Job[i1], 0, IloInfinity);
    }

    IloNumVar Cmax(env);
    IloExpr sumW(env);
    //add the objective function into the model
    IloExpr obj(env);//Min EB =Min Cmax+W
    obj = Cmax + sumW;
    model.add(IloMinimize(env, obj));
    obj.end();
    sumW.clear();
    IloExpr sumT(env);
    //Constraint (1)
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j < Job[i1]; j++) {
    for (int i2 = 0; i2 < Cmp; i2++) {
    for (int m = 0; m < Mch[i2]; m++)sumT += x[i1][j][i2][m];
    model.add(sumT == 1);
    sumT.clear();
    }
    }
    }

    //Constraint (2)
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j < Job[i1]; j++) {
    for (int i2 = 0; i2 < Cmp; i2++) {
    for (int m = 0; m < Mch[i2]; m++) {
    sumT += x[i1][j][i2][m] * Time[i1][j][i2][m];
    model.add(sumT <= C[i2][m]);
    }
    sumT.clear();
    }
    }
    }
    //Constraint (3)
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j < Job[i1]; j++) {
    for (int i2 = 0; i2 < Cmp; i2++) {
    for (int m = 0; m < Mch[i2]; m++) {
    sumT += x[i1][j][i2][m] * w[i1][j][i2];
    model.add(sumT <= W[i1][j]);
    sumT.clear();
    }
    }
    }
    }
    //Constraint (6)
    for (int i2 = 0; i2 < Cmp; i2++) {
    for (int m = 0; m < Mch[i2]; m++) {
    model.add(Cmax >= C[i2][m]);
    }
    }
    //Constraint (7)
    for (int i1 = 0; i1 < Cmp; i1++) {
    for (int j = 0; j <Job[i1]; j++) {
    sumT += W[i1][j];
    model.add(sumT<= sumW);
    sumT.clear();
    sumW.clear();
    }
    }


    IloCplex cplex(model);

    cplex.exportModel("D:\\Modelec.lp");
    //选择优化器
    cplex.setParam(IloCplex::TiLim, myTiLim);
    cplex.setParam(IloCplex::ClockType, 1);
    cplex.setParam(IloCplex::Threads, 1);
    cplex.setParam(IloCplex::WorkMem, 256);
    cplex.setParam(IloCplex::NodeFileInd, 3);
    //cplex.setParam(IloCplex::EpGap,0.0);
    //cplex.setParam(IloCplex::ParallelMode, 1);
    cplex.setParam(IloCplex::WorkDir, "D:/BTWTEST/");


    cplex.solve();
    if (!cplex.solve()) {
    cout << "Cplex_solve error!" << endl;
    throw(-1);
    }
    UBcplex = cplex.getObjValue();
    LBcplex = cplex.getBestObjValue();
    resufile << "\n------Results------------" << endl;
    if (cplex.getStatus() == IloAlgorithm::Optimal)
    {
    EB = cplex.getObjValue();
    cout << "EBI:" << EB << "\t" << cplex.getObjValue() << endl;
    resufile << "\nEBI: " << EB << "\t";
    Gap = 0;
    }
    }
    catch (IloException& e) { cerr << " ERROR: " << e << endl; }
    catch (...) { cerr << " ERROR" << endl; }
    env.end();
    return 0;
    }
    int main() {
    int i;
    // double CPUtime;

    double avCon = 0, avVar = 0, avTEC = 0, avUBcplex = 0, avLBcplex = 0, avGap = 0, avtimeCP = 0, avnbInt = 0, avHorizon = 0;

    for (i = 0; i < numTest; i++)
    {
    Numth = i;
    if (!resufile) {
    cerr << "open result file error!";
    exit(-1);
    }
    resufile << "\n------------------------------The " << Numth + 1 << " th " << "text result------------------------------\n";
    initialize();

    //IloEnv env;

    PQEBI();
    resufile << "=========================================================================================================================" << endl;
    }
    resufile << "--------------------Final result-------------------" << endl;
    resufile << "avCon:\t" << "avVar:\t" << "TEC:\t" << "UBcplex:\t" << "LBcplex:\t" << "LB:\t" << "Gap:\t" << "CPUtime" << endl;
    resufile << "--------------------Final result-------------------" << endl;

    resufile << "=========================================================================================================================" << endl;

    resufile.close();
    return 0;
    }

    ------------------------------
    萌 程
    ------------------------------

    #DecisionOptimization


  • 2.  RE: 模型代码可以运行,但最后显示Cplex_solve error!,请问下那部分出现了问题,具体是什么问题

    Posted 08/30/22 05:36 AM
    Your model is infeasible: see "Bound infeasibility column 'x14' in the CPLEX log.
    So, there is an error in your model creation.

    ------------------------------
    Vincent Beraudier
    ------------------------------