如何在 AMPL 中实现决策变量
How to implement decision variable in AMPL
我有一个方程式,但我不知道如何在 CPLEX 的 AMPL 中实现它。
就这个:
enter image description here
感谢您的帮助!
使用线性求解器(如 CPLEX),通常的方法是将其转换为线性约束,并使用二进制变量指示两种情况中的哪一种适用。
param eps;
param beta;
param bignum = 1e5;
var z_s_1 binary;
# will have value 0 when z_v <= eps, else 1
var z_s = z_s_1*beta;
var z_v >= 0;
s.t. Define_z_s_1_a: z_s_1 * eps <= z_v;
# so if z_v < eps then z_s_1 must be 0 and hence z_s = 0
s.t. Define_z_s_1_b: z_s_1 * bignum >= z_v - eps;
# so if z_v > eps, then z_s_1 must be > 0 so must be 1,
# and hence z_s = beta.
几个注意事项:
如果你想在数学上精确,当 z_v
正好等于 eps 时,z_s_1
可以取任何一个值,因此 z_s
可以是 0 或 beta
.但考虑到计算机算法的局限性,我们通常不需要为严格与非严格的不等式失眠。
这将阻止 z_v > bignum+eps
的解决方案,因此 bignum
需要足够大以允许 z_v
的合理值。但是,如果它太大,则可能 运行 出现机器算术问题。例如,请考虑以下示例:
option solver cplex;
param bignum = 1e6;
var x binary;
minimize of: x;
s.t. c1: bignum*x >= 1;
solve;
display x;
手工计算,因为x
是二元的,bignum*x
>=1,我们可以看到x
一定是1。然而,运行宁这个通过 AMPL/CPLEX,我反而得到了解决方案 x=0
,即使这违反了 c1
.
原因是这些求解器通常对 "integer" 变量允许较小的容差。因此,它接受 x=1e-10
作为 "close enough" 的整数解。自 x*bignum >= 1
以来满足 c1
,但随后将 x
舍入为零。如果您没有预料到,这可能会造成混淆!因此,根据 z_v
的最大可能值,找出可以完成工作的 bignum
的最小值,并仔细检查结果。您可能需要修改公差参数。
AMPL 也为 logical constraints with CPLEX 提供了一些支持,但我对这些不太熟悉,所以我不确定他们是否提供了解决此问题的替代方案。
我有一个方程式,但我不知道如何在 CPLEX 的 AMPL 中实现它。 就这个: enter image description here
感谢您的帮助!
使用线性求解器(如 CPLEX),通常的方法是将其转换为线性约束,并使用二进制变量指示两种情况中的哪一种适用。
param eps;
param beta;
param bignum = 1e5;
var z_s_1 binary;
# will have value 0 when z_v <= eps, else 1
var z_s = z_s_1*beta;
var z_v >= 0;
s.t. Define_z_s_1_a: z_s_1 * eps <= z_v;
# so if z_v < eps then z_s_1 must be 0 and hence z_s = 0
s.t. Define_z_s_1_b: z_s_1 * bignum >= z_v - eps;
# so if z_v > eps, then z_s_1 must be > 0 so must be 1,
# and hence z_s = beta.
几个注意事项:
如果你想在数学上精确,当 z_v
正好等于 eps 时,z_s_1
可以取任何一个值,因此 z_s
可以是 0 或 beta
.但考虑到计算机算法的局限性,我们通常不需要为严格与非严格的不等式失眠。
这将阻止 z_v > bignum+eps
的解决方案,因此 bignum
需要足够大以允许 z_v
的合理值。但是,如果它太大,则可能 运行 出现机器算术问题。例如,请考虑以下示例:
option solver cplex;
param bignum = 1e6;
var x binary;
minimize of: x;
s.t. c1: bignum*x >= 1;
solve;
display x;
手工计算,因为x
是二元的,bignum*x
>=1,我们可以看到x
一定是1。然而,运行宁这个通过 AMPL/CPLEX,我反而得到了解决方案 x=0
,即使这违反了 c1
.
原因是这些求解器通常对 "integer" 变量允许较小的容差。因此,它接受 x=1e-10
作为 "close enough" 的整数解。自 x*bignum >= 1
以来满足 c1
,但随后将 x
舍入为零。如果您没有预料到,这可能会造成混淆!因此,根据 z_v
的最大可能值,找出可以完成工作的 bignum
的最小值,并仔细检查结果。您可能需要修改公差参数。
AMPL 也为 logical constraints with CPLEX 提供了一些支持,但我对这些不太熟悉,所以我不确定他们是否提供了解决此问题的替代方案。