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()

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

相关文章
|
10月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
10月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
5月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
92 1
|
8月前
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器
|
8月前
|
调度 决策智能
优化问题之优化求解器有哪些主要的评估特性
优化问题之优化求解器有哪些主要的评估特性
|
10月前
|
机器学习/深度学习 算法 测试技术
MindOpt APL向量化建模语法的介绍与应用(1)
向量化建模是一种高效的数学建模和编程技术,它涉及到对向量、矩阵和更高维数组进行操作,以实现操作的同时性和批量处理。在优化和数据分析等领域,向量化建模可以极大地提高计算效率,特别是当涉及到大量的重复计算时。由于向量化建模具有表述优势、操作优势、计算性能、可扩展性等优势,使得其适合于解决很大一类实际问题
|
10月前
|
测试技术 索引
MindOpt APL向量化建模语法的介绍与应用(2)
在数据科学、工程优化和其他科学计算领域中,向量和矩阵的运算是核心组成部分。MAPL作为一种数学规划语言,为这些领域的专业人员提供了强大的工具,通过向量式和矩阵式变量声明以及丰富的内置数学运算支持,大大简化了数学建模和优化问题的处理。在本文中,我们将探索MAPL的这些特性,并且通过示例来展示如何有效使用这些工具。
|
10月前
|
算法 Java 数据处理
了解MindOpt优化求解器的各种调用方式、方法
Mindopt是一款高性能优化求解器,专为求解大规模数学规划问题,当前支持线性规划 (LP) 、混合整数线性规划 (MILP) 、非线性规划(QP、SDP)。其强大的算法旨在有效地找到符合规规则约束、目标值最优的最佳解决方案,使其成为运筹学必学工具,广泛用在电商互联网、金融、电力能源、工业制造、交通物流等领域。
|
10月前
|
存储 达摩院 调度
「达摩院MindOpt」优化FlowShop流水线作业排班问题
在企业在面临大量多样化的生产任务时,如何合理地安排流水线作业以提高生产效率及确保交货期成为了一个重要的问题。
「达摩院MindOpt」优化FlowShop流水线作业排班问题
|
10月前
|
开发框架 自然语言处理 达摩院
MindOpt APL,可以支持调用几十种求解器的建模语言
建模语言可以提供更高级、更灵活的问题描述方式,从而提高问题的理解和求解效率。它可以加速问题的开发和部署过程,促进不同领域之间的合作和交流,从而推动问题求解的进展和创新。

热门文章

最新文章