hmz233 2023-01-07 14:44 采纳率: 100%
浏览 87
已结题

需求一个根据多个纬度的需求量计算出最佳配比的算法

已知现有4种水果:苹果香蕉橘子,它们均含有维生素C糖分能量四种元素,并且四种水果的四种元素的含量分别为:
1)苹果:维生素C:2 水:5 糖分:7 能量:10
2)香蕉:维生素C:1 水:2 糖分:5 能量:9
3)梨:维生素C:2 水:7 糖分:10 能量:11
4)橘子:维生素C:7 水:5 糖分:5 能量:7
一位病人每次必须摄入维生素含量15,20,糖分17,能量25,计算出这位病人需要吃的水果的最佳配比,配比中可以不用包含每一种水果,但必须包含有橘子,且每种水果的数量不做限制

请使用php进行计算

  • 写回答

10条回答 默认 最新

  • |__WhoAmI__| 2023-01-07 15:06
    关注

    可以给一个基于线性规划的解决方案,需要安装一个叫做 GLPK 的库,然后在 PHP 中调用它来解决这个问题。

    线性规划问题的通用形式如下:

    minimize c^T x
    subject to
    A x <= b
    x >= 0
    

    其中 c 是一个列向量,表示目标函数中每个变量的系数;x 是一个列向量,表示每个变量的取值;A 是一个矩阵,表示约束条件中每个变量的系数;b 是一个列向量,表示约束条件的右侧的值。

    对于这个问题,可以设苹果的数量为 $x_1$,香蕉的数量为 $x_2$,梨的数量为 $x_3$,橘子的数量为 $x_4$。根据题意,可以得到以下的线性规划模型:

    minimize 0x1 + 0x2 + 0x3 + 0x4
    subject to
    2x1 + 1x2 + 2x3 + 7x4 >= 15  # 维生素C
    5x1 + 2x2 + 7x3 + 5x4 >= 20   # 水
    7x1 + 5x2 + 10x3 + 5x4 >= 17  # 糖分
    10x1 + 9x2 + 11x3 + 7x4 >= 25 # 能量
    x4 >= 1                        # 必须包含橘子
    x1, x2, x3, x4 >= 0            # 必须是非负整数
    

    然后就可以使用 GLPK 库来解决这个线性规划模型了。

    需要先创建一个新的线性规划模型:

    $lp = glp_create_prob();
    

    然后需要设置目标函数:

    glp_set_obj_dir($lp, GLP_MIN);
    glp_set_obj_coef($lp, 0, 0);
    glp_set_obj_coef($lp, 1, 0);
    glp_set_obj_coef($lp, 2, 0);
    glp_set_obj_coef($lp, 3, 0);
    

    接下来,需要设置约束条件:

    glp_add_rows($lp, 5);
    glp_set_row_name($lp, 1, "vitamin_c");
    glp_set_row_bnds($lp, 1, GLP_LO, 15, 0);
    glp_set_row_coef($lp, 1, 0, 2);
    glp_set_row_coef($lp, 1, 1, 1);
    glp_set_row_coef($lp, 1, 2, 2);
    glp_set_row_coef($lp, 1, 3, 7);
    
    glp_set_row_name($lp, 2, "water");
    glp_set_row_bnds($lp, 2, GLP_LO, 20, 0);
    glp_set_row_coef($lp, 2, 0, 5);
    glp_set_row_coef($lp, 2, 1, 2);
    glp_set_row_coef($lp, 2, 2, 7);
    glp_set_row_coef($lp, 2, 3, 5);
    
    glp_set_row_name($lp, 3, "sugar");
    glp_set_row_bnds($lp, 3, GLP_LO, 17, 0);
    glp_set_row_coef($lp, 3, 0, 7);
    glp_set_row_coef($lp, 3, 1, 5);
    glp_set_row_coef($lp, 3, 2, 10);
    glp_set_row_coef($lp, 3, 3, 5);
    
    glp_set_row_name($lp, 4, "energy");
    glp_set_row_bnds($lp, 4, GLP_LO, 25, 0);
    glp_set_row_coef($lp, 4, 0, 10);
    glp_set_row_coef($lp, 4, 1, 9);
    glp_set_row_coef($lp, 4, 2, 11);
    
    glp_set_row_name($lp, 5, "orange");
    glp_set_row_bnds($lp, 5, GLP_LO, 1, 0);
    glp_set_row_coef($lp, 5, 0, 0);
    glp_set_row_coef($lp, 5, 1, 0);
    glp_set_row_coef($lp, 5, 2, 0);
    glp_set_row_coef($lp, 5, 3, 1);
    

    然后需要设置变量的约束条件:

    glp_add_cols($lp, 4);
    glp_set_col_name($lp, 1, "apple");
    glp_set_col_bnds($lp, 1, GLP_LO, 0, 0);
    glp_set_col_kind($lp, 1, GLP_IV);
    
    glp_set_col_name($lp, 2, "banana");
    glp_set_col_bnds($lp, 2, GLP_LO, 0, 0);
    glp_set_col_kind($lp, 2, GLP_IV);
    
    glp_set_col_name($lp, 3, "pear");
    glp_set_col_bnds($lp, 3, GLP_LO, 0, 0);
    glp_set_col_kind($lp, 3, GLP_IV);
    
    glp_set_col_name($lp, 4, "orange");
    glp_set_col_bnds($lp, 4, GLP_LO, 0, 0);
    glp_set_col_kind($lp, 4, GLP_IV);
    

    需要调用 GLPK 库中的函数来解决这个线性规划问题:

    glp_simplex($lp, NULL);
    

    解决之后,就可以使用以下函数获取每个变量的最优解:

    $x1 = glp_get_col_prim($lp, 1);
    $x2 = glp_get_col_prim($lp, 2);
    $x3 = glp_get_col_prim($lp, 3);
    $x4 = glp_get_col_prim($lp, 4);
    

    可以使用这些变量的值来计算病人需要吃的水果的最佳配比。比如说,可以打印出病人需要吃的苹果、香蕉、梨、橘子的数量:

    printf("Apple: %d\n", $x1);
    printf("Banana: %d\n", $x2);
    printf("Pear: %d\n", $x3);
    printf("Orange: %d\n", $x4);
    

    仅供参考,望采纳,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(9条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月10日
  • 已采纳回答 1月10日
  • 创建了问题 1月7日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因