首页 > 解决方案 > 是否可以在集合定义(GAMS)中使用标量?

问题描述

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

而不是改变 . 我写了如下设置,但它没有用。

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

我的尝试:

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

有没有办法在集合定义中使用标量?

标签: gams-math

解决方案


我可以提出两个选项,因为我不知道您打算使用 set 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

    在您的新 .g​​ms 文件中,包括“new_set.txt”,并在原始文件中使用“执行”命令调用 gams.exe 来解决新的 .gms 文件。

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


推荐阅读