GAMS & Python:如何在 运行 GamsJob 循环时重写输出 gdx 文件
GAMS & Python: how to rewrite output gdx file while run GamsJob in loop
在我的任务中,我需要 运行 具有不同参数值的相同 GAMS 模型 Python。为此,我创建了 GAMS 工作区、模型、作业和 GDX 数据库:
model = '''Variables
objective, {vars};
Parameters
{up_bounds}; {low_bounds};
$gdxin db
$load {load_values}
$gdxin
Equations
obj, {eqs_list};
obj .. objective =e= {obj_equation};
{nodes_eq};
{up_bounds_eq};
Model myLP /all/;
Solve myLP using lp minimizing objective;'''.format(load_values=' '.join(load_values), kwargs**)
ws = GamsWorkspace(working_directory='some_path')
db = ws.add_database('db')
load_values_p = [self.db.add_parameter(value, 0).add_record() for value in load_values]
job = ws.add_job_from_string(model)
for i in range(any_count):
update_parameters_values()
job.run(databases=self.db)
result.append([job.out_db[key][()].level for key in res_values_names])
其中:
load_values
- 变量名称列表,将从 'db.gdx' 加载。他们还在 model
;
的 Parameter
部分进行了初始化
update_parameters_values()
- 更改 load_values_p
值的函数(它也会自动更改 db
对象和 db.gdx 文件);
res_values_names
- 结果变量名称列表。
问题是 job
每次迭代都会生成新的 out_db GDX 文件,但我想重写现有文件并只读取更新后的结果值。怎么做?谢谢)
我在 GAMS 文档中找到了解决方案 - GamsModifier 可以解决我的问题。将其应用于我的任务和上面的代码:
model = '''Variables
objective, {vars};
Scalars
{up_bounds}; {low_bounds};
Equations
obj, {eqs_list};
obj .. objective =e= {obj_equation};
{nodes_eq};
{up_bounds_eq};
Model myLP /all/;'''.format(kwargs**)
ws = GamsWorkspace(working_directory='some_path')
cp = ws.add_checkpoint()
master_init_job = ws.add_job_from_string(model)
master_init_job.run(checkpoint=cp)
mi = cp.add_modelinstance()
load_values = [mi.sync_db.add_parameter(load_value, 0)
for load_value in load_values]
modifiers = [GamsModifier(load_value) for load_value in load_values]
mi.instantiate('myLP using lp minimizing objective', modifiers=modifiers)
for load_value in self.load_values:
load_value.add_record()
for i in range(any_count):
update_parameters_values()
mi.solve()
result.append([mi.sync_db.get_variable(key)[()].level
for key in res_values_names])
开始时,所有变量的值都与问题中列出的相似。
此实现避免了创建额外的文件并且工作速度更快。
在我的任务中,我需要 运行 具有不同参数值的相同 GAMS 模型 Python。为此,我创建了 GAMS 工作区、模型、作业和 GDX 数据库:
model = '''Variables
objective, {vars};
Parameters
{up_bounds}; {low_bounds};
$gdxin db
$load {load_values}
$gdxin
Equations
obj, {eqs_list};
obj .. objective =e= {obj_equation};
{nodes_eq};
{up_bounds_eq};
Model myLP /all/;
Solve myLP using lp minimizing objective;'''.format(load_values=' '.join(load_values), kwargs**)
ws = GamsWorkspace(working_directory='some_path')
db = ws.add_database('db')
load_values_p = [self.db.add_parameter(value, 0).add_record() for value in load_values]
job = ws.add_job_from_string(model)
for i in range(any_count):
update_parameters_values()
job.run(databases=self.db)
result.append([job.out_db[key][()].level for key in res_values_names])
其中:
load_values
- 变量名称列表,将从 'db.gdx' 加载。他们还在 model
;
的 Parameter
部分进行了初始化
update_parameters_values()
- 更改 load_values_p
值的函数(它也会自动更改 db
对象和 db.gdx 文件);
res_values_names
- 结果变量名称列表。
问题是 job
每次迭代都会生成新的 out_db GDX 文件,但我想重写现有文件并只读取更新后的结果值。怎么做?谢谢)
我在 GAMS 文档中找到了解决方案 - GamsModifier 可以解决我的问题。将其应用于我的任务和上面的代码:
model = '''Variables
objective, {vars};
Scalars
{up_bounds}; {low_bounds};
Equations
obj, {eqs_list};
obj .. objective =e= {obj_equation};
{nodes_eq};
{up_bounds_eq};
Model myLP /all/;'''.format(kwargs**)
ws = GamsWorkspace(working_directory='some_path')
cp = ws.add_checkpoint()
master_init_job = ws.add_job_from_string(model)
master_init_job.run(checkpoint=cp)
mi = cp.add_modelinstance()
load_values = [mi.sync_db.add_parameter(load_value, 0)
for load_value in load_values]
modifiers = [GamsModifier(load_value) for load_value in load_values]
mi.instantiate('myLP using lp minimizing objective', modifiers=modifiers)
for load_value in self.load_values:
load_value.add_record()
for i in range(any_count):
update_parameters_values()
mi.solve()
result.append([mi.sync_db.get_variable(key)[()].level
for key in res_values_names])
开始时,所有变量的值都与问题中列出的相似。 此实现避免了创建额外的文件并且工作速度更快。