mm/农作物种植策略/solve/solve.py

104 lines
3.3 KiB
Python

import pulp as pl
import pandas as pd
from itertools import product
df1 = pd.read_excel (io='附件1.xlsx', sheet_name = "乡村的现有耕地")
df2 = pd.read_excel (io='附件2.xlsx', sheet_name = "2023年的农作物种植情况").fillna(method='ffill')
df3 = pd.read_excel (io='附件2.xlsx', sheet_name = "2023年统计的相关数据")
trans_dict = {"A": "平原地", "B": "林地", "C": "山坡地", "D": "水浇地", "E": "普通大棚", "F": "智能大棚"}
# 地块定义
A = ["A"+str(i) for i in range(1,7)]
B = ["B"+str(i) for i in range(1,15)]
C = ["C"+str(i) for i in range(1,7)]
D = ["D"+str(i) for i in range(1,9)]
E = ["E"+str(i) for i in range(1,17)]
F = ["F"+str(i) for i in range(1,5)]
# 作物定义
# 粮食(豆类)
LDN = ["黄豆", "黑豆", "红豆", "绿豆", "爬豆"]
LDI = list(range(1, 6))
# 粮食
LN = ["小麦", "玉米", "谷子", "高粱", "黍子", "荞麦", "南瓜", "红薯", "莜麦", "大麦"]
LI = list(range(6, 16))
# 水稻类
LSN = ["水稻"]
LSI = list(range(16, 17))
# 蔬菜(豆类)
SDN = ["豇豆", "刀豆", "芸豆"]
SDI = list(range(17, 20))
# 蔬菜水浇地第一季
SN = ["土豆", "西红柿", "茄子", "菠菜", "青椒", "菜花", "包菜", "油麦菜", "小青菜",
"黄瓜", "生菜", "辣椒", "空心菜", "黄心菜", "芹菜"]
SI = list(range(20, 35))
# 蔬菜水浇地第二季
SAN = ["大白菜", "白萝卜", "红萝卜"]
SAI = list(range(35, 38))
# 食用菌普通大棚第二季
SYJN = ["榆黄菇", "香菇", "白灵菇", "羊肚菌"]
SYJI = list(range(38, 42))
K = [1,2] # 季
Y = [y for y in range(2024,2031)] # 年
I = A + B + C + D + E + F # 全部地块
J = LDN + LN + LSN + SDN + SN + SAN + SYJN # 所有作物
V_1 = list(product(A + B + C, LDI + LI, [K[0]], Y))
V_2 = list(product(D, LSI, [K[0]], Y))
V_3 = list(product(D + E + F, SDI + SI, [K[0]], Y))
V_4 = list(product(F, SDI + SI, [K[1]], Y))
V_5 = list(product(D, SAI, [K[1]], Y))
V_6 = list(product(E, SYJI, [K[1]], Y))
V = V_1 + V_2 + V_3 + V_4 + V_5 + V_6
W1 = product(A + B + C + D + E + F, [K[0]], Y) # 第一季
W2 = product(D + E + F, [K[1]], Y) # 第二季
W = list(W1) + list(W2)
# 数据
# 从地块名称转到序号
I2N = {"A": "平旱地", "B": "梯田", "C": "山坡地", "D": "水浇地", "E": "普通大棚", "F": "智慧大棚"}
N2I = {"平旱地": A, "梯田": B, "山坡地": C, "水浇地": D, "普通大棚": E, "智慧大棚": F}
q = {(I2N[df2["种植地块"][i]], df2["作物编号"][i],
K[1] if df2["种植季次"][i] == "第二季" else K[0]):
df3["种植成本/(元/亩)"][i]
for i in range(len(df2))}
def get_data(name:str):
return {(df3["地块类型"][i].strip(), df3["作物编号"][i],
K[1] if df3["种植季次"][i] == "第二季" else K[0]):
df3[name][i]
for i in range(len(df3))}
r = get_data("亩产量/斤")
c = get_data("种植成本/(元/亩)")
p = get_data("销售单价/(元/斤)")
# 问题求解
problem = pl.LpProblem("Agricultural Planting",sense=pl.LpMinimize)
x = pl.Dict([V,Y])
y = pl.LpVariable("y")
z = y > x
problem += min([x,y,z])
for var in vars:
problem += (x+y > 8)
problem += (x+y+z > 13)
problem += (x+z > 7)
problem.solve()
for v in problem.variables():
print(v.name,"=",v.varValue)
print(pl.value(problem.objective))