976 字
5 分钟
[Python/数学模型]给大忙人用的速通二:优化问题一
目录
运输问题
输入数据:每个仓库到各个路线的成本
变量:每条路径的运输量
约束条件:供应量和需求量
目标函数:总运输成本
关键点是供应量大于运输量大于需求量。
输入格式:第一行两个数m,n第2行到第m+1行 对应商品运价第m+2行对应需求量第m+3行对应存货量输出格式:精确到小数点后两位
eg.6 86 2 6 7 4 2 5 94 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 335 37 22 32 41 32 43 3860 55 51 43 41 52
664.00# 运输单价cost = np.zeros((m, n))for i in range(m): for j in range(n): cost[i, j] = float(data[idx + j]) idx += n
# 客户需求量demand = np.array([float(data[idx + i]) for i in range(n)]); idx += n
# 存量supply = np.array([float(data[idx + i]) for i in range(m)]); idx += m
# 定义变量x = cp.Variable((m, n),nonneg = True)
# 定义目标函数objective = cp.Minimize(cp.sum(cp.multiply(cost, x)))
# 定义约束条件constraints = [ cp.sum(x, axis = 1) <= supply, cp.sum(x, axis = 0) >= demand]
# 求解问题prob = cp.Problem(objective, constraints)result = prob.solve()指派问题
输入数据:工人的绩效
变量:工人的工作分配
约束条件:每个工人只能分配一个工作,每个工作只能分配给一个工人
目标函数:总绩效最大化
输入格式:第1行输入一个数,n, 表示方阵的大小
第2行到n+1行,表示n*n的矩阵
输出格式:输出最优绩效,精度控制在小数点后两位。
输入示例:5100,0,100,267,100400,200,100,153,33200,800,100,99,33200,0,100,451,34100,0,600,30,800
输出:2551.00Performance = np.zeros((n, n))
for i in range(n): for j in range(n): Performance[i, j] = float(data[idx]) idx += 1
# 指派变量,x[i, j] 表示第 i 个人是否做第 j 项工作x = cp.Variable((n, n))
constraints = [ x >= 0, x <= 1, cp.sum(x, axis=1) == 1, # 每个人完成一个工作 cp.sum(x, axis=0) == 1 # 每个工作只能安排一个人]
objective = cp.Maximize(cp.sum(cp.multiply(Performance, x)))销售点代理问题
输入数据:相邻矩阵和每个销售点的利润
变量:每个销售点是否被代理
约束条件:每个社区只能设立一个代理点,且只能供应到相邻社区
目标函数:总利润最大化
输入格式:
第1行输入一个树,n, 表示方阵的大小
第2行到n+1行,表示n*n的相邻矩阵
最后一行表示人数
输出格式:输出最佳人数,最终结果为整数。
输入示例:70,1,1,0,0,0,00,0,1,1,1,0,00,0,0,1,0,0,00,0,0,0,1,1,10,0,0,0,0,1,00,0,0,0,0,0,10,0,0,0,0,0,034, 29, 42, 21, 56, 18, 71
输出示例:177A = np.zeros((n, n), dtype=int)for i in range(n): for j in range(n): A[i, j] = int(data[idx]) idx += 1
num = np.array([int(data[idx + i]) for i in range(n)])
# 原矩阵只给了上三角形式,所以转成无向相邻矩阵Adj = ((A + A.T) > 0).astype(int)
# 主对角线设为 0,因为 t[i, j] 只表示“供应相邻社区”,不表示供应本区np.fill_diagonal(Adj, 0)
# t[i, j] = 1 表示在 i 区建点,并且供应相邻的 j 区t = cp.Variable((n, n), boolean=True)
# z[j] = 1 表示第 j 个社区被覆盖# 这里 z 不需要设置 boolean,连续变量即可z = cp.Variable(n)
# 第 i 行有 1,表示第 i 个社区建了代理点selected = cp.sum(t, axis=1)
# 第 j 列有 1,表示第 j 个社区被其他代理点供应served_by_neighbor = cp.sum(t, axis=0)
# 社区 j 被覆盖的次数:# 自己建点覆盖一次 + 被邻居供应覆盖一次covered = selected + served_by_neighbor
constraints = [ # 一共建立两个代理点 cp.sum(t) == 2,
# 每个社区最多建立一个代理点 cp.sum(t, axis=1) <= 1,
# 只能供应相邻社区 t <= Adj,
# 覆盖变量约束 z >= 0, z <= 1, z <= covered] [Python/数学模型]给大忙人用的速通二:优化问题一
https://blog.csdn.net/2501_93882415/article/details/160566637 部分信息可能已经过时











