运行Gekko优化求解器时出现路径错误
问题现象
运行Gekko优化代码时出现路径错误,修改m.options.SOLVER参数(1/2/3)后问题依旧,核心错误为临时目录下找不到options.json和results.json文件。
错误详情
Traceback (most recent call last):
File "C:\Users\17576\Documents\Python\Scratch.py", line 33, in
m.solve()
File "C:\Users\17576\Documents\Python\venv\lib\site-packages\gekko\gekko.py", line 2227, in solve
self.load_JSON()
File "C:\Users\17576\Documents\Python\venv\lib\site-packages\gekko\gk_post_solve.py", line 13, in load_JSON
f = open(os.path.join(self._path,'options.json'))
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\17576\AppData\Local\Temp\tmpp6w85mm5gk_model0\options.json'Error: The system cannot find the path specified.
Error: 'results.json' not found. Check above for additional error details
Process finished with exit code 1
相关代码
from gekko import GEKKO # Variables var_a = 155.31 var_b = 6.27 var_c = 12 var_d = 750 var_e = 10 var_f = 1 var_d_lower_bound_percentage = .99 var_e_lower_bound_percentage = .99 var_e_upper_bound_percentage = 1.01 x_value = 1 y_value = 3 # Optimization m = GEKKO(remote=False) x = m.Var(value=x_value, lb=0) y = m.Var(value=y_value, lb=0, integer=True) m.Equation(x*var_a + y*var_b <= var_d) m.Equation(x*var_a + y*var_b >= var_d*var_d_lower_bound_percentage) m.Equation(((x*var_a)/(x*var_a + y*var_b)) + ((y*var_b)/(x*var_a + y*var_b)) == 1) m.Equation(((x*var_a)/(x*var_a + y*var_b))*var_f + ((y*var_b)/(x*var_a + y*var_b))*var_c <= var_e*var_e_upper_bound_percentage) m.Equation(((x*var_a)/(x*var_a + y*var_b))*var_f + ((y*var_b)/(x*var_a + y*var_b))*var_c >= var_e*var_e_lower_bound_percentage) m.Obj(((x*var_a)/(x*var_a + y*var_b))*var_f + ((y*var_b)/(x*var_a + y*var_b))*var_c) m.options.SOLVER = 1 m.solve() print(x.value) print(y.value)
解决方案
1. 重装Gekko确保求解器完整
本地模式依赖内置求解器,若安装不完整会导致临时文件生成失败:
pip uninstall gekko -y pip install gekko --no-cache-dir
2. 手动指定可读写的工作目录
临时目录权限受限会导致文件无法生成,手动设置本地目录:
# 替换为你有权限的本地路径 m = GEKKO(remote=False, path='./gekko_workdir')
3. 删除冗余方程
原代码中存在恒成立的冗余方程,会增加求解负担甚至触发异常:
# 删除此行: # m.Equation(((x*var_a)/(x*var_a + y*var_b)) + ((y*var_b)/(x*var_a + y*var_b)) == 1)
4. 避免分母为零
给分式分母添加最小值约束,防止求解器出现数值异常:
m.Equation(x*var_a + y*var_b >= 1e-6)
5. 检查权限
以管理员身份运行Python脚本,确保对临时目录(C:\Users\17576\AppData\Local\Temp)有读写权限。
修正后的代码示例
from gekko import GEKKO # Variables var_a = 155.31 var_b = 6.27 var_c = 12 var_d = 750 var_e = 10 var_f = 1 var_d_lower_bound_percentage = .99 var_e_lower_bound_percentage = .99 var_e_upper_bound_percentage = 1.01 x_value = 1 y_value = 3 # Optimization - 指定工作目录 m = GEKKO(remote=False, path='./gekko_work') x = m.Var(value=x_value, lb=0) y = m.Var(value=y_value, lb=0, integer=True) # 资源约束 m.Equation(x*var_a + y*var_b <= var_d) m.Equation(x*var_a + y*var_b >= var_d*var_d_lower_bound_percentage) # 确保分母不为零 m.Equation(x*var_a + y*var_b >= 1e-6) # 定义加权平均变量简化代码 weighted_avg = ((x*var_a)/(x*var_a + y*var_b))*var_f + ((y*var_b)/(x*var_a + y*var_b))*var_c m.Equation(weighted_avg <= var_e*var_e_upper_bound_percentage) m.Equation(weighted_avg >= var_e*var_e_lower_bound_percentage) # 目标函数 m.Obj(weighted_avg) m.options.SOLVER = 1 m.solve(disp=True) # 开启disp查看求解器详细输出 print(f"x值: {x.value[0]}") print(f"y值: {y.value[0]}")
内容的提问来源于stack exchange,提问作者JackW24

