CPLEX收益最大化

时间:2019-11-29 14:58:29

标签: java optimization cplex ilog

我正在cplex上进行项目开发,情况就是这样

  • 这是一家化工厂,生产和销售2种最终产品
  • 有3个反应堆,每个反应堆可执行一次不同的任务
  • 目标函数使总利润最大化
  • 解决方案显示了为此objF计算的值,还显示了每个反应器的激活顺序以及每个循环的利润

问题:现在我可以选择再增加一个反应堆(它可以是3个反应堆中的任何一个,每个都有不同的价格),或者根本不买一个。

目标仍然是不变的:最大化收益,而且我似乎无法将此决定纳入代码中,因此我可以获得最佳案例方案的结果,因为:

  • (可再生资源(反应物)的利润和成本)取决于生产的r和t时间
  • InitialStock也取决于反应堆的数量,因此它取决于运行多少反应堆的决定,而这取决于每种情况的最大收益
  • 这是我的第一个项目:S
// Data Declaration

int MaxTime = ...;
range Time = 0..MaxTime;
{int} Tasks = ...;
{string} nrenuableR=...;
{string} renuableR=...;
{string} renuableRusedbyT[Tasks]=...;
{string} Resources= nrenuableR union renuableR;
int procTime[Tasks]= ...;

int minbatchsize[renuableR][Tasks] =...;
int maxbatchsize [renuableR][Tasks] =...;

int MaxAmountStock_nR[nrenuableR]=...;
int maxRenuableR[renuableR][Time] =...;
int InitialStock[Resources]=...;

int Profit[nrenuableR]=...;
float nRcosts[nrenuableR]=...;

int MaxTheta = ...;
range Theta=0..MaxTheta;
float Mu[Tasks][Resources][Theta] = ...;
float Nu[Tasks][Resources][Theta] = ...;


//Decision Variables

dvar boolean N[Tasks][Time];
dvar float+ Csi[Tasks][Time];
dvar int+ R[Resources][Time];

//Objective Function

dexpr float ObjFunction = sum (r in nrenuableR)(R[r][MaxTime] - InitialStock[r])*(Profit[r] - nRcosts[r]); 

maximize ObjFunction;


//Contraints
subject to {


//Resources Capacity
forall (r in renuableR) forall(t in Time) R[r][t] <= maxRenuableR[r][t];
forall (r in nrenuableR) forall (t in Time) R[r][t] <= MaxAmountStock_nR[r];

//Batch Size + linking constraints
forall (k in Tasks, r in renuableRusedbyT[k], t in Time) minbatchsize[r][k] * N[k][t] <= Csi[k][t];
forall (k in Tasks, r in renuableRusedbyT[k], t in Time) maxbatchsize[r][k]*N[k][t] >= Csi[k][t];

//Resource Balance
forall(r in Resources) R[r][0] == InitialStock[r] + sum(k in Tasks) (Mu[k][r][0] * N[k][0] + Nu[k][r][0] * Csi[k][0]);
forall(r in Resources,t in Time: t>0) R[r][t] == R[r][t-1] + sum(k in Tasks,theta in Theta: t - theta >=0) (Mu[k][r][theta] * N[k][t - theta] + Nu[k][r][theta] * Csi[k][t - theta]);
 }

1 个答案:

答案 0 :(得分:0)

我不清楚您的决策变量的含义,因此无法给出详细的答案。

扩展模型的一般方法是:

  • 仅当使用相应的反应堆时,为每个反应堆创建一个新的决策变量IsUsed
  • 添加一个约束条件,说如果反应堆的IsUsed为0,则在该反应堆上执行的任务数为0。
  • 为每个反应堆添加术语IsUsed * Cost,以模拟为打开反应堆而固定的成本的模型。
  • 对于初始库存,您可以将每个反应堆的初始库存乘以IsUsed。如果不使用反应堆,则初始库存为0;如果不使用反应堆,则原始库存为。
相关问题