MindOpt V1.0优化种植计划问题,新的建模方法

简介: 种植计划是指农业生产中针对不同农作物的种植时间、面积和种植方式等方面的规划安排。根据具体情况进行合理的规划和安排,以实现农作物的高产、优质和可持续发展。

在我们的实际生活中很多问题都可以通过数学规划的方法进行建模,实验求解器工具进行求解,比如工业上的排产排程,如何排产效率更高、金融中的投资理财,怎样投资风险更低等等,本篇将介绍一个农业的场景问题——种植计划。

种植计划是指农业生产中针对不同农作物的种植时间、面积和种植方式等方面的规划安排。根据具体情况进行合理的规划和安排,以实现农作物的高产、优质和可持续发展。

问题描述

一个农民承包了6块耕地,共300亩,准备播种小麦、玉米、蔬菜、瓜果这4种农产品。每个地块由于土质地形不一样,单位面积不同作物的收益是不一样的,且地块的面积不一样,如下表所示。请问要如何安排种植计划,可以得到最大的总收益。

表1:单位面积不同收益(收益 image.png , image.png 代表农产品,image.png 代表地块, )

地块1

地块2

地块3

地块4

地块5

地块6

小麦

500

550

630

1000

800

700

玉米

800

700

600

950

90

930

蔬菜

1200

1040

980

860

880

780

瓜果

1000

960

840

650

600

700

表2:地块面积和计划播种面积限制 (image.png代表农产品的播种最大限制,image.png代表每个地块的面积最大限制)

地块1

地块2

地块3

地块4

地块5

地块6

计划播种面积上限

地块面积

42

56

44

39

60

59

小麦

76

玉米

88

蔬菜

40

瓜果

96

然后我们使用线性规划的方法来建模此问题,然后使用求解器工具进行求解。我们可以把线性规划的问题输入求解器的信息转换为:目标、变量、约束。

数学建模

目标:

最大化总收益。

变量:

要安排种植计划,我们这里把每个地块上种不同作物的面积设个未知数,用 image.png 代替。

约束:

由于地块面积不同有限制,计划播种面积也有不同,因此根据未知数可以列出不同未知数的加和是有限制的。
这样,变量和约束就如下表所示。

表3 地块面积 image.png 和约束

地块1

地块2

地块3

地块4

地块5

地块6

播种计划约束

小麦

image.png

image.png

image.png

image.png

image.png

image.png

image.png

玉米

image.png

image.png

image.png

image.png

image.png

image.png

image.png

蔬菜

image.png

image.png

image.png

image.png

image.png

image.png

image.png

瓜果

image.png

image.png

image.png

image.png

image.png

image.png

image.png

地块面积约束

image.png

image.png

image.png

image.png

image.png

image.png


目标的计算公式:

此时,我们就可以把目标定为:求 image.png = sumproduct(收益image.png*面积image.png) 的最大值,即每个小作物地块对应收益总和的最大值:

image.png

即,求解image.png取值等于多少,可得到image.png的值最大。


根据上面的描述,整个问题建模用数学公式表示如下:

image.png


代码建模求解

直接采用求解器的API,需要查阅API文档来理解API的意思,没有建模语言可读性高。请参阅 https://solver.damo.alibaba.com/doc/html/API2/py/index.html 来查看PythonAPI的使用说明。

本篇使用的是MindOpt V1.0最新版本,与V0.2x的接口不同

此外根据1.0版本使用了一种新的建模方法:List数据,使用numpy。


此种方式利用了numpy,addMVar添加一个 numpy.ndarrayMvar。和用addMVar可以矩阵相乘来快速添加多条约束。

此种方法调试的时候容易出错,比如矩阵的方向、维度等。建议可以先小维度数据,生成.lp文件,查看公式是否正确来校验建模的准确性


代码如下:

from mindoptpy import *
import time
import numpy as np
if __name__ == "__main__":
    # 声明参数和集合
    plant = ["小麦","玉米","蔬菜","瓜果"]
    plant_ub = [76,88,40,96]
    field = ["地块1","地块2","地块3","地块4","地块5","地块6"]
    field_ub = [42, 56, 44, 39, 60, 59]
    profit_plant_field =np.array([
    [500 ,550 ,630 ,1000 ,800 ,700],
    [800 ,700 ,600 ,950 ,90 ,930],
    [1200 ,1040 ,980 ,860 ,880 ,780],
    [1000 ,960 ,840 ,650 ,600 ,700]
    ])
    alt_plant = [1,1,1,1] # for矩阵相乘得到加和
    alt_field = [1,1,1,1,1,1] # for矩阵相乘得到加和
    # Step 1. Create a model and change the parameters.
    model = Model(name = 'LP_1_plant2')
    try:
        # Step 2. Input model.
        # Change to maximize problem.
        model.modelsense =  MDO.MAXIMIZE
        # Add variables.
        #vars = {}
        vars = model.addMVar((len(plant),len(field)), obj=profit_plant_field, vtype='C', name="x")
        # Add constraints.
        #cons = {}
        constrs1 = model.addConstr( alt_plant @ vars <= 0)
        constrs1.rhs =  field_ub
        constrs1.lhs =  0
        constrs2 = model.addConstr( vars @ alt_field   <= 0)
        constrs2.rhs = plant_ub
        constrs2.lhs =  0
        # Step 3. Solve the problem and populate the result.
        model.optimize()
        time.sleep(1) #for print
        model.write("model/plant2.lp") #可以输出文件,观察建模是否正确
        model.write("model/plant2.sol")
        if model.Status == MDO.OPTIMAL:
            print("----\n")
            print(f"目标函数是: {model.objval}")
            print("决策变量:")
            x = vars.X
            print(x)
            for p in range(len(plant)):
                for f in range(len(field)):
                    if x[p,f] != 0:
                        print("{0}在{1}的种植面积≈{2:.0f}".format(plant[p],field[f],x[p,f]))
        else:
            print("无可行解!求解结束状态是:(code {0}).".format(model.Status))
    except MindoptError as e:
        print("Received Mindopt exception.")
        print(" - Code          : {}".format(e.code))
        print(" - Reason        : {}".format(e.message))
    except Exception as e:
        print("Received other exception.")
        print(" - Reason        : {}".format(e))
    finally:
        # Step 4. Free the model.
        model.dispose()

本篇可在云上平台查看运行结果,也可对案例复制调试。

相关文章
|
4月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
5月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
2月前
|
算法 Java 数据处理
了解MindOpt优化求解器的各种调用方式、方法
Mindopt是一款高性能优化求解器,专为求解大规模数学规划问题,当前支持线性规划 (LP) 、混合整数线性规划 (MILP) 、非线性规划(QP、SDP)。其强大的算法旨在有效地找到符合规规则约束、目标值最优的最佳解决方案,使其成为运筹学必学工具,广泛用在电商互联网、金融、电力能源、工业制造、交通物流等领域。
|
4月前
|
存储 达摩院 调度
「达摩院MindOpt」优化FlowShop流水线作业排班问题
在企业在面临大量多样化的生产任务时,如何合理地安排流水线作业以提高生产效率及确保交货期成为了一个重要的问题。
「达摩院MindOpt」优化FlowShop流水线作业排班问题
MindOpt APL建模语言自定小义函数的重要性和示例
在编程和建模语言中,函数是一段独立的、可重复使用的代码块,用于执行特定任务。在MindOpt APL中,自定义函数的使用非常重要,因为它们提高了建模过程的效率、可读性和灵活性。
|
5月前
|
人工智能 算法 决策智能
MindOpt云上建模求解平台功能的简单介绍
MindOpt云上建模求解平台是阿里巴巴达摩院研发的一款“优化领域”的云平台。它结合了最新的算法研究和云技术,为用户提供了一个易于使用的界面和强大的后台计算能力。该平台支持广泛的优化问题,包括线性规划、整数规划、非线性规划和混合整数规划等。
|
10月前
|
达摩院 调度
使用达摩院MindOpt优化交通调度_最大化通行量—线性规划问题
在数学规划中,网络流问题是指一类基于网络模型的流量分配问题。网络流问题的目标是在网络中分配资源,使得网络的流量满足一定的限制条件,并且使得某些目标函数最小或最大化。网络流问题通常涉及一个有向图,图中每个节点表示一个资源,每条边表示资源之间的关系。边上有一个容量值,表示该边上最多可以流动的资源数量。流量从源节点开始流出,经过一系列中间节点,最终到达汇节点。在这个过程中,需要遵守一定的流量守恒和容量限制条件。
|
6月前
|
达摩院 数据格式 索引
「达摩院MindOpt APL 建模语言」语法说明 print 将结果写表格文件
不同的编程语言写入表格文件的方式均不相同,下面将展示MindOpt APL建模语言的方式。
|
10月前
|
达摩院 供应链 JavaScript
网络流:优化仓储物流调度问题-达摩院MindOpt
仓储物流调度是指在物流供应链中,对仓储和运输(运输路线、成本)进行协调和安排的过程。主要包含物流计划、运输调度、运发管理、库存管理等重要环节。随着网络、电商行业的迅速发展,仓储物流调度对于企业来说也非常重要,优秀的调度方案可以帮助降低库存成本、物流配送的效率、成本等等等,从而给企业带来降本增效。
网络流:优化仓储物流调度问题-达摩院MindOpt
|
10月前
|
数据可视化
MindOpt优化如何分散化风险并实现收益与风险最优配比问题
资产配置,投资组合是指通过分散投资资金的方式来规避投资过程中的风险。在实际的投资过程中,如何决定投资哪些产品来实现收益最大化和风险最小化是一个关键的问题。
MindOpt优化如何分散化风险并实现收益与风险最优配比问题