GLPK(GNU线性规划工具包)中建模语言MathProg的使用

      GNU MathProg是一种用于描述线性数学规划模型的建模语言用GNU MathProg语言编写的模型描述由一组语句和数据块组成

      在MathProg中,模型以集合、参数、变量、约束和目标(sets, parameters, variables, constraints, objectives称为模型对象)的形式进行描述

      在MathProg中,模型描述(model description)由两部分组成:模型部分和数据部分

      (1).模型部分是模型描述的主要部分,包含模型对象的声明,并且对于基于相应模型的所有问题都是通用的。

      (2).数据部分是模型描述的可选部分,包含特定于特定问题实例的数据。

      模型描述采用ASCII字符集的纯文本格式编码

      这里使用 https://blog.csdn.net/fengbingchun/article/details/147855898  中饮食问题的数据生成diet.mod,内容如下所示:

# sets
set Foods := {'food1', 'food2', 'food3', 'food4', 'food5', 'food6', 'food7', 'food8', 'food9'};
set Nutrients := {'nutrient1', 'nutrient2', 'nutrient3', 'nutrient4'};# parameters
param unit_prices{Foods};
param nutrient_values{Foods, Nutrients};
param min_bounds{Foods};
param max_bounds{Foods};
param min_nutrient{Nutrients};
param max_untrient{Nutrients};# variable
var quantity{Foods} >= 0;
var select{Foods} binary;# objective function
minimize total_cost: sum{f in Foods} unit_prices[f] * quantity[f];# constraint
s.t. quantity_min{f in Foods}: quantity[f] >= min_bounds[f] * select[f];
s.t. quantity_max{f in Foods}: quantity[f] <= max_bounds[f] * select[f];s.t. nutrient_min{n in Nutrients}: sum{f in Foods} nutrient_values[f, n] * quantity[f] >= min_nutrient[n];
s.t. nutrient_max{n in Nutrients}: sum{f in Foods} nutrient_values[f, n] * quantity[f] <= max_untrient[n];s.t. total_quantity: sum{f in Foods} quantity[f] = 99.0;s.t. mandatory_food: select['food5'] = 1;s.t. num_select_foods: sum{f in Foods} select[f] = 5;solve;printf "total cost: %.4f\n", total_cost;
printf {f in Foods: select[f] > 0.5}: "selected: %s: %.4f, limit: [%.1f, %.1f]\n", f, quantity[f], min_bounds[f], max_bounds[f];
printf "total quantity: %.1f\n", sum{f in Foods} quantity[f];# data
data;param unit_prices :='food1' 0.886'food2' 0.863'food3' 0.855'food4' 0.917'food5' 0.237'food6' 0.856'food7' 0.833'food8' 0.904'food9' 0.876;param nutrient_values : 'nutrient1' 'nutrient2' 'nutrient3' 'nutrient4' :='food1' 0.21 65.10 0.72 88.5'food2' 0.08 64.58 0.63 76.9'food3' 0.22 64.81 0.53 86.1'food4' 0.58 65.84 1.09 57.8'food5' 0.033 46.07 14.15 0'food6' 0.059 65.25 0.39 87.2'food7' 0.14 64.25 0.57 93.7'food8' 0.033 63.06 1.36 79.0'food9' 0.076 65.20 0.59 99.0;param min_bounds :='food1' 1.0'food2' 1.0'food3' 1.0'food4' 1.0'food5' 7.0'food6' 1.0'food7' 1.0'food8' 1.0'food9' 1.0;param max_bounds :='food1' 55.0'food2' 55.0'food3' 55.0'food4' 55.0'food5' 9.0'food6' 55.0'food7' 55.0'food8' 55.0'food9' 55.0;param min_nutrient :='nutrient1' 0.'nutrient2' 6200.'nutrient3' 9.9'nutrient4' 6500.;param max_untrient :='nutrient1' 49.'nutrient2' 6230.'nutrient3' 782.'nutrient4' 7000.;end;

      .mod文件:模型文件(model file),纯文本文件,由GNU MathProg建模语言编写。

      (1).可在.mod中使用printf打印中间结果

      (2).数据既可以放在.mod文件中,也可以存放于单独的.dat文件中

      glpsol.exe调用.mod

      (1).可通过执行"glpsol.exe --help"查看glpsol.exe支持的参数

      (2).执行"glpsol.exe -m diet.mod -o result.txt",执行结果如下图所示:与之前结果相同

      C API调用.mod实现

int test_glpk_mod()
{auto tran = glp_mpl_alloc_wksp();const char* model_file{ "../../../testdata/diet.mod" };if (auto ret = glp_mpl_read_model(tran, model_file, 0); ret != 0) {std::cerr << "Error: failed to read model: " << model_file << ", error code: " << ret << std::endl;return ret;}if (auto ret = glp_mpl_generate(tran, nullptr); ret != 0) {std::cerr << "Error: failed to generate model:  " << model_file << ", error code: " << ret << std::endl;return ret;}auto lp = glp_create_prob();glp_mpl_build_prob(tran, lp);glp_iocp parm;glp_init_iocp(&parm);parm.presolve = GLP_ON;parm.msg_lev = GLP_MSG_ERR;auto ret = glp_intopt(lp, &parm);if (ret != 0) {std::cerr << "Error: failed to solve: error code: " << ret << std::endl;glp_delete_prob(lp);glp_mpl_free_wksp(tran);return ret;}ret = ret = glp_mip_status(lp);if (ret != GLP_OPT) {std::cerr << "Error: there is no optimal solution, status: " << ret << std::endl;glp_delete_prob(lp);glp_mpl_free_wksp(tran);return ret;}glp_mpl_postsolve(tran, lp, GLP_MIP); // GLP_SOL: LP, glp_simplex; GLP_MIP: MIP, glp_intopt; execute the printf statement in the mod filestd::cout << "minimum cost: " << glp_mip_obj_val(lp) << std::endl; // LP: glp_get_obj_val; MIP: glp_mip_obj_valfor (auto j = 0; j < foods.size(); ++j) {if (auto ret = glp_mip_col_val(lp, j+1); ret > 0.5)std::cout << foods[j] << ": quantity: " << ret << ", limit: [" << bounds[j][0] << "," << bounds[j][1] << "]" << std::endl;}glp_delete_prob(lp);glp_mpl_free_wksp(tran);return 0;
}

      执行结果如下图所示:与之前结果相同

      GitHub:https://github.com/fengbingchun/Messy_Test

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Python星球日记》 第77天:模型部署与总结

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、模型部署技术1. 模型文件导出不同模型格式对比2. 使用Flask构建RESTful API3. 使用FastAPI构建高性能API4. 部署优化与最佳实践二、部署架构…

【JavaWeb】MySQL(准备篇)

1 MySQL安装 1.1 解压 下载完成后我们得到的是一个压缩包&#xff08;所有文件均在文末安装包中&#xff09;&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 8.0.34 的软件本体了(就是一个文件夹)&#xff0c;我们可以把它放在你想安装的位置 。 1.2 配置 1.2.1 配置…

国产数据库工具突围:SQLynx如何解决Navicat的三大痛点?深度体验报告

引言&#xff1a;Navicat的"中国困境" 当开发者面对达梦数据库的存储过程调试&#xff0c;或是在人大金仓中处理复杂查询时&#xff0c;Navicat突然变得力不从心——这不是个例。 真实痛点&#xff1a;某政务系统迁移至OceanBase后&#xff0c;开发团队发现Navicat无…

ETL数据集成产品选型需要关注哪些方面?

ETL&#xff08;Extract&#xff0c;Transform&#xff0c;Load&#xff09;工具作为数据仓库和数据分析流程中的关键环节&#xff0c;其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年&#xff0c;通过自身产品的实践应用&#xff0c;对 ETL 产品选型…

数据结构实验10.1:内部排序的基本运算

文章目录 一&#xff0c;实验目的二&#xff0c;实验内容1. 数据生成与初始化2. 排序算法实现&#xff08;1&#xff09;直接插入排序&#xff08;2&#xff09;二分插入排序&#xff08;3&#xff09;希尔排序&#xff08;4&#xff09;冒泡排序&#xff08;5&#xff09;快速…

从秒开到丝滑体验!WebAssembly助力ZKmall商城重构 B2B2C 商城性能基线

在 B2B2C 电商领域&#xff0c;用户对页面加载速度与交互流畅度的要求日益严苛。传统 Web 技术在处理复杂业务逻辑、海量数据渲染时&#xff0c;常出现卡顿、延迟等问题&#xff0c;导致用户流失。ZKmall 商城创新性地引入 WebAssembly&#xff08;简称 Wasm&#xff09;技术&a…

FD+Mysql的Insert时的字段赋值乱码问题

方法一 FDQuery4.SQL.Text : INSERT INTO 信息表 (中心, 分组) values(:中心,:分组); FDQuery4.Params[0].DataType : ftWideString; //必须加这个数据类型的定义&#xff0c;否则会有乱码 FDQuery4.Params[1].DataType : ftWideString; //ftstring就不行&#xff0c;必须是…

vue2.0 组件生命周期

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…

使用GmSSL v3.1.1实现SM2证书认证

1、首先使用gmssl命令生成根证书、客户端公私钥&#xff0c;然后使用根证书签发客户端证书&#xff1b; 2、然后编写代码完成认证功能&#xff0c;使用根证书验证客户端证书是否由自己签发&#xff0c;然后使用客户端证书验证客户端私钥对随机数的签名是否正确。 第一部分生成根…

升级mysql (rpm安装)

#备份以防万一 备份配置文件: /etc/my.cnf.d/server.cnf 备份数据: mysqldump -u your_username -p --all-databases > all_databases.sql #停止 systemctl stop mysql #卸载旧版 yum remove mariadb #安装新版( 通过yum安装报错,死活安装不了,只能rpm安装) 下载地址…

深入理解pip:Python包管理的核心工具与实战指南

# 深入理解pip&#xff1a;Python包管理的核心工具与实战指南 在Python开发中&#xff0c;第三方库是提升效率的关键。而pip作为Python官方的包管理工具&#xff0c;承担着安装、卸载、升级和管理库的重要职责。本文将全面解析pip的核心命令&#xff0c;结合实例演示用法&#…

Linux配置SSH密钥认证

介绍 配置SS秘钥认证后&#xff0c;可以通过shell脚本免密删除文件或执行命令。 # 生成密钥对&#xff08;如果还没有&#xff09; ssh-keygen -t rsa# 将公钥复制到服务器 ssh-copy-id "$remote_user$remote_host"

python打卡第30天

知识点回顾&#xff1a; 一&#xff0c;导入官方库的三种手段。 使用 import 直接导入整个模块 import module_name 使用 from ... import ... 导入特定功能 from module_name import function_name 使用 as 关键字重命名模块或功能 import module_name as alias # 或 from mod…

Java基础(网络编程)

一、概述 目的&#xff1a;网络通信&#xff1a; 1、设备和设备 2、进程和进程 1&#xff09;不同设备之间 2&#xff09;本地设备之间 需要解决的问题&#xff1a; 如何准确地发送到对方的主机 - IP地址 - 唯一的定位网络中的一台主机 如何准确的发送到对方主机的进程 -…

第二届parloo杯的RSA_Quartic_Quandary

&#xff08;害&#xff0c;还是太菜了&#xff0c;上去秒了一道题之后就动不了了&#xff0c;今晚做个记录&#xff0c;一点点的往回拾起吧&#xff09; # from Crypto.Util.number import getPrime, bytes_to_long # import math # # FLAG b************** # # # def gene…

RLᵛ_ Better Test-Time Scaling by Unifying LLM Reasoners With Verifiers

RLᵛ: Better Test-Time Scaling by Unifying LLM Reasoners With Verifiers 在人工智能领域&#xff0c;大语言模型&#xff08;LLM&#xff09;的推理能力提升一直是研究热点。今天要解读的论文提出了一种全新的强化学习框架RLᵛ&#xff0c;通过融合推理与验证能力&#xf…

VS中将控制台项目编程改为WINDOWS桌面程序

有时候因为误操作&#xff0c;建立了控制台项目&#xff0c;但是实际上想建立桌面程序。那么应该如何改过来呢&#xff1f; 一共要修改两个地方&#xff0c;修改步骤如下&#xff1a; 第一处修改地点&#xff1a; 将C/C下面的预处理器选项中&#xff0c;将原本的_CONSOLE修改…

API Gateway REST API 集成 S3 服务自定义 404 页面

需求分析 使用 API Gateway REST API 可以直接使用 S3 作为后端集成对外提供可以访问的 API. 而当访问的 URL 中存在无效的桶, 或者不存在的对象时, API Gateway 默认回向客户端返回 200 状态码. 而实际上这并不是正确的响应, 本文将介绍如何自定义返回 404 错误页面. 基本功…

【达梦数据库】过程、函数、包头和包体详解零基础

目录 背景参考链接解释包头包体 背景 最近遇到关于包头和包体的问题&#xff0c;学习并记录 参考链接 参考链接: oracle的过程、函数、包头和包体详解零基础 解释 包头主要用于定义接口&#xff0c;包体主要用以实现包体中声明的存储过程、函数等。 包头 包体

C++字符串处理:`std::string`和`std::string_view`的区别与使用

在 C中&#xff0c;std::string和std::string_view都用于处理字符串&#xff0c;但它们的用途和性能特点有很大不同。本教程将通过代码示例和流程图&#xff0c;帮助你快速掌握它们的使用方法。 1.什么是std::string和std::string_view&#xff1f; 1.1std::string std::str…