Форматирование выходных файлов 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 строк и значения, разделенные запятой. Я не могу поместить цель функции и ограничения внутри «для», например. Итак, идеи?

Заранее большое спасибо.


person Marcos Alves    schedule 03.11.2016    source источник


Ответы (3)


Ваша первая проблема решается только с правильным синтаксисом. Используйте & вместо , для объединения выходных данных:

printf {(i,j) in {I, J}: x[i,j] = 1}
j & "," >> filename;
printf "\n" >> filename;

обратите внимание, что ваш цикл также будет ставить запятую в конце строки!

Чтобы заставить ваш параметр переключаться и glpk снова решать модель, вам нужно создать скрипт вне mathprog, который изменит ваше значение для "10". Ознакомьтесь с GLPK Wiki, чтобы получить первый обзор различных языки сценариев/возможности. Основная идея состоит в том, чтобы переписать значение параметра в файле данных, а затем повторно запустить glpsol.

person Paul G.    schedule 08.11.2016

Я новичок в GLPK и линейном программировании. Я пытаюсь вывести некоторые данные в файл .csv, и он выводит их в файл, но не разделяет данные запятой.

glpsol может решить только одну смешанную линейную задачу за вызов. Но вы можете использовать скрипт решения задачи для разных значений параметров.

Пожалуйста, прочитайте https://en.wikibooks.org/wiki/GLPK/Scripting_plus_MathProg#Parametric_studies_and_MathProg

person Xypron    schedule 13.07.2018

Вы можете использовать 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. по второй проблеме.

person miguelmorin    schedule 12.07.2018
comment
Нет необходимости переименовывать столбец j в j. - person Xypron; 13.07.2018