AMPL下载安装于基本使用(二)

1 带有下标的优化模型

优化问题大部分情况下,参数有很多,约束也有很多,但大部分参数和约束都是同类型的,在数学表达式中往往都以下标来区分,例如《运筹学》(罗纳德 L. 拉丁)中的Pi Hybrids问题的优化模型的数学表示:
在这里插入图片描述
注,这是来自书中的截图,这里的demands错误,d的下标应该为h,r

另一方面,为了让程序具有通用性,都是模型与数据分开的,即放在两个文件中,这样改数据的时候可以不用动模型。

我们以《运筹学》(罗纳德 L. 拉丁)中的Pi Hybrids问题为例来说明模型与数据分离时如何写程序,同时使用下标来表达多参数、多约束的模型。

2 编写模型

第一步是写模型,新建一个名为pi_hybrids.mod的模型文件,这个上节讲过怎么操作,文件内容如下:

model;		# 声明此部分为模型部分

# param定义基本符号参数:设备、品种、销售地
param l;		# l台设备
param m;		# m个玉米杂交品种
param n;		# n个销售地

# set定义序列,这里定义的是标引(下标)的取值范围
set facils := 1 .. l;	# 设备编号范围,这里facils是一个序列,类似于python中的range用法
set hybrs := 1 .. m;	# 玉米杂交品种编号范围
set regns := 1 .. n;	# 销售地编号范围

# 定义其他符号参数,这里用下标的方式,使用一条param语句同时定义一组参数
# 下面的像f、h、r这些标引,都不需要单独定义,但它们每次出现,
# 都需要使用花括号声明其范围,同一条语句只需要声明一次
param u{f in facils};		# 编号为f的设备的加工能力,即设备f处理玉米谷粒的能力											
param a{h in hybrs};		# 生产一袋h品种玉米杂交种所需的谷粒数量
param p{f in facils, h in hybrs};				# 设备f生产一袋h品种的生产成本(金钱成本)
param d{h in hybrs, r in regns};				# 销售地r对h品种的需求量
param s{f in facils, h in hybrs, r in regns};	# 从设备f,将一袋h品种玉米杂交种运输到销
												# 售地r的运输成本
												
# 定义决策变量及其类型约束,这里同样使用下标的方式,可以通过一条var语句同时定义一组决策变量
var x{f in facils, h in hybrs} >= 0;				# 使用设备f,生成品种h的袋数
var y{f in facils, h in hybrs, r in regns} >= 0;	# 从设备f,运输品种h,到销售地r的袋数

# 定义目标函数,这里sum是求和符号,通过下标定位参数或决策变量,需要通过[]
minimize tcost: sum{f in facils, h in hybrs} p[f, h]*x[f, h]
+ sum{f in facils, h in hybrs, r in regns} s[f, h, r]*y[f, h, r];

# 定义主约束,使用下标的方式,通过一条语句同时定义一组约束
subject to
fcap{f in facils}: sum{h in hybrs} a[h]*x[f, h] <= u[f];				# 设备能力约束
rdems{h in hybrs, r in regns}: sum{f in facils} y[f, h, r] = d[h, r];	# 运输等于需求
psbal{f in facils, h in hybrs}: sum{r in regns} y[f, h, r] = x[f, h];	# 运输等于生产

由于CSDN中没有AMPL代码格式,我用截图看起来能更方便一些,因为关键字有颜色:
在这里插入图片描述

我们可以归纳一下上述程序的步骤:
(1)定义基本符号参数,如l m n
(2)定义下标的范围,通过定义序列来进行;
(3)通过下标定义其他参数;
(4)定义决策变量及其类型约束;
(5)定义主约束。
这五步通常是AMPL写模型的标准流程,是层层递进的关系。

2 组织数据

在与py_hybrids.mod文件的同目录下新建一个名为py_hybrids.dat的文件,也可以是其他名字(以容易识别为准),但后缀必须是.dat,新建的时候可以在“File Extension”中选择:
在这里插入图片描述
py_hybrids.dat内容如下:

data;		# 声明此部分为模型部分

# 给没有下标的基本参数赋值
param l := 2;		# “:=”表示赋值
param m := 4;
param n := 3;

# 以列表形式,给只有单个下标的参数赋值
param u := 1 2200 2 2555;		# u[1]为2200,u[2]为2555
param a := 1 7 2 11 3 6 4 18;

# 以表格形式,给多重下标的参数赋值,为了方便观察,建议用tab隔开

# 二重下标
param p: 	1 		2 		3 		4 :=
1 			1.10 	0.89 	2.05 	1.45
2 			1.55 	1.13 	2.15 	1.56 ;

param d : 	1 		2 		3 :=
1 			123 	119 	500
2 			311 	281 	333
3 			212 	188 	424
4 			189 	201 	440 ;

# 三重下标
param s: 	1 		2 		3 :=
1	1 		0.89 	0.91 	0.77
1	2 		1.00 	0.84 	0.89
1	3 		0.77 	0.76 	0.78
1	4 		0.99 	1.03 	0.85
2	1 		0.92 	0.89 	0.92
2	2 		0.87 	0.95 	0.90
2	3 		0.91 	0.83 	0.77
2	4 		0.89 	0.79 	0.86 ;	# s[2, 4, 1]即为0.89,列标表示最后一个下标

截图看的更清晰:
在这里插入图片描述
书中还是有错的,因为p[f, h],f=1, ... , l l=2 那么f只能等于1或2,所以参数p只能有两行,但书中有4行,我删掉了后面两行,否则后面运行命令data pi_hybrids.dat;时会报错。

3 控制台运行

控制台输入如下数据:

ampl: reset;
ampl: model pi_hybrids.mod;
ampl: data pi_hybrids.dat;
ampl: option solver cplex;
ampl: solve;

结果:
在这里插入图片描述
可能是书中的数据没有组织好,导致约束无法被满足,即约束之间相互冲突,所以这里报错。当然,我们这里只是过一下案例,知道怎么操作模型与数据分离、带有下标的情况就行了,具体结果这里不重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/690055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【postgresql初级使用】视图上的触发器instead of,替代计划的rewrite,实现不一样的审计日志

instead of 触发器 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 inst…

Linux宝塔部署数据库连接问题

博主在部署项目时发现网页可以成功部署&#xff0c;但是登录界面一直登录不进去推测是数据库连接问题。 博主当时在IDEA中写的是用户名为root 密码123456 但是在宝塔中因为自己是跟着教程学的所以就顺手把用户名和密码都改了&#xff0c;于是java中的配置和数据库配置连接不上…

C++第二十五弹---从零开始模拟STL中的list(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、函数补充 2、迭代器完善 3、const迭代器 总结 1、函数补充 拷贝构造 思路&#xff1a; 先构造一个头结点&#xff0c;然后将 lt 类中的元…

深入探索:十种流行的深度神经网络及其运作原理

算法 深入探索&#xff1a;十种流行的深度神经网络及其运作原理一、卷积神经网络&#xff08;CNN&#xff09;基本原理工作方式 二、循环神经网络&#xff08;RNN&#xff09;基本原理工作方式 三、长短期记忆网络&#xff08;LSTM&#xff09;基本原理工作方式 四、门控循环单…

.net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript

.net core 使用js&#xff0c;.net core 使用javascript&#xff0c;在.net core项目中怎么使用javascript 我项目里需要用到“文字编码”&#xff0c;为了保证前端和后端的编码解码不处bug, 所以&#xff0c;我在项目中用了这个 下面推荐之前在.net F4.0时的方法 文章一&#…

js--hasOwnProperty()讲解与使用

@TOC 前言 hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性 object.hasOwnProperty(propertyName) // true/false 讲解 hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继…

下载中心表设计

文件表 有哪些文件需要异步生成 文件夹表 添加文件夹功能时使用 权限表 文件权限绑定 对用户来说&#xff0c;下载文件和配置下载管理是两个可直接交互的功能。下载文件包括&#xff1a; 1&#xff09;添加下载任务&#xff08;手动开始&#xff09;。 2&#xff09;开始…

安卓约束性布局学习

据说这个布局是为了解决各种布局过度前套导致代码复杂的问题的。 我想按照自己想实现的各种效果来逐步学习&#xff0c;那么直接拿微信主页来练手&#xff0c;用约束性布局实现微信首页吧。 先上图 先实现顶部搜索框加号按钮 先实现 在布局中添加一个组件&#xff0c;然后摆放…

Java学习54-关键字this的使用

this是什么 this的作用&#xff1a; 它在方法(准确的说是实例方法或非static的方法)内部使用&#xff0c;表示调用该方法的对象 它在构造器内部使用&#xff0c;表示该构造器正在初始化的对象 this可以调用的结构&#xff1a;成员变量、方法和构造器 什么时候使用this 实…

安徽代理记账公司的专业服务和创新理念

在当今竞争激烈的市场环境中&#xff0c;为了提升企业的运营效率&#xff0c;许多企业开始寻找专业的代理记账公司进行财务管理和记账&#xff0c;本文将介绍一家名为安徽代理记账公司的专业服务和创新理念。 安徽代理记账公司是一家专注于为企业提供全方位会计服务的公司&…

[ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;网络通信基础TCP/IP专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月8日14点23分 &#x1f004;️文章质量&#xff1a;94分 前言—— 在现代通信网络中&#xff0c;传输介质是数据传…

江西代理记账公司的专业服务和优质品质

作为一家专业的代理记账公司&#xff0c;我们始终以“专业、公正、公平”为宗旨&#xff0c;为客户提供全方位的会计咨询服务&#xff0c;我们的服务内容包括但不限于以下几点&#xff1a; 1、代理记账服务&#xff1a;我们拥有丰富的经验和专业知识&#xff0c;能够为企业提供…

【ARM Cache 系列文章 1.2 -- Data Cache 和 Unified Cache 的详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Data Cache and Unified Cache数据缓存 (Data Cache)统一缓存 (Unified Cache)数据缓存与统一缓存的比较小结 Data Cache and Unified Cache 在 ARM架构中&#xff0c;缓存&#xff08…

一次改SQLMAP的操作

前言 sqlmap这个工具&#xff0c;相信各位大佬们都不陌生&#xff0c;但sqlmap虽好&#xff0c;也时常会有些实际存在但无法注入的地方&#xff0c;这时候就需要我们改它的配置了&#xff0c;今天就以本人遇到的事件进行阐述。 正文 确认注入点 通过一系列测试最终确定这里…

论文高级图表绘制(Python语言,局部放大图)

本文将通过一个具体的示例,展示如何使用Python语言和Matplotlib库来绘制高级图表,包括局部放大图的制作。适用于多条曲线绘制在同一个图表中,但由于数据量过大,导致曲线的细节看不清,需要对细节进行局部放大。如下图: 环境准备 首先,确保你的Python环境中已经安装了以…

PHP超详细安装及应用

目录 所需安装包如下 一、PHP安装 依赖包安装 安装扩展工具&#xff08;先将PHP所需的软件包全部拖进centos根目录下&#xff09; 安装libmcrypt 安装mhash 安装mcrypt 安装PHP 二、设置LAMP组件环境&#xff08;要保证mysql、http都安装完成了&#xff09; Php.ini的建…

附录二-nmap基本用法

参考 黑客工具—Nmap的使用_哔哩哔哩_bilibili nmap是扫描IP和端口的&#xff0c;相当于攻击前的索敌步骤。不止网络安全方面会用到&#xff0c;平时运维的时候也会用到nmap 1 下载nmap nmap官网 https://nmap.org/ 点击下载&#xff0c;然后点你用的平台就行了 往下滚可以…

Linux环境在非root用户中搭建(java-tomcat-redis)

注: 本文在内网(离线)环境&#xff0c;堡垒机中搭建&#xff0c;服务器不同可能有所差异&#xff0c;仅供参考 本文安装JDK-20.0.1版本&#xff0c;apache-tomcat-10.1.10版本&#xff0c;redis-6.2.15版本 本文服务器IP假设&#xff1a;192.168.88.133 root用户创建子用户并…

stack overflow复现

当你在内存的栈中&#xff0c;存放了太多元素&#xff0c;就有可能在造成 stack overflow这个问题。 今天看看如何复现这个问题。 下图&#xff0c;是我写的程序&#xff0c;不断的创造1KB的栈&#xff0c;来看看执行了多少次&#xff0c;无限循环。 最后结果是7929kB时, 发…

Echarts 可视化图库案例(Make A Pie)

1、Made A Pie Made A Pie 2、可视化社区 &#xff08;Made A Pie 替代&#xff09; 可视化社区