1

我是 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 中,例如 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”,我想要不同的值,例如 0,10,20,30,40,50 并为这些值运行此代码主题并将值保存在“ out.csv”文件。在这种特定情况下,我将在 out.csv 中有 6 行,并且值用逗号分隔。例如,我不能将函数目标和约束放在“for”中。那么,想法?

提前非常感谢。

4

3 回答 3

1

您的第一个问题只需使用正确的语法即可解决。使用&insted of,合并您的输出:

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

请注意,您的循环也会在行尾添加一个逗号!

要使您的参数切换和 glpk 再次求解模型,您必须在 mathprog 之外构建一个脚本,这会更改您的"10". 请查看GLPK Wiki以初步了解不同的脚本语言/可能性 - 主要概念是重写数据文件中的参数值,然后重新运行 glpsol。

于 2016-11-08T17:21:16.387 回答
1

您可以使用table OUT "CSV",例如:

table tbl{(i,j) in {I, J}: x[i,j] = 1} OUT "CSV" "filename.csv": j;

这个一般性陈述对我有用,虽然我没有用你的问题和你的过滤来测试它x。请参阅分发中包含的建模语言 GNU MathProg 语言参考的第 42 页“表语句”第 4.11 节。

对于第二个问题,我同意@Paul G.。

于 2018-07-12T11:05:47.970 回答
0

我是 GLPK 和线性规划的新手。我正在尝试将一些数据输出到 .csv 文件并将其输出到文件,但它没有用逗号分隔数据。

glpsol 每次调用只能解决一个混合线性问题。但是您可以使用脚本来解决不同参数值的问题。

请阅读https://en.wikibooks.org/wiki/GLPK/Scripting_plus_MathProg#Parametric_studies_and_MathProg

于 2018-07-13T17:38:56.117 回答