【问题标题】:AMPL - param that maps from set to setAMPL - 从集合映射到集合的参数
【发布时间】:2018-09-21 14:25:18
【问题描述】:

我是 AMPL 的新手,我想创建一个从集合 A 映射到集合 B 的 param C:

file.mod:

set A;
set B;
param C{i in A} =
    if i == "AA"
    then
        BA
    else if i == "AB"
    then
        BB
    else if i == "AC"
    then
        BC
    else
        BA;

data file.dat;

文件.dat:

data;

set A := AA, AB, AC;
set B := BA, BB, BC;

当我尝试编译这段代码时,我得到了BA is not defined。如果我用字符串替换集合元素(BA 变为 "BA"),则会出现错误“无法将字符串转换为数字。”。 有没有办法实现我想做的事情?

【问题讨论】:

  • 我对 AMPL 了解不多,但我可以告诉你 BA is not defined 错误是错误的修复。您应该在 BA、BB 和 BC 周围加上“”。您需要将它们转换为字符串的原因是数组中的其他值必须是相同的对象类型。我不明白您为什么会看到 Cannot convert character string to a number,希望其他人能提供帮助。
  • 我尝试将" " 放在 BA、BB 和 BC 周围,但我仍然收到 Cannot convert character string to a number. context: "BA" >>> ; <<< 错误。
  • data test.dat; 是做什么的?有没有办法在else BA; 之后打印 C?
  • 我弄错了:test.dat 实际上是file.dat。我试图将display C; 放在C 的声明之后,但在到达此指令之前引发了错误。
  • 据我所知,param 相当于 python 中的 dictionary(或 Java 中的 HashMap)。在这里,我将C 定义为键集为A 的字典。但是,我不知道是否有可能在 AMPL 中有一个不是整数或实数的值集。

标签: ampl


【解决方案1】:

AMPL 中的参数默认为数字。如果要设置字符串参数,则必须将其声明为符号。 (是的,你需要这些值的引号。)

这似乎是你想要的:

set A;
set B;
param C{i in A} in B symbolic =
    if i == "AA"
    then
        "BA"
    else if i == "AB"
    then
        "BB"
    else if i == "AC"
    then
        "BC"
    else
        "BA";

 data;

 set A := AA, AB, AC;
 set B := BA, BB, BC;

有关符号参数的更多信息,请参阅section 7.8 of the AMPL Book

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多