如何在AMPL中实现决策变量

时间:2019-04-21 02:14:46

标签: math modeling ampl

我有一个公式,我不知道如何在AMPL for CPLEX中实现它。 就这个: enter image description here

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用线性求解器(如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

其原因是这些求解器通常对“整数”变量具有较小的容差。因此,它接受x=1e-10作为“足够接近”到整数的解决方案。自c1起,它满足x*bignum >= 1,但随后将x舍入为零。如果您不希望这样做,可能会造成混淆!因此,根据bignum的最大可能值,找出可以完成工作的z_v的最小值,然后仔细检查结果。您可能需要修改公差参数。

AMPL确实也为logical constraints with CPLEX提供了一些支持,但是我对它们不那么熟悉,所以我不确定他们是否可以为该问题提供替代解决方案。