104 lines
3.3 KiB
Python
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)) |