跳转到内容

GLPK/使用 GMPL (MathProg)

来自维基教科书,开放的书籍,开放的世界

此页面提供有关 GMPL (MathProg) 语法和用法的示例和提示。


首先要注意的是,MathProg 不是一种 过程式语言。例如,与大多数编程语言不同,MathProg 没有赋值语句。相反,MathProg 是一种 函数式语言。MathProg 是根据 AMPL 语言构建的,并提供该语言的一个子集。与 AMPL 一样,其语法专门用于表达数学优化问题。

MathProg 对象

[编辑 | 编辑源代码]

在 MathProg 中,集合是元素的无序集合(与编程语言中的数组不同),因此元素位置是不确定的。

MathProg 语法

[编辑 | 编辑源代码]

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 年的 帖子 描述了一种特定的解决方法。

华夏公益教科书