是否可以在集合定义(GAMS)中使用标量



我求解了一个模型,得到了一个我称之为"sol"的答案我想设置"i",使i={1,…,sol}.

而不是更改。我写了下面的设置,但没有用。

换句话说,我需要根据sol的值来改变我的设置。

我的尝试:

scalar sol;
*after solving my model sol=objFun.val
set i /1*sol/;

有没有办法在集合防御中使用标量?

我可以提出两个选项,因为我不知道你打算将集合I用于什么:

  1. 我认为没有绝对必要拥有:

    set i /1*sol/;
    

    相反,有:

    set i /1*UB/;
    

    其中UB是一个值>>sol,然后定义i的动态集,比如j,这样:

    j(i) = no;
    j(i)$(ord(i) le sol) = yes;
    
  2. 如果您在不同的模型/求解中使用集合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文件。

这些只是我的想法。如果你被推到墙上却没有结果,那就值得一试。希望它们对你有用。

最新更新