python规划
动态规划算法中是将复杂问题递归分解为子问题,通过解决这皮拆些子问题来解决复杂问题。与递归算法相比,动态编程减少了堆栈的使用,避免了重复的计算,效率得到显着提升。
先来看一个简单的例子,斐波那契数列.
斐波那契数列的定义如下。
斐波那契数列可以很容易地用递归算法实现:
上述代码,随燃旁枣着n的增加,计算量呈指数级增长,算法的时间复杂度是 。
采用动态规划算法,通过自下而上的计算数列的值,可以使算法复杂度减小到 ,代码如下。
下面我们再看一个复杂一些的例子。
这是小学奥数常见的硬币问题: 已知有1分,2分,5分三种硬币数量不限,用这些硬币凑成为n分钱,那么一共有多少种组合方法。
我们将硬币的种类用列表 coins 定义;
将问题定义为一个二维数组 dp,dp[amt][j] 是使用 coins 中前 j+1 种硬币( coins[0:j+1] )凑成总价amt的组合数。
例如: coins = [1,2,5]
dp[5][1] 就是使用前两种硬币 [1,2] 凑成总和为5的组合数。
对于所有的 dp[0][j] 来说,凑成总价为0的情况只有一种,就是所有的硬币数量都为0。所以对于在有效范围内任意的j,都有 dp[0][j] 为1。
对于 dp[amt][j] 的计算,也就是使用 coins[0:j+1] 硬币总价amt的组合数,包含两种情况计算:
1.当使用第j个硬币时,有 dp[amt-coins[j]][j] 种情况,即amt减去第j个硬币币值,使用前j+1种硬币的组合数;
2.当不使用第j个硬币时,有 dp[amt][j-1] 种情况,即使用前j种硬币凑成amt的组合数;
所以: dp[amt][j] = dp[amt - coins[j]][j]+dp[amt][j-1]
我们最终得到的结果是:dp[amount][-1]
上述分析省略了一些边界情况。
有了上述的分析,代码实现就比较简单了。
动态规划算法代码简洁,执行效率高。但是与递归算法相比,需要仔细考虑如何分解问题,动态规划代码与递归调用相比,较难理解。
我把递归算法启瞎实现的代码也附在下面。有兴趣的朋友可以比较一下两种算法的时间复杂度有多大差别。
上述代码在Python 3.7运行通过。
2. gurobi 高效数学规划引擎 | python3 配置、使用及建模实例
本文源自github文章 wurmen/Gurobi-Python,并在此基础上进行衍生扩展。独立第三方优化器评估报告显示,Gurobi以卓越的性能跻身大规模优化器新领袖地位,成为性价比最为优秀的企业大规模优化器首选。Gurobi是由美国Gurobi Optimization公司开发的新一代大规模优化器。无论在生产制造领域,还是在金融、保险、交通、服务等其他各种领域,当实际问题越来越复杂、问题规模越来越庞大的时候,我们需要一个经过证明可以信赖的大规模优化工具,为我们的决策提供质量保证,为我们增强信心。在理论和实践中,Gurobi优化工具都被证明是全球性能领先的大规模优化器,具有突出的性价比,可以为客户在开发和实施中极大降低成本。
Gurobi可以解决的数学问题包括:线性问题、二次型目标问题、混合整数线性和二次型问题等几乎能解决lingo能解决的问题。
获取Gurobi:
- 登陆官网:gurobi.com/index
- 注册帐号,后续会收到验证邮箱,点击邮箱连接激活账号即可。
- 安装Gurobi与申请License:
- 进入下载中心,下载Gurobi引擎,申请学术许可证。
- 验证License:win下在Win + R键输入License进行验证,mac下在终端中输入相同命令,黑苹果因网卡问题,不能通过验证。
- 安装Gurobi模块:安装Anaconda3,并正确配置conda环境后,在cmd中输入相关指令添加Gurobi地址、安装模块。
快速入门:
- 若读者有较好的python迭代器、生成器习惯,在编写程序时能大大简化。
- 利用Python+Gurobi建立数学规划模型通常按顺序进行:设置变量、更新变量空间、设置目标函数、设置约束条件、执行最优化。
- 辅助函数包括列表推导式/列表解析式、quicksum()、multidict()、tuplelist()、prod()和sum()下标聚合等。
- 添加决策变量使用Model.addVar()和Model.addVars()方法,添加目标函数使用Model.setObjective()和Model.setObjectiveN()方法,添加约束条件使用Model.addConstr()和Model.addConstrs()方法。
- 执行最优化使用Model.optimize()方法。
案例:
- 一般线性规划问题:[公式]
- 利用整数线性规划最优化员工工作表:[公式]
- 非平衡指派问题:[公式]
- LP问题与灵敏度分析:[公式]
- 解数独:决策变量[公式],约束条件[公式]等。
- 求解 CCR-DEA问题:[公式]
- 其他案例:[公式]
