цикл в GAMS для генерации сценария в Excel

У меня есть модель оптимизации, и я пытаюсь решить эту модель для разных входных файлов, которые я точно называю «решить модель при разных сценариях». По этой причине мне нужен цикл для чтения данных из Excel для каждого отдельного листа. Позвольте мне пояснить: например, на изображении ниже у нас есть данные с 4 сценариями, и имена листов увеличиваются одно за другим для каждого сценария.

screenshotЭти данные должны читаться в виде таблицы для каждого сценария, как в файле Excel.

Я пытаюсь зацикливать данные с разных листов Excel. Могу я сделать это в Gams?

В GAMS я мог бы взять данные из Excel, как показано ниже, но это только для одного сценария. Я хочу создать код GAMS, который считывает данные для всех сценариев из листов Excel в операторе цикла.

Table   n(t,b)
$call =xls2gms r="nonbooked!A2:I9" i="excelveri.xlsx" o="nbooked.inc"
$include nbooked.inc
;

person n.kavas    schedule 17.03.2017    source источник
comment
да, я посмотрел на этот пример, но он не работает, поэтому я не смог применить решение к моему вопросу :(   -  person n.kavas    schedule 21.03.2017


Ответы (1)


Утилита put_utility GAMS (https://www.gams.com/latest/docs/UG_Put.html#UG_Put_PutUtil) вместе с инструментом GDXXRW (https://www.gams.com/latest/docs/T_GDXXRW.html) является ключом к решению этой проблемы. Вот самодостаточный (и, надеюсь, не требующий пояснений) пример:

set i      / i1*i3 /
    j      / j1*j4 /
    sheets / Sheet1*Sheet3 /;

parameter data(i,j);
file fx; put fx;

* To make this example self contained, first prepare some data (using same mechanics as the reading)
loop(sheets,
* Create random data
  data(i,j) = uniformInt(0,9);
* Write data to GDX
  execute_unload 'data.gdx', data;
* Write GDX data to excel
  put_utility 'exec' / 'gdxxrw.exe data.gdx par=data rng=' sheets.tl:0 '!a1';
);

* Clear data to start fresh
data(i,j) = 0;

* Load data
loop(sheets,
* Write Excel data to GDX
  put_utility 'exec' / 'gdxxrw.exe data.xlsx par=data rng=' sheets.tl:0 '!a1';
* Load data from GDX
  execute_load 'data.gdx', data;
* Work with the data, just display as an example
  display data;
);

Я надеюсь, что это поможет, Латс

person Lutz    schedule 24.03.2017