我求解了一个模型,得到了一个我称之为"sol"的答案我想设置"i",使i={1,…,sol}.
而不是更改。我写了下面的设置,但没有用。
换句话说,我需要根据sol的值来改变我的设置。
我的尝试:
scalar sol;
*after solving my model sol=objFun.val
set i /1*sol/;
有没有办法在集合防御中使用标量?
我可以提出两个选项,因为我不知道你打算将集合I用于什么:
-
我认为没有绝对必要拥有:
set i /1*sol/;
相反,有:
set i /1*UB/;
其中UB是一个值>>sol,然后定义i的动态集,比如j,这样:
j(i) = no; j(i)$(ord(i) le sol) = yes;
-
如果您在不同的模型/求解中使用集合i,请在不同的.gms文件中写出新模型/求解,并使用put命令在文本文件中根据sol写出新集合:
put new_set /'new_set.txt'/; put new_set; put 'set j /1*' sol.l:14:4 '/' /;
@Richard这会创建一个名为"new_set.txt"的新文件,然后写下确切的单词:
"set j /1* 12345423.2345/;"
如果sol.l=1234423.234486754,这实际上是一个新集合的定义
"ol"是目标函数变量。如果sol是一个标量,您按照定义将目标函数值分配给它,请删除".l"。
"14"是指在使用put实用程序时预先分配给"sol"的位数,它必须在手动之前定义
'4'是'sol'的小数位数。供进一步参考:https://www.gams.com/latest/docs/UG_Put.html
在新的.gms文件中,包括"new_set.txt",并在原始文件中使用"execute"命令调用gams.exe来解决新的.gmes文件。
这些只是我的想法。如果你被推到墙上却没有结果,那就值得一试。希望它们对你有用。