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

时间:2018-12-06 11:43:52

标签: gams-math

我解决了一个模型并得到了一个我称之为“ sol”的答案 我想将'i'设置为i = {1,...,sol}。

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

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

我的尝试:

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

有什么方法可以在定防御中使用标量?

1 个答案:

答案 0 :(得分:3)

我可以提出两个选择,因为我不知道您打算将集合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 = 12345423.234486754,则实际上是新集合的定义。
    “ sol”是目标函数变量。如果sol是标量,则按定义将目标函数值分配给,请删除'.l'。
    “ 14”是指您在使用put实用程序时必须预先为其指定“ sol”的位数。
    '4'是'sol'的小数位数。

    进一步的参考:https://www.gams.com/latest/docs/UG_Put.html

    在新的.gms文件中,包括“ new_set.txt”,在原始文件中,使用“ execute”命令调用gams.exe来解决新的.gms文件。

这些只是我的想法。值得一试,如果您被推到墙上没有结果。希望他们为您工作。