运用Gurobi优化:有氧运动和无氧运动对减脂增肌效果优化

        节食与运动与人体脂肪储备和消耗息息相关,通过节食制造热量缺口或通过运动增大热量消耗是目前减脂最有效的方法。根据能量的平衡原理,任何时间段内由于体重的改变所引起的人体能量的变化等于这段时间内摄入与消耗的能量之差。 模型的建立即是从人体节食程度和运动入手,减肥的优化模型,分别讨论找出节食与运动对减肥的最有效途径。减肥人士只有对个人的消耗模式做出正确的判断,才能做到有的放矢,切实找到减肥的最佳途径。

        该模型主要通过给定的有氧运动与无氧运动消耗热量的数据,通过设定减脂目标,对运动时间和摄入热量进行约束,最大化有限时间内消耗的热量。

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值