1OPL语言
OPL语言用来编制模型文件和数据文件。
- 项目文件:组织模型和数据的文件
- 模型文件:声明数据项目
- 数据文件:在模型中声明的数据初始化
- 设置文件:保存用户定义的值
- 运行配置:根据项目进行的设置
1.1模型文件
包括数学建模的四个要素:数据、决策变量、目标函数、约束条件
主要关键字:
- string {string}变量名={”字符串1“,”字符串2“,”字符串3“...} 示例:{string}Products={"gas","chloride","shit"};
- float 定义小数 float 变量名[对应字符串数组变量名]=[数值1,数值2,...] 示例:float f=1.21; float Price[Products] =[90,100]; float Demands[Products][Money] = [[1,3,0][1,4,0]];
- int 定义整数 int 变量名[对应关键字数组数组变量名] = [数值1,数值2,...]; 示例: int M=1000;
- range 定义一段连续的整型数据范围 range 变量名 = start...end; 示例:range jobnum=1..N;
- dvar 定义决策变量 dvar 数据类型函数(+/-) 变量名 ; 示例:dvar float S[location];
- Maximize/Minimize 目标函数表达式 示例:minimize Lmax;
- subject to 约束 subject to {约束1名称:约束;....} 示例:subject to{
forall(k in location)
sum(j in jobnum)x[k][j] == 1;
} - forall 使用forall可以生成多个条件表达式 标准的forall循环:
subject to { forall (c in Components) sum (p in Products) demand[p][c] * production[p] <= stock[c]; }
forall循环可以包含条件语句:
subject to { forall (c in Components) { if (...) { ... } } }
OPL提供了forall的过滤器写法:
subject to { forall (i in 1..10 : mydata[i] <= 10) { ... } }
语言基本组成:
- 多行注释 /* This is a multiline comment */
- 单行注释 //my book
- 预处理指令(可选) execute{ writeln('start reducing') } 暂时不懂这个是干嘛的
- 后处理指令 (可选)
execute { if (cplex.getCplexStatus() == 1) { writeln('reduced cost of x= ', x.reducedCost) writeln('reduced cost of y= ', y.reducedCost) } }
1.2数据文件
与模型文件相对应,模型数据中的....在数据文件中应该使用具体的数据,数据类型为字符串类型,各数据之间使用空格或逗号隔开;如果不加#数据必须有变量名,否则数据必须是有序的;示例:
Products = {"gas", "chloride"};
Fixed = 30;
Profit = #["chloride":40, "gas":30]#;