东汉末年分三国,烽火连天不休。
刘关张桃园结义,招兵志平暴乱。
兵源
|
冯家村
|
刘家村
|
赵家村
|
简家村
|
单人战力
|
6
|
10
|
8
|
40
|
单人花费
|
13
|
21
|
17
|
100
|
总人数
|
1000
|
400
|
500
|
150
|
招兵目标:组建一只强大的军队
现有经费:10000
三个兄弟意见
关羽
主张:招募最好又最贵的士兵
● 100名简家村士兵
● 总战斗力为4000
● 经费剩余0
张飞
主张:大量最便宜的士兵
● 769名冯家村士兵
● 战斗力4614
● 经费剩余3
刘备
主张:用有限的经费,通过组合招募,招募一只最强战斗力的军队
既然如此,那就创建一个数学模型!
首先设置参数
F:代表在冯家村需要招募的人数
L:代表在刘家村需要招募的人数
Z:代表在赵家村需要招募的人数
J:代表在简家村需要招募的人数
目标函数
maximize 6F + 10L + 8Z +40J
约束条件
budget = 10000
13F + 21L + 17Z + 100J <= budget
0 <= F <= 1000
0 <= L <= 400
0 <= Z <= 500
0 <= J <= 150
通过以上的梳理,可以找一个优化问题常用的求解器。使用相应语言进行建模,进行求解输出。
% 定义参数(parameter)
int: budget = 10000;
% 定义约束(constrain)
constraint 13*F + 21*L + 17*Z + 100*J <= budget;
% 定义决策变量(decision variable)
var 0..1000: F;
var 0..400: L;
var 0..500: Z;
var 0..150: J;
% 定义目标(objective)
solve maximize 6*F + 10*L + 8*Z + 40*J;
% 定义输出格式
output ["F = \(F), L = \(L), Z = \(Z), J = \(J)\n"];
最终可得:F=0,L=392 ,Z=104,J=0
最优方案
● 392名刘家村士兵、104名赵家村士兵1768
● 战斗力4753
● 经费剩余0