2016-11-03 2 views
0

Ich bin ein Anfänger in GLPK und lineare Programmierung. Ich versuche, einige Daten in eine CSV-Datei auszugeben, und es gibt es in der Datei aus, aber es trennt die Daten nicht mit Komma. HierAusgabe von CSV-Dateien in 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; 

ist das erste Problem: Ich möchte in .csv etw wie 1,3,2,1 speichern, ..., 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; 

Zweitens: statt "< = 10 "In der ersten Einschränkung möchte ich andere Werte haben, zB 0,10,20,30,40,50 und diesen Code-Betreff für diese Werte ausführen und die Werte in der" out.csv "-Datei speichern. In diesem speziellen Fall hätte ich in den out.csv 6 Zeilen und die Werte mit Komma getrennt. Ich kann das Funktionsziel und die Einschränkungen nicht in ein "für" setzen, z. Also, Ideen?

Vielen Dank im Voraus.

Antwort

0

Ihr erstes Problem ist nur mit der richtigen Syntax gelöst. Verwenden Sie ein & von , insted Ihre Ausgaben zu fusionieren:

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

Bitte beachten Sie, dass Ihre Schleife auch ein Komma am Ende der Zeile gestellt wird!

Um Ihren Parameter zu ändern und das Modell erneut zu lösen, müssen Sie ein Skript außerhalb von matprog erstellen, das Ihren Wert für "10" ändert. Bitte werfen Sie einen Blick in die GLPK Wiki, um einen ersten Überblick über die verschiedenen Skriptsprachen/Möglichkeiten zu erhalten - Das Hauptkonzept besteht darin, den Parameterwert in der Datendatei neu zu schreiben und dann glpsol erneut auszuführen.