学号后四位:3018
5.4:
点击查看代码
import cvxpy as cp
import numpy as np
import pandas as pd
from scipy.optimize import minimize
import sympy as sp
sp.init_printing(use_unicode=True)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['Times New Roman + SimSun + WFM Sans SC']
plt.rcParams['mathtext.fontset']='cm'
plt.rcParams['axes.unicode_minus']=False
plt.rcParams['figure.dpi'] = 200
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
a = np.arange(100, 0, -1)
x = cp.Variable(100, nonneg=True)
obj = cp.Maximize(cp.sum(cp.sqrt(x)))
cons = [
x[0] <= 10,
x[0] + 2*x[1] <= 20,
x[0] + 2*x[1] + 3*x[2] <= 30,
x[0] + 2*x[1] + 3*x[2] + 4*x[3] <= 40,
cp.sum(cp.multiply(a, x)) <= 1000,
]
prob = cp.Problem(obj, cons)
prob.solve(solver='ECOS')
print(f'最优解为:{x.value}'); print(f'最优值为:{prob.value}')
print("xuehao3018")
5.5:
点击查看代码
import cvxpy as cp
import numpy as np
import pandas as pd
from scipy.optimize import minimize
import sympy as sp
sp.init_printing(use_unicode=True)
import matplotlib.pyplot as plt
def obj(x):
x1, x2, x3 = x
return (-1)*(2*x1 + 3*x1**2 + 3*x2 + x2**2 + x3)
def ineq(x):
x1, x2, x3 = x
return [
10 - (x1 + 2*x1**2 + x2 + 2*x2**2 + x3),
50 - (x1 + x1**2 + x2 + x2**2 - x3),
40 - (2*x1 + x1**2 + 2*x2 + x3),
x1 + 2*x2 - 1,
]
def eq(x):
x1, x2, x3 = x
return x1**2 + x3 - 2
x0 = np.random.randn(3)
cons = [
{'type': 'ineq', 'fun': ineq},
{'type': 'eq', 'fun': eq},
]
bd = [(0, None), (None,None), (None, None)]
ret = minimize(obj, x0, constraints=cons, bounds=bd)
print(ret)
print('-'*100)
print("最优值为:", -ret.fun)
print("xuehao3018")
5.7:
点击查看代码
import numpy as np
demands = [40, 60, 80]
max_production = 100
total_demand = sum(demands)
dp = np.full((4, total_demand + 1), float('inf'))
dp[0][0] = 0
prev_production = np.full((4, total_demand + 1), -1)
for i in range(1, 4):
prev_demand = sum(demands[:i-1])
for j in range(total_demand + 1):
if j < prev_demand + demands[i-1]:
continue
for x in range(max(0, j - prev_demand - demands[i-1] + 1), min(max_production + 1, j - prev_demand + 1)):
production_cost = 50 * x + 0.2 * x**2
storage_cost = 4 * (j - prev_demand - x)
total_cost = dp[i-1][j-x] + production_cost + storage_cost
if total_cost < dp[i][j]:
dp[i][j] = total_cost
prev_production[i][j] = x
min_cost = float('inf')
final_state = -1
for j in range(total_demand, total_demand + 1):
if dp[3][j] < min_cost:
min_cost = dp[3][j]
final_state = j
production_plan = [0] * 3
current_state = final_state
for i in range(3, 0, -1):
production_plan[i-1] = prev_production[i][current_state]
current_state -= prev_production[i][current_state]
print(f"最小总费用为: {min_cost} 元")
print("生产计划为:")
for i, plan in enumerate(production_plan, 1):
print(f"第{i}季度生产: {plan} 台")
print("xuehao3018")