#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