2023年数维杯国际大学生数学建模挑战赛
D题 洗衣房清洁计算
原题再现:
洗衣房清洁是人们每天都要做的事情。洗衣粉的去污作用来源于一些表面活性剂。它们可以增加水的渗透性,并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分子的存在,洗衣粉可以发挥其双重功能。表面活性剂分子的一端是亲脂性的,它吸引污垢并排斥水,而另一端是亲水性的,吸引水分子。当洗衣粉倒入水中时,表面活性剂分子的亲脂性部分强烈粘附在任何未充满水的表面,例如被洗涤的物体表面(由于身体或织物表面)。同时,亲水部分排斥油性物质。它削弱了维持水分子结合的分子间力(导致水形成液滴的力,就像包裹在弹性膜中一样),使单个分子渗透到待清洁物体的表面和污垢颗粒之间。因此,可以说表面活性剂降低了水的表面张力。洗衣机或手摩擦的机械作用会导致表面上被表面活性剂分子包围的污垢颗粒脱落,并且污垢颗粒粘附在表面活性剂的亲脂性部分。这会导致在冲洗阶段清除仍悬浮在物体表面的污垢颗粒。
在实践中,从小规模的家庭经营到酒店和专业机构的专业经营,需要考虑的问题是:如何以更低的成本使洗衣房干净整洁?这个看似简单的人生问题包含着深刻的数学原理。请建立一个适当的数学模型来解决以下问题。
1.一件附着污垢的衣服,如果给定污垢的量和可用的水量,并且污垢在第k次洗涤时在水中的溶解度为A_k,其中A_1=0.80,A_k=0.5a_k-1,k=2,3,L。在不考虑其他因素的情况下,清洁它的最佳方法是什么?给出关于洗涤次数和每次用水量的最优解,并讨论a_k、初始污垢量和可用水量对目标的影响。
2.假设每次洗涤所需时间相同,且可用水量不受限制,则最终污垢残留量应不超过初始污垢量的千分之一,其他条件与问题1类似。提供最具时间效率的清洁计划,并分析a_k和初始污垢量对最佳解决方案的影响。
3.有几件衣服上的污垢类型和数量如表1所示。现有的十种洗涤剂,各种洗涤剂在污垢上的溶解度,以及洗涤剂的单价如表2所示。如果水费是每吨3.8元,尽量既节省成本又有一个好的清洁计划。
4.有几种不同材料的衣服,每种衣服上的污垢类型和数量如表3所示。考虑到材料、颜色等方面的差异,有些衣服不能混合洗涤,如表4所示。在与问题2相同的条件下,尝试提供具有成本效益和高效的清洁计划。
注:本次比赛只考虑传统的水洗方式。
术语定义:
1.溶解度a_k:表示在第k次洗涤过程中,等量洗涤剂溶解的污垢相对于初始污垢量的比例。
2.初始污垢量:表示清洁前衣服上的污垢量,单位为克。
整体求解过程概述(摘要)
随着生活水平的提高,人们对生活质量的要求不断提高。洗衣是日常生活中不可或缺的一部分,因此优化洗衣计划成为人们高度关注的话题。本文旨在利用动态规划模型和迭代方法对洗衣计划进行数学建模研究,以提高洗衣效率,减少资源浪费,最终实现节能环保目标[1]。
基于问题一,清洁次数和每次用水量的最佳解决方案是什么?这涉及到污垢的溶解度和所用水量之间的平衡。通过建立动态规划模型和迭代方法,以及使用Python求解器来解决清洁附着污垢的衣服的最佳方法问题,我们还可以讨论污垢溶解度、初始污垢量和可用水对目标的影响。通过该模型,我们可以发现最佳的清洗方法是每次用0.20吨水清洗两次。
基于问题二,我们需要找到最省时的清洁计划,以确保最终残留物不超过初始污垢量的千分之一。为了解决这个问题,我们建立了一个指数衰减模型,并使用Python绘制了洗涤次数和时间之间的关系曲线和点集图。我们确定最小清洗次数为6次,最短清洗时间尚待确定。此外,我们可以从洗涤次数与时间之间的关系曲线和点集图推断,影响洗涤时间的主要因素是溶解度。初始污垢量不影响计算,因为在指数衰减模型中,污垢去除的比例与初始污垢量无关。
基于问题三,以及表1和表2的数据,我们需要找到一种能够有效清洁衣服上污垢并节省成本的洗涤剂组合。因此,我们可以使用多目标规划模型来解决这个问题。通过使用Matlab生成的约束方法和成本效益分析图,我们可以发现洗涤剂的最佳组合是洗涤剂1和洗涤剂3。当剩余污垢为0时,最低成本为667.72,选择19.13克洗涤剂1和150.96克洗涤剂3;当剩余污垢为原始污垢量的千分之一时,最低成本为667.05,选择19.11克洗涤剂1和150.81克洗涤剂3。
根据问题四,我们面对的是由不同材料制成的衣服,每种衣服都有不同类型和数量的污垢,如表3所示。由于材料、颜色等方面的差异,有些衣服不能一起洗,如表4所示。因此,我们需要使用线性规划模型制定一个经济高效的清洁计划,以优化洗涤剂的选择和使用、洗衣机运行时间和温度设置,从而最大限度地降低清洁成本和资源消耗。我们将使用Python对表3和表4进行数据预处理和分析,以制定分类清洁计划。使用这些方法,我们可以设计出一个经济高效的清洁方案,最佳的清洁剂组合是清洁剂6、清洁剂7和清洁剂8,相应的成本为0.33元。
问题分析:
问题一分析
对于问题1:考虑到可用的污垢和水的数量,以及污垢在水中的溶解度随着洗涤时间的变化而变化,如何找到最佳的清洁方法。根据所提供的信息,污垢在水中的溶解度与洗涤次数成比例变化,最初为0.80,之后每次洗涤为前一次洗涤的一半。我们通过建立动态规划模型来解决清洁附着污垢的衣服的最佳清洁方式问题,同时讨论污垢溶解、初始污垢量和可用水对目标的影响。
问题二分析
对于问题2:该问题需要一个最节省时间的清洁计划,并分析清洁计划中的参数和初始污垢体积对最佳解决方案的影响。我们采用指数衰减模型和Python编程语言软件来选择最小的清洗次数,以确定最短的清洗时间。
问题三分析
对于问题3:根据表1和表2中的信息,我们可以选择最合适的洗涤剂来清洁每种类型的污垢。然后我们可以计算每个清洁方案的成本,包括洗涤剂和水费。接下来,我们比较不同清洁方案的成本,以找到节省成本最高的清洁解决方案。最后,我们可以制定一个清洁时间表,以确保衣服能够有效清洁,同时节省成本。
问题四分析
对于问题4:我们需要分析不同衣服的材质、颜色和污垢,并结合表3和表4中的信息。然后,在问题2下,制定一个具有成本效益的清洁计划,以确保不同的衣物方法有效且具有成本效益。这可能包括分别洗涤不同材料和颜色的衣服,以及选择合适的洗涤剂和洗涤程序。它还需要考虑在清洁过程中对衣服的保护,以避免损坏或褪色。
模型假设:
1.每次洗涤后,残余污垢的溶解作为给定的减少函数而减少。
2.理论上,可以进行无限制的洗涤,直到达到某种效果。
3.假设使用的每种水都能达到其最大的洗涤效率,而不考虑水的回收。
4.最终污垢残留量应为初始污垢量的千分之一。
5.假设不同类型的污垢对不同清洁剂的反应是特定的,即某些清洁剂对某些类型的污垢具有更好的清洁效果。
6.假设清洁过程中的环境条件(如温度、湿度)和操作条件(如清洁时间、机器类型)是恒定的,不会影响清洁效果。
模型的建立与求解整体论文缩略图
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False # 计算污垢在水中的溶解度
def calculate_dissolution(a1, k):
ifk == 1: return a1
else: return 0.5 * calculate_dissolution(a1, k- 1)
# 计算不同清洗次数下的溶解度
def calculate_dissolution_for_cleans(cleans, a1): result = []
for c in cleans: result.append(calculate_dissolution(a1, c))
return result
# 分段函数
defpiecewise_function(x, a1): y = np.where(x < 2, a1, calculate_dissolution(a1, 2))
for i in range(2, 11): y = np.where(x == i, calculate_dissolution(a1, i), y)
return y
# 绘制曲线
defplot_curve(a1): cleans = np.arange(1, 11)
dissolutions = calculate_dissolution_for_cleans(cleans, a1) x = np.arange(1, 11, 0. 1)
y = piecewise_function(x, a1)
plt.plot(cleans, dissolutions, 'ro', label='清洗次数')
plt.plot(x, y, label=' plt.xlabel(' ')
plt
.ylabel(
'污垢溶解度')
plt.title(' plt.legend()
plt.show()
# 主程序
a1 = 0.80
plot_curve(a1)
import numpy as np
import matplotlib.pyplot as plt
def g(a k 1, x_k): return 0.5 * a_k_ 1
def calculate_dissolution(a_ 1, x, W): n = len(x)
a = [a_ 1]
for k in range(2, n+1):
a_k = g(a[k-2], x[k- 1])
a. append(a_k)
return a
def calculate_ cleaning_ effect(a , x ) :
E = np.prod(a)
return E
defplot_curve(a , x) :
plt.plot(x , a, 'b-' , label= 'Dissolution')
plt.xlabel('Water Usage')
plt.ylabel('Dissolution')
plt.title( 'Dissolution vs Water Usage')
plt. legend()
plt.show()
# Example usage
a_ 1 = 0.80
x = [0. 1, 0.2, 0.3, 0.4, 0.5]
W = 0.5
a = calculate_dissolution(a_ 1, x, W)
E = calculate_cleaning_effect(a , x)
plot_curve(a , x)
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[ 'font.sans-serif'] = [ 'SimHei']
plt.rcParams[ ' axes. unicode_ minus' ] = False
# Define parametersfor theformula
ak = 0.5
t = 1
# Calculate the minimum number ofwashings n_min = np.ceil(np.log(1000) / (ak * t))
# Generate the time range
time = np.linspace(0, 10, 100)
# Calculate the curve value
curve = np.exp(-ak * n_min * time)
# Plot the curve plt.plot(time, curve)
plt. xlabel( 'Washing Time (Unit: Time Unit) ' )
plt.ylabel('Washing Frequency')
plt.title( 'Relationship between Washing Frequency and Time')
plt.legend([ 'Change of Washing Frequency over Time'])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
def shortest_cleaning_time(soil, water_limit):
# 初始化数组
n = len(soil) + 1 # 增加一次不洗涤的情况
dp_time = np.zeros(n) + np.inf # 设置初始值为无穷大
dp_time[0] = 0 # 不洗涤的时间为0
dp_count = np.zeros(n) # 记录每次洗涤的次数
# 计算每次洗涤后的时间
for i in range(1 , n) :
forj in range(water_limit + 1):
ifj >= soil[i - 1]: # 有足够的水溶解污垢
dp_time[i] = min(dp_time[i], dp_time[i - 1] + 0.5) # 0.5 为每次洗涤增
加的
时 间
dp_count[i] = dp_count[i - 1] + 1 # 记录洗涤次数
break # 不够水则跳出循环,不洗涤该次
else:
dp_time[i] = dp_time[i - 1] + 0.5 # 默认情况下,洗涤时间是前一次洗
涤
时间的 0. 5 倍
dp_count[i] = dp_count[i - 1] # 不进行洗涤,洗涤次数不变
return dp_time, dp_count # 返回最节约时间的清洁计划和相应的洗涤次数
soil = np.array([1, 2, 3, 4, 5]) # 示例污垢量
water_limit = 10 # 示例可用水量
times, counts = shortest_ cleaning_time(soil, water_limit)
# 绘制散点图
plt.scatter(range(len(times)) , times, color= 'blue')
plt. scatter(range(len( counts)) , counts, color= 'red')
plt. xlabel( 'Wash Time' )
plt.ylabel( 'Time/Count')
plt.title( 'Shortest Cleaning Time Plan')
plt.show()