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

智能推荐

获取双异步返回值时,如何保证主线程不阻塞?-程序员宅基地

文章浏览阅读1.3k次,点赞42次,收藏41次。CompletableFuture的异步执行通过ForkJoinPool实现,ForkJoinPool在于可以充分利用多核CPU的优势,把一个任务拆分成多个小任务,把多个小任务放到多个CPU上并行执行,当多个小任务执行完毕后,再将其执行结果合并起来。

【Windows脚本:每隔5分钟F5键刷新,避免电脑锁屏】_windows防锁屏bat脚本-程序员宅基地

文章浏览阅读958次。objShell.SendKeys “{F5}” ’ 模拟鼠标中键点击。WScript.Sleep(300000) ’ 延时5分钟。_windows防锁屏bat脚本

centOS 快速安装和配置 NVIDIA docker Container Toolkit_nvidia container toolkit-程序员宅基地

文章浏览阅读2.3k次。CentOS快速安装配置NVIDIA Container Toolkit_nvidia container toolkit

Android 中调用线程thread.stop 方法后报错,Deprecated Thread methods are not supported._timethread().stop();报错-程序员宅基地

文章浏览阅读3.9k次。03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global: Deprecated Thread methods are not supported.03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global: _timethread().stop();报错

%e5 转换汉字 php,汉字转Unicode编码,Unicode编码转汉字-程序员宅基地

文章浏览阅读2.3k次。/*** 汉字转Unicode编码* @param string $str 原始汉字的字符串* @param string $encoding 原始汉字的编码* @param boot $ishex 是否为十六进制表示(支持十六进制和十进制)* @param string $prefix 编码后的前缀* @param string $postfix 编码后的后缀*/function unicode..._%e5

东汉十三州以及各个郡的说明_三国地图十三州精确到城池-程序员宅基地

文章浏览阅读6.4w次,点赞7次,收藏10次。东汉十三州以及州下辖的郡县。_三国地图十三州精确到城池

随便推点

ios砸壳_ios砸壳需要 闪退怎么砸-程序员宅基地

文章浏览阅读6.2k次。frida-ios-dump源码地址:​​​​​​GitHub - AloneMonkey/frida-ios-dump: pull decrypted ipa from jailbreak devicefrida-ios-dump是基于frida开发的一键砸壳工具,需要配置frida环境手机配置1)越狱状态2)安装openssh3)安装fridaMac配置1)安装frida,命令行:sudo pip install frida-tools (没有安装pip的话需要先安装pip)_ios砸壳需要 闪退怎么砸

IOS-----越狱开发_depends libundirect.depends firmware-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏2次。1.制作系统应用程序。 ios的程序分为mobile和root权限模式,我们一般用xcode开发的app取得的是mobile权限,但是ios越狱后安装的app如:Cydia、91助手、PP助手等均为系统级应用程序。系统级app的好处是:用不无法手动删除、取得完全的root权限、可设置开机启动项等等功能。通过xcode打包的ipa是无法安装成为系统app的,所以我们需要另外一种打包方式:_depends libundirect.depends firmware

C++--继承基本概念、对象赋值转换、作用域_什么是赋值转换-程序员宅基地

文章浏览阅读254次,点赞5次,收藏2次。继承1. 继承的基本概念1.1 继承的定义1.2 继承基类成员访问方式的变化2. 基类和派生类对象赋值转换3. 继承中的作用域1. 继承的基本概念继承是面向对象程序设计使代码复用的最重要的手段,允许在保持原有类特性的基础上进行扩展,增加功能,产生新的类,称为派生类/子类。继承是类设计层次的复用。1.1 继承的定义派生类 : 继承方式 基类class Student : public Person1.2 继承基类成员访问方式的变化父类成员在子类中的访问权限(除过父类中的私有成员):_什么是赋值转换

模式识别(2)KNN分类_usps数据集是在哪里提出的-程序员宅基地

文章浏览阅读2.3k次,点赞10次,收藏36次。基于USPS和UCI数据集的近邻法分类一、问题描述 使用近邻算法进行分类问题的研究,并在USPS手写体数据集和UCI数据集上的iris和sonar数据上验证算法的有效性,并分别对近邻法中k近邻算法、最近邻算法和Fisher线性判别进行对比分析。二、数据集说明2.1 USPS手写体 USPS,美国邮政署,是美国联邦政府的独立机构,其中的手_usps数据集是在哪里提出的

Access根据出生日期计算年龄_Excel表格中怎么用出生日期计算年龄?这些方法好用哟...-程序员宅基地

文章浏览阅读1.9k次。  平时工作中用到Excel表格的几率特别大,也积累了一些小技巧,今天就给大家分享一下计算年龄的方法。  在Excel表格中利用“系统时间”和“出生年月”来计算“周岁年龄”、“虚岁年龄”和“实际年龄”是非常方便的,特别是人事管理和工资的统计中遇到的可能性比较大,一起来看一下计算年龄的方法吧。  方法一  第一步,如下图所示,先把需要计算年龄的出生日期输入到表格中。   第二步,然后在B2单元格中输..._access计算年龄

【EJB】异步方法调用-程序员宅基地

文章浏览阅读641次,点赞23次,收藏18次。虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

推荐文章

热门文章

相关标签