如何解决Julia JuMP运行报错type VariableIndex has no field head问题
问题原因
- 顺序错误:代码中
@NLconstraint(ALT, f1 <= y)写在了f1的@NLexpression定义之前,Juniper解析约束时f1还未被注册为合法非线性表达式,被识别为无效变量引用,触发类型字段不存在报错。 - 括号缺失:
k6和FF表达式中exp(-landa*h)/1-exp(-landa*h)存在运算优先级错误,你实际需要的是exp(-landa*h)/(1-exp(-landa*h)),漏了分母的括号会导致后续计算结果完全不符合预期。
修复方案
调整代码顺序,补全缺失的括号即可,修正后完整代码如下:
using JuMP,CPUTime, Distributions, Ipopt,Juniper,Gurobi #-----Model parameters-------------------------------------------------------- sig, C1, c0 = 2, 300, 10; E, landa, T0, T1, T2, gam1, gam2, a1, a2, a3, ap = 0.05, 0.01, 0, 2, 2, 1, 1, 0.5, 0.1, 50, 25; f(x) = cdf(Normal(0, 1), x); #--------------------------------------------------------------------------- ALT= Model(optimizer_with_attributes(Juniper.Optimizer, "nl_solver"=>optimizer_with_attributes(Ipopt.Optimizer, "print_level" => 0), "mip_solver"=>optimizer_with_attributes(Gurobi.Optimizer, "logLevel" => 0),"registered_functions" =>[Juniper.register( :f, 1, f; autodiff = true)]) ); # variables----------------------------------------------------------------- JuMP.register(ALT, :f, 1, f; autodiff = true); @variable(ALT, 0.001 <= h <= 40); @variable(ALT, 0.000001 <= L <= 4); @variable(ALT, 2 <= n <= 30, Int); @variable(ALT, y); #--------------------------------------------------------------------------- @NLexpression(ALT,k1,h/(1-f(L-sig*sqrt(n))+f(-L - sig*sqrt(n)))); # HARL1 @NLexpression(ALT,k2,(1-(1+landa*h)*exp(-landa*h))/(landa*(1-exp(-landa*h)))); #to @NLexpression(ALT,k3,E*n+T1*gam1+T2*gam2); @NLexpression(ALT,k4,1/landa+h/(1-f(L-sig*sqrt(n))+f(-L-sig*sqrt(n)))); @NLexpression(ALT,k5,-(1-(1+landa*h)*exp(-landa*h))/(landa*(1-exp(-landa*h)))+E*n+T1*gam1+T2*gam2); # 补全了分母的括号 @NLexpression(ALT,k6,(exp(-landa*h)/(1-exp(-landa*h)))*(a3/(2*f(-L)))+ap); #SF/ARL0+W F=a3 ap=W @NLexpression(ALT,k7,1-f(L-sig*sqrt(n))+f(-L-sig*sqrt(n))); @NLexpression(ALT,F,c0/landa+C1*(k1-k2+k3)+((a1+a2*n)/h)*(k4+k5+k3)+k6); # 补全了分母的括号 @NLexpression(ALT,FF,k4-k2+E*n+T1+T2+(1-gam1)*((exp(-landa*h)/(1-exp(-landa*h))*T0)/(2*f(-L)))); #ST0/ARL0 # 把f1、f2的定义移到约束之前 f1=@NLexpression(ALT,F/FF); f2=@NLexpression(ALT,1/k7); #constraints-------------------------------------------------------- @NLconstraint(ALT, f(-L) <= 1/400); @NLconstraint(ALT, f1 <=y); #objectivefunction--------------------------------------------------------- #------------------------------------------------------------------------- @NLobjective(ALT,Min,y); optimize!(ALT); #-------------------------------------------------------------------------- f1min=JuMP.value(y); LL=JuMP.value(L); nn=JuMP.value(n); hh=JuMP.value(h);
修改后运行即可正常求解,不会再触发该报错。
内容的提问来源于stack exchange,提问作者Soma
相关产品推荐
相关产品推荐

