首页 > 解决方案 > 如何在 CPLEX 中运行模拟实验(迭代过程)?

问题描述

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

在此处输入图像描述

//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(也提供了后续阶段的结果)。”

附表如下。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

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

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

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

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

问候,

标签: optimizationconstraintscplexmixed-integer-programminginteger-programming

解决方案


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

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

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


推荐阅读