如何在 CPLEX 中运行模拟实验迭代过程?

问题描述

我是编程初学者。我正在尝试练习使用 CPLEX 运行模拟。 因为我想成为一个想在优化领域工作的人。 因此,我正在尝试自己研究一些来自不同领域的期刊。 附加的图像是目标函数和约束。 我编写了下面写的代码。我不确定我做对了还是做错了。

enter image description here

//Data
{string} product = ...;
{string} interval = ...;
// Limit
float low[interval] = ...;
float upper[interval] = ...;
// Maximum demand
float A[product] = ...;
// Slope of demand function
float varphi[product][interval] = ...;
// Price
float p[product] = ...;
// Setup cost
float f[product] = ...;
// Inventory holding cost rate
float h[product][interval] = ...;
// Variable cost rate
float v[product][interval] = ...;
// Variables
dvar float+ X[product][interval];    enter code here
dvar float+ D[product][interval];
dvar float+ a[interval];
dvar float+ beta[product][interval];

// Objective
maximize sum(i in product,j in interval) p[i]*X[i][j]-f[i]*beta[i][j]-v[i][j]*X[i][j]-0.5*h[i][j]*X[i][j] - F;

// Constraint
subject to{
  forall(j in interval) sum(j in interval) a[j] == 1;
  forall(i in product,j in interval) beta[i][j] <= a[j];
  forall(i in product,j in interval) sum(i in product,j in interval) X[i][j] <= C;
  forall(i in product,j in interval) X[j][i] <= D[i][j]*beta[i][j];
  forall(j in interval) sum(i in product) beta[i][j] <= upper[j]*a[j];
  forall(j in interval) sum(i in product) beta[i][j] >= low[j]*a[j];
  forall(i in product,j in interval) D[i][j] = (A[i]-varphi[i][j]*p[i])*a[j];
}

我想演示如何应用迭代程序来逐步缩小搜索间隔,以精确确定要生产的最佳产品数量,从而实现利润最大化。 该期刊解释说:“这些较小区间的成本和收入数据作为新输入提供给模型,然后在后续迭代中将这些新区间中的一个确定为最佳。该过程在连续迭代中重复,直到最后一个区间只有一到两个级别(即产品数量),模型可以从中做出最终产品种类的选择。为了在连续迭代的边际收益很小的情况下节省时间,如果差异很大,我们也终止该过程连续迭代的目标函数值(利润)之间的值低于一个小的预定收敛参数。该模型确定最终区间的哪个级别是最佳的,并确定要生产哪些特定产品以及生产多少。

此流程的第一阶段从 100 种产品(如前)和涉及价格结构 3 和成本结构 3 的配置开始(请参见表 2-5)。产品品种范围分为四个区间,区间边界如表1所示。这一阶段的结果是选择第三个区间为最优,确定了75个产品及其对应的最优生产数量。数据见表9,结果见表12、表13(也提供了后续阶段的结果)。"

表格附在下面。

enter image description here

enter image description here

enter image description here

enter image description here

产品总数为 100。 我还没有决定其他参数的值。

我想知道的是如何运行下面的迭代过程?

当我运行 CPLEX 时,代码中的目标函数一直提示错误

感谢您的友好回答,您是最棒的。

问候,

解决方法

forall(j in interval) sum(j in interval) a[j] == 1;

看起来很糟糕,因为你用了两次 j !

对于错误,您应该共享 dat 文件,以便其他用户可以尝试