2016-11-03 4 views
0

Je suis novice en programmation GLPK et linéaire. J'essaye de produire des données dans un fichier .csv et il est en train de le sortir dans le fichier mais il ne sépare pas les données avec une virgule.Formater les fichiers csv de sortie dans Glpk

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; 

Voici le premier problème: Je voudrais enregistrer dans .csv STH comme 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; 

Deuxième: au lieu de "< = 10 "dans la 1ère contrainte, je voudrais avoir des valeurs différentes, par exemple 0,10,20,30,40,50 et exécuter ce sujet de code pour ces valeurs et enregistrer les valeurs dans le fichier" out.csv ". Dans ce cas précis, j'aurais dans les lignes out.csv 6 et les valeurs séparées par une virgule. Je ne peux pas mettre la fonction objectif et les contraintes dans un "pour", par exemple. Alors, des idées?

Merci beaucoup d'avance.

Répondre

0

Votre premier problème est résolu simplement avec la bonne syntaxe. Utilisez un & insted de , pour fusionner vos sorties:

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

s'il vous plaît l'esprit que votre boucle aussi mettre une virgule à la fin de la ligne! Pour que vos paramètres changent et glpk résolvent le modèle, vous devez construire un script en dehors de mathprog, ce qui change votre valeur pour "10". Veuillez jeter un coup d'oeil dans le GLPK Wiki pour avoir un premier aperçu des différents langages/possibilités de script - Le concept principal est de réécrire la valeur du paramètre dans le fichier de données, puis de relancer glpsol.