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