如何在表中读取取决于先前定义的两组

时间:2018-07-08 11:54:23

标签: linear-programming glpk

我正在根据激光切割机所需的表面来优化字母的选择,以最大程度地形成可以形成的单词的总频率。我为GLPK编写了此程序:

set unicodes;
param surfaces{u in unicodes};
table data IN "CSV" "surfaces.csv": unicodes <- [u], surfaces~s;

set words;
param frequency{w in words}, integer;
table data IN "CSV" "words.csv": words <- [word], frequency~frequency;

然后,我想提供一个表格,为每个单词提供每个字符及其unicode的计数。集wordsunicodes已经定义。根据手册第42页,我可以省略集合和定界符:

  

table name alias IN driver arg . . . arg : set <- [fld, ..., fld], par~fld, ..., par~fld;

     

...

     

set是称为控制集的可选简单集的名称。它可以与   分隔符<-;

所以我这样写:

param spectrum{w in words, u in unicodes} >= 0;
table data IN "CSV" "spectrum.csv": words~word, unicodes~unicode, spectrum~spectrum;

我得到了错误:

Reading model section from lp...
lp:19: delimiter <- missing where expected
Context: ..., u in unicodes } >= 0 ; table data IN '...' '...' : words ~

如果我写:

table data IN "CSV" "spectrum.csv": [words, unicodes] <- [word, unicode], spectrum~spectrum;

我得到了错误:

Reading model section from lp...
lp:19: syntax error in table statement
Context: ...} >= 0 ; table data IN '...' '...' : [ words , unicodes ] <-

如何读入已定义了两组数据的表?

注释:CSV文件与此类似:

surfaces.csv

u,s
41,1
42,1.5
43,1.2

words.csv

word,frequency
abc,10

spectrum.csv

word,unicode,spectrum
abc,1,41
abc,2,42
abc,3,43

1 个答案:

答案 0 :(得分:0)

我用AMPL(一种数学编程语言,它是GNU MathProg的超集)找到了答案。我需要使用wordsunicodes之间的链接定义一个集合,并在读取表时将该集合用作控件集:

set links within {words, unicodes};
param spectrum{links} >= 0;
table data IN "CSV" "spectrum.csv": links <- [word, unicode], spectrum~spectrum;

现在我得到了:

...
INTEGER OPTIMAL SOLUTION FOUND
Time used:   0.0 secs
Memory used: 0.1 Mb (156430 bytes)

文档中的“可选集”仍然令人误解,我提交了一个错误报告。作为参考,AMPL的书为free to download,我使用的运输模型分别分散在3.2节的47页,10.1节的173页和10.2节的179页。