如何在AMPL中实现决策变量

问题描述 投票:1回答:1

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

谢谢您的帮助!

math modeling ampl
1个回答
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提供了一些支持,但我对这些不太熟悉,所以我不确定他们是否提供了解决这个问题的替代解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.