from pulp import*import numpy as np
prob = LpProblem('目标函数和约束', sense=LpMinimize)# 第一份数据集被选中的位置
x = np.array([LpVariable(f"x{i}", cat=LpBinary)for i inrange(df.shape[0])])# 剩余被选中的位置
y =1-x
# 首先尝试产品个数相等
prob +=(x*df.产品个数).sum()==(y*df.产品个数).sum()
prob +=(x*df.销售额).sum()>=(y*df.销售额).sum()# 目标
prob +=(x*df.销售额).sum()-(y*df.销售额).sum()
status = prob.solve()print("求解状态:", LpStatus[prob.status])
r1 = df[[bool(value(i))for i in x]]
r2 = df[[bool(value(i))for i in y]]print(r1.sum(numeric_only=True))print(r2.sum(numeric_only=True))print(r1.sum(numeric_only=True)-r2.sum(numeric_only=True))
display(r1)
display(r2)
from pulp import*import numpy as np
prob = LpProblem('目标函数和约束', sense=LpMinimize)# 第一份数据集被选中的位置
x = np.array([LpVariable(f"x{i}", cat=LpBinary)for i inrange(df.shape[0])])# 剩余被选中的位置
y =1-x
# 产品个数差距小于3
prob +=(x*df.产品个数).sum()-3<=(y*df.产品个数).sum()
prob +=(x*df.产品个数).sum()+3>=(y*df.产品个数).sum()# 两者的销售额的差值的绝对值最小
prob +=(x*df.销售额).sum()>=(y*df.销售额).sum()
prob +=(x*df.销售额).sum()-(y*df.销售额).sum()
status = prob.solve()print("求解状态:", LpStatus[prob.status])
r1 = df[[bool(value(i))for i in x]]
r2 = df[[bool(value(i))for i in y]]print(r1.sum(numeric_only=True))print(r2.sum(numeric_only=True))print(r1.sum(numeric_only=True)-r2.sum(numeric_only=True))
display(r1)
display(r2)
from ortools.linear_solver import pywraplp
# 创建一个mip求解器
solver = pywraplp.Solver.CreateSolver('SCIP')
x = np.array([solver.BoolVar(f'x_{i}')for i inrange(df.shape[0])])
y =1-x
solver.Add((x*df.产品个数).sum()==(y*df.产品个数).sum())
solver.Add((y*df.销售额).sum()>=(x*df.销售额).sum())
solver.Minimize((y*df.销售额).sum()-(x*df.销售额).sum())# 求解结果
status = solver.Solve()
status ={solver.OPTIMAL:"最优解", solver.FEASIBLE:"可行解"}.get(status)print(status)
r1 = df[[bool(i.solution_value())for i in x]]
r2 = df[[bool(i.solution_value())for i in y]]print(r1.sum(numeric_only=True))print(r2.sum(numeric_only=True))print(r1.sum(numeric_only=True)-r2.sum(numeric_only=True))
display(r1)
display(r2)
from ortools.sat.python import cp_model
model = cp_model.CpModel()
x = np.array([model.NewBoolVar(f'x_{i}')for i inrange(df.shape[0])])
y =1-x
model.Add((x*df.产品个数).sum()==(y*df.产品个数).sum())
v =(df.销售额*10).astype("int")
model.Add((x*v).sum()>=(y*v).sum())
model.Minimize((x*v).sum()-(y*v).sum())# 求解结果
solver = cp_model.CpSolver()
status = solver.Solve(model)
status ={cp_model.OPTIMAL:"最优解", cp_model.FEASIBLE:"可行解"}.get(status)print(status)
r1 = df[[bool(solver.Value(i))for i in x]]
r2 = df[[bool(solver.Value(i))for i in y]]print(r1.sum(numeric_only=True))print(r2.sum(numeric_only=True))print(r1.sum(numeric_only=True)-r2.sum(numeric_only=True))
display(r1)
display(r2)