GLPK/使用 GMPL (MathProg)
此页面提供有关 GMPL (MathProg) 语法和用法的示例和提示。
首先要注意的是,MathProg 不是一种 过程式语言。例如,与大多数编程语言不同,MathProg 没有赋值语句。相反,MathProg 是一种 函数式语言。MathProg 是根据 AMPL 语言构建的,并提供该语言的一个子集。与 AMPL 一样,其语法专门用于表达数学优化问题。
在 MathProg 中,集合是元素的无序集合(与编程语言中的数组不同),因此元素位置是不确定的。
从 2010 年 6 月 3 日发布的 GLPK 4.44 开始,MathProg 支持约束和变量的后缀。后缀的使用在 官方文档 的附录 A 中有介绍doc/gmpl.pdf。下表提供了摘要
后缀 | 目的 |
---|---|
.lb | 下限 |
.ub | 上限 |
.status | 解决方案中的状态 |
.val | 原始值 |
.dual | 对偶值 |
MathProgprintf语句可用于创建自定义输出。在以下情况下,约束的对偶值c1将打印到终端
... solve; printf "dual value of constraint c1: %g\n", c1.dual;
终端输出也可以使用 GLPSOL 命令行选项复制到文本文件--log filename.log.
这data参数set语句(截至 2011 年 5 月)没有记录,但其思想非常简单。假设您声明一个普通集合S由 5 元组组成(i,j,k,l,m):
set S, dimen 5;
将在数据部分提供数据。但您实际上想要的是一个集合数组T{j,m},其中T[j,m]是一个三元组集合(l,i,k)来自S。使用data属性,另外声明一个集合T如下
set T{j,m}, data S[2,5,4,1,3];
此语句与从数据部分提供对应数据的效果相同T本身,其中[2,5,4,1,3]是组件索引的排列:每个 5 元组中第 2 和第 5 个组件S给出一个对(j,m)用于索引T的元素,并且 5 元组的第 4、第 1 和第 3 个组件用于构建(l,i,k)三元组,然后包含在集合T[j,m]中。最后,只有普通集合受data属性支持。
MathProg 不支持有序集合。讨论 这里 和 这里 提供了一些关于为什么不使用有序集合的背景信息。这 2006 年的 帖子 描述了一种特定的解决方法。