Форматирование выходных CSV-файлов в Glpk
Я новичок в GLPK и линейном программировании. Я пытаюсь вывести некоторые данные в файл.csv, и он выводит их в файл, но не разделяет данные запятой.
set I; /*equipments */
set J; /* maintenance plans */
param cost{I}; /* failure cost for equip i in I */
param maint{J};
param prob{I, J}; /* failure probab i in I under j in J */
param filename, symbolic := "out.csv";
var x{I, J} binary; /* 1 if include maintenance plan, 0 otherwise */
minimize MainCost: sum{i in I} sum{j in J} prob[i,j]*cost[i]*x[i,j];
s.t. MaintCost{j in I}: sum{(i,j) in {I, J}}(maint[j]*x[i,j]) <= 10;
s.t. Unit {i in I}: sum{j in J} x[i,j] = 1;
solve;
printf {(i,j) in {I, J}: x[i,j] = 1}
j,"," >> filename;
Вот первая проблема: я хотел бы сохранить в.csv sth как 1,3,2,1,...,1
data;
param: I: cost:=
1 5
2 10
3 9
4 3
5 6
6 5
7 7
8 6
9 10
10 6;
param: J: maint:=
1 0
2 1
3 2 ;
param prob
: 1 2 3 :=
1 0.71349520313981 0.608394373323201 0.46473857148101
2 0.604843473690396 0.494158592651351 0.35715264359696
3 0.640260888759684 0.532400290182621 0.394600541097475
4 0.71349520313981 0.608394373323201 0.46473857148101
5 0.500170157438303 0.383902444963231 0.256863101331242
6 0.696759243580332 0.582579242310187 0.433239819885668
7 0.604843473690396 0.494158592651351 0.35715264359696
8 0.660549568442532 0.553447396825782 0.414065533311644
9 0.612144282180733 0.502294490808246 0.365501585646775
10 0.71349520313981 0.608394373323201 0.46473857148101 ;
end;
Второе: вместо "<=10" в 1-м ограничении я хотел бы иметь другие значения, например 0,10,20,30,40,50, и запустить этот код для этих значений и сохранить значения в "out.csv"файл. В этом конкретном случае в out.csv было бы 6 строк и значения, разделенные запятой. Я не могу поставить функцию цели и ограничения внутри "для", например. Итак, идеи?
Заранее большое спасибо.
3 ответа
Ты можешь использовать table OUT "CSV"
, такие как:
table tbl{(i,j) in {I, J}: x[i,j] = 1} OUT "CSV" "filename.csv": j;
Это общее утверждение работает для меня, хотя я не проверял его с вашей проблемой и вашей фильтрацией на x
, См. Раздел 4.11 в разделе "Оператор таблицы", стр. 42 Справочного документа по языку моделирования GNU MathProg, включенного в дистрибутив.
Я согласен с @Paul G. по второй проблеме.
Ваша первая проблема решена только с правильным синтаксисом. Использовать &
поставленный ,
объединить ваши выводы:
printf {(i,j) in {I, J}: x[i,j] = 1}
j & "," >> filename;
printf "\n" >> filename;
пожалуйста, обратите внимание, что ваш цикл также поставит запятую в конце строки!
Чтобы ваш параметр переключился и glpk снова решил модель, вы должны создать скрипт вне mathprog, который изменяет ваше значение для "10"
, Пожалуйста, загляните в GLPK Wiki, чтобы получить первый обзор различных скриптовых языков / возможностей. Основная идея - переписать значение параметра в файле данных, а затем перезапустить glpsol.
Я новичок в GLPK и линейном программировании. Я пытаюсь вывести некоторые данные в файл.csv, и он выводит их в файл, но не разделяет данные запятой.
glpsol может решить только одну смешанную линейную задачу за вызов. Но вы можете использовать скрипт для решения задачи для разных значений параметров.
Пожалуйста, прочитайте https://en.wikibooks.org/wiki/GLPK/Scripting_plus_MathProg