python求解整数规划_如何用python结合cplex求解混合整数规划问题-程序员宅基地

技术标签: python求解整数规划  

第一步:注册IBM id账号

第二步:下载相关系统的CPLEX(windows/linux/mac)

这里需要系统中安装有JAVA,选择 open with Java web start launcher (需要下载JAVA),打开后就开始进入下载页面。

补充JAVA安装:

备注:JAVA可以通过rpm包安装,或者是bin文件安装。Rpm安装可以直接双击就可以打开jnlp后缀的文件,bin文件安装的话,需要在图形界面的命令行下执行:javaws ***.jnlp打开。我采用的是bin文件安装。

1、下载你想要的java版本压缩包。

JRE下载:

JDK下载:

2、对下载的文件进行解压

3、修改环境变量:

vim ~/.bashrc

#加入以下内容

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_144

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

#保存后使之生效

source ~/.bashrc

第三步:下载完.bin文件后,修改文件的权限chmod +x filename.bin。然后用命令执行./filename.bin。进入安装。安装过程中需要设置安装路径,所以最好使用超级权限进行安装。默认路径为:/opt/ibm/ILOG/CPLEX_Studio_Community127

第四步:设置 CPLEX 的 Python API

CPLEX 的 Python API 属于 IBM ILOG CPLEX Optimization Studio 的一部分。

与CPLEX Python API 关联的模块驻留在目录 yourCPLEXhome/python/VERSION/PLATFORM 中(或文件夹 yourCPLEXhome\python\VERSION\PLATFORM 中),此处 yourCPLEXhome 指定 CPLEX 安装为 IBM ILOG CPLEX Optimization Studio 一部分的位置,VERSION 指定与 CPLEX 兼容的 Python 版本,而 PLATFORM 表示操作系统与编译器的组合。

有两种可相互替代的方法来设置 CPLEX 的 Python API。

• 首选且最常用的方法是使用位于目录 yourCPLEXhome/python/VERSION/PLATFORM 中(或文件夹 yourCPLEXhome\python\VERSION\PLATFORM 中)的脚本 setup.py。

• 或者,也可以将环境变量 PYTHONPATH 设置为 yourCPLEXhome/python/VERSION/PLATFORM 并通过 CPLEX 来开始运行 Python 脚本。

在以下段落中对这两种方法均进行了进一步详述。

使用脚本 setup.py

要在系统上安装 CPLEX-Python 模块,请使用位于 yourCplexhome/python/VERSION/PLATFORM 中的脚本 setup.py。 如果要将 CPLEX-Python 模块安装在非缺省位置,请使用选项 --home 识别安装目录。 例如,要将 CPLEX-Python 模块安装在缺省位置,请从命令行使用以下命令:

python setup.py install

要安装在目录 yourPythonPackageshome/cplex 中,请从命令行使用以下命令:

python setup.py install --home yourPythonPackageshome/cplex

这两个命令(缺省和指定主目录)均会调用 Python 包 distutils。 有关适用于该软件包的其他选项,请参考 Python distutils 的文档。

设置环境变量 PYTHONPATH

如果并行运行 CPLEX 的多个版本,那么请使用此方法:通过环境变量 PYTHONPATH 来向 Python 安装声明 CPLEX 及其 Python API 的位置。

要开始使用 CPLEX Python API,请将 Python 路径环境变量 PYTHONPATH 设置为值 yourCplexhome/python/VERSION/PLATFORM。 通过设置此环境变量,该版本的 Python 可以找到其所需的 CPLEX 模块以运行使用 CPLEX Python API 的 Python 命令和脚本。

后续步骤

通过这些可相互替代的方法之一设置 Python 环境后,便可以前进至启动 CPLEX Python API主题。

第五步:实例

t01060fb17974c01a0e.png

Python -- version 2.7

有3个不同求解方式:

execfile("cplexpypath.py")

import cplex

from cplex.exceptions import CplexError

import sys

# data common to all populateby functions

my_obj = [1.0, 2.0, 3.0]

my_ub = [40.0, cplex.infinity, cplex.infinity]

my_colnames = ["x1", "x2", "x3"]

my_rhs = [20.0, 30.0]

my_rownames = ["c1", "c2"]

my_sense = "LL"

def populatebyrow(prob):

prob.objective.set_sense(prob.objective.sense.maximize)

# since lower bounds are all 0.0 (the default), lb is omitted here

prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames)

# can query variables like the following bounds and names:

# lbs is a list of all the lower bounds

lbs = prob.variables.get_lower_bounds()

# ub1 is just the first lower bound

ub1 = prob.variables.get_upper_bounds(0)

# names is ["x1", "x3"]

names = prob.variables.get_names([0, 2])

rows = [[[0,"x2","x3"],[-1.0, 1.0,1.0]],

[["x1",1,2],[ 1.0,-3.0,1.0]]]

prob.linear_constraints.add(lin_expr = rows, senses = my_sense,

rhs = my_rhs, names = my_rownames)

# because there are two arguments, they are taken to specify a range

# thus, cols is the entire constraint matrix as a list of column vectors

cols = prob.variables.get_cols("x1", "x3")

def populatebycolumn(prob):

prob.objective.set_sense(prob.objective.sense.maximize)

prob.linear_constraints.add(rhs = my_rhs, senses = my_sense,

names = my_rownames)

c = [[[0,1],[-1.0, 1.0]],

[["c1",1],[ 1.0,-3.0]],

[[0,"c2"],[ 1.0, 1.0]]]

prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames,

columns = c)

def populatebynonzero(prob):

prob.objective.set_sense(prob.objective.sense.maximize)

prob.linear_constraints.add(rhs = my_rhs, senses = my_sense,

names = my_rownames)

prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames)

rows = [0,0,0,1,1,1]

cols = [0,1,2,0,1,2]

vals = [-1.0,1.0,1.0,1.0,-3.0,1.0]

prob.linear_constraints.set_coefficients(zip(rows, cols, vals))

# can also change one coefficient at a time

# prob.linear_constraints.set_coefficients(1,1,-3.0)

# or pass in a list of triples

# prob.linear_constraints.set_coefficients([(0,1,1.0), (1,1,-3.0)])

def lpex1(pop_method):

try:

my_prob = cplex.Cplex()

if pop_method == "r":

handle = populatebyrow(my_prob)

if pop_method == "c":

handle = populatebycolumn(my_prob)

if pop_method == "n":

handle = populatebynonzero(my_prob)

my_prob.solve()

except CplexError, exc:

print exc

return

numrows = my_prob.linear_constraints.get_num()

numcols = my_prob.variables.get_num()

print

# solution.get_status() returns an integer code

print "Solution status = " , my_prob.solution.get_status(), ":",

# the following line prints the corresponding string

print my_prob.solution.status[my_prob.solution.get_status()]

print "Solution value = ", my_prob.solution.get_objective_value()

slack = my_prob.solution.get_linear_slacks()

pi = my_prob.solution.get_dual_values()

x = my_prob.solution.get_values()

dj = my_prob.solution.get_reduced_costs()

for i in range(numrows):

print "Row %d: Slack = %10f Pi = %10f" % (i, slack[i], pi[i])

for j in range(numcols):

print "Column %d: Value = %10f Reduced cost = %10f" % (j, x[j], dj[j])

my_prob.write("lpex1.lp")

if __name__ == "__main__":

if len(sys.argv) != 2 or sys.argv[1] not in ["-r", "-c", "-n"]:

print "Usage: lpex1.py -X"

print " where X is one of the following options:"

print " r generate problem by row"

print " c generate problem by column"

print " n generate problem by nonzero"

print " Exiting..."

sys.exit(-1)

lpex1(sys.argv[1][1])

else:

prompt = """Enter the letter indicating how the problem data should be populated:

r : populate by rows

c : populate by columns

n : populate by nonzeros\n ? > """

r = 'r'

c = 'c'

n = 'n'

lpex1(input(prompt))

选择r参数,求解结果如下:

t015f642b54d1d49bb0.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39687468/article/details/110368933

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签