节食与运动与人体脂肪储备和消耗息息相关,通过节食制造热量缺口或通过运动增大热量消耗是目前减脂最有效的方法。根据能量的平衡原理,任何时间段内由于体重的改变所引起的人体能量的变化等于这段时间内摄入与消耗的能量之差。 模型的建立即是从人体节食程度和运动入手,减肥的优化模型,分别讨论找出节食与运动对减肥的最有效途径。减肥人士只有对个人的消耗模式做出正确的判断,才能做到有的放矢,切实找到减肥的最佳途径。
该模型主要通过给定的有氧运动与无氧运动消耗热量的数据,通过设定减脂目标,对运动时间和摄入热量进行约束,最大化有限时间内消耗的热量。
运用Anaconda软件和Gurobi包建立模型来进行优化,首先在Windows环境下打开Anaconda下的Spyder面板导入Gurobi,导入数据并进行格式化之后建立线性优化模型:
第一步:定义模型名字和模型中的全部变量, 用AddVar定义单个变量,AddVars定义多个变量;
第二步:用SetObjective定义好目标函数;
第三步:定义好全部约束,用AddConstr定义单个约束,AddConstrs定义多个约束
第四步:运行和优化,打印或保存优化后的结果。
import openpyxl as xl import pandas as pd import numpy as np from gurobipy import * #data #o_sports data datafile=xl.load_workbook("finaldata.xlsx") a=datafile['Sheet1'] o_sports_name=[] o_sports_cons=[] for i in range(2,31+1): o_sports_name.append(str(a.cell(row=i,column=1).value)) o_sports_cons.append(a.cell(row=i,column=5).value) #no_sports data b=datafile['Sheet2'] no_sports_name=[] no_sports_effect=[] for i in range(2,10+1): no_sports_eff=[] no_sports_name.append(str(b.cell(row=i,column=1).value)) for j in range(2,15+1): no_sports_eff.append(b.cell(row=i,column=j).value) no_sports_effect.append(no_sports_eff) #person_data c=datafile['Sheet4'] input_list=[] for i in range(2,6+1): input_list1=[] for j in range(2,7+1): input_list1.append(float(c.cell(row=i,column=j).value)) input_list.append(input_list1) input_o_list2=[] input_no_list2=[] input_o_list=[] input_no_list=[] for i in range(2,6+1): input_o_list1=[] input_no_list1=[] input_o_list1.append(list(c.cell(row=i,column=8).value)) input_no_list1.append(list(c.cell(row=i,column=9).value)) input_o_list2.append(input_o_list1) input_no_list2.append(input_no_list1) for i in range(5): input_o_list3=[] for j in range(len(input_o_list2[i][0])): if input_o_list2[i][0][j]!=",": input_o_list3.append(int(input_o_list2[i][0][j])) input_no_list3=[] for j in range(len(input_no_list2[i][0])): if input_no_list2[i][0][j]!=",": input_no_list3.append(int(input_no_list2[i][0][j])) input_o_list.append(input_o_list3) input_no_list.append(input_no_list3) target_cons=[] day_cons=[] meal=[] for i in range(len(input_list)): if input_list[i][0]==0: target_cons.append(4000*input_list[i][4]) if input_list[i][1]<=30: day_cons.append(14.6*input_list[i][2]+450) elif 30<input_list[i][1]<=60: day_cons.append(8.6*input_list[i][2]+830) else: day_cons.append(10.4*input_list[i][2]+600) else: target_cons.append(int(3850)*input_list[i][4]) if input_list[i][1]<=30: day_cons.append(15.2*input_list[i][2]+680) elif 30<input_list[i][1]<=60: day_cons.append(11.5*input_list[i][2]+830) else: day_cons.append(13.4*input_list[i][2]+490) meal.append(day_cons[i]-input_list[i][3]) N = len(o_sports_name) T=len(no_sports_effect) for i in range(len(input_list)): effect=[] for j in range(len(input_no_list[i])): effect1=[] for k in range(len(input_o_list[i])): effect1.append(no_sports_effect[input_no_list[i][j]][input_o_list[i][k]]) effect.append(effect1) # model m = Model('keep flim') # decision variables x = m.addVars(len(input_o_list[i]),ub=45,vtype=GRB.INTEGER,name='x') p = m.addVars(len(input_no_list[i]),len(input_o_list[i]),ub=60,vtype=GRB.INTEGER, name='p') # objectie m.setObjective(quicksum(x[j]*o_sports_cons[int(input_o_list[i][j])] for j in range(len(input_o_list[i])))+ quicksum((p[k,j]-20)* effect[k][j]*o_sports_cons[int(input_o_list[i][j])] for k in range(len(input_no_list[i])) for j in range(len(input_o_list[i]))), GRB.MAXIMIZE) # constraints m.addConstr(x.sum()+p.sum()<=input_list[i][5]) # optimize m.optimize() # print solutions if m.status == GRB.OPTIMAL: o_sports = [o_sports_name[input_o_list[i][s]]+str(x[s].x) for s in range(len(input_o_list[i])) if x[s].x !=0] print('the o_sports:', o_sports) no_sports = [no_sports_name[input_no_list[i][s]]+'-'+o_sports_name[input_o_list[i][k]] + str(p[s,k].x) for s in range(len(input_no_list[i])) for k in range(len(input_o_list[i])) if p[s,k].x !=0] print('the no_sports:', no_sports) if m.objVal+7*input_list[i][3]>=target_cons[i]: print("可以完成目标") else: print("不能完成目标") print("增大每日热量缺口",int((target_cons[i]-m.objVal)/7)) print("建议每日摄入热量为",meal[i]-int((target_cons[i]-m.objVal)/7))