线性规划Python实现:使用库函数和不使用库函数进行单纯形法(大M法)线性规划

使用库函数和不使用库函数进行单纯形法(大M法)线性规划

单纯形法的原理

可以参考:线性规划之单纯形法【超详解+图解】.
大M法(big M method)是线性规划问题的约束条件(=)等式或(≥)大于型时,使用人工变量法后,寻找其初始基可行解的一种方法。
应用单纯形法在改进目标函数的过程中,如果原问题存在最优解,必然使人工变量逐步变为非基变量,或使其值为零。否则,目标函数值将不可能达到最小或最大。在迭代过程中,若全部人工变量变成非基变量,则可把人工变量所在的列从单纯形表中删去,此时便找到原问题的一个初始基可行解。若此基可行解不是原问题的最优解,则继续迭代,直至所有的检验数都小于等于0,求得最优解为止。(来源百度百科)
用单纯形法求解线性规划要先将线性规划变为标准形式,然后添加人工变量进行求解
max 2 x 1 + x 2 + x 3 2x_1+x_2+x_3 2x1+x2+x3
s . t = { − 2 x 2 ≥ 2 x 1 − x 2 + x 3 = 2 x 2 − x 3 ≤ 1 x 1 , x 2 , x 3 ≥ 0 s.t=\begin{cases} -2x_2\geq 2 \\\\ x_1-x_2+x_3= 2 \\\\ x_2-x_3\leq 1 \\\\ x_1,x_2,x_3\geq0 \end{cases} s.t=2x22x1x2+x3=2x2x31x1,x2,x30
变为标准形式
max 2 x 1 + x 2 + x 3 + 0 x 4 + 0 x 5 2x_1+x_2+x_3+0x4+0x5 2x1+x2+x3+0x4+0x5
s . t = { − 2 x 2 − x 4 = 2 x 1 − x 2 + x 3 = 2 x 2 − x 3 + x 5 = 1 x 1 , x 2 , x 3 ≥ 0 s.t=\begin{cases} -2x_2-x4= 2 \\\\ x_1-x_2+x_3= 2 \\\\ x_2-x_3+x5= 1 \\\\ x_1,x_2,x_3\geq0 \end{cases} s.t=

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个简单的实现,但是需要先确定一下数据集的格式。假设数据集为一个n行m列的二维数组,其中n表示样本数,m表示特征数。对于Kmeans聚类,需要指定聚类簇的数目K。 首先,需要初始化K个聚类中心,可以随机选择K个样本点作为聚类中心。然后,将每个样本点分配到距离最近的聚类中心所在的簇中。接着,更新每个簇的聚类中心,将其设置为该簇内所有样本的平均值。重复以上两步,直到聚类中心不再变化或达到预设的最大迭代次数。 最后,可以将每个样本点在二维平面上进行可视化,根据所属的簇不同,使用不同的颜色进行区分。 以下是一个简单的实现,仅供参考: ```python import random import numpy as np import matplotlib.pyplot as plt def kmeans(data, K, max_iter=100): n, m = data.shape centers = random.sample(list(data), K) # 随机选择K个样本点作为聚类中心 for i in range(max_iter): clusters = [[] for _ in range(K)] for j in range(n): dists = [np.linalg.norm(data[j]-c) for c in centers] cluster_idx = np.argmin(dists) clusters[cluster_idx].append(data[j]) new_centers = [np.mean(c, axis=0) for c in clusters] # 更新聚类中心 if np.allclose(centers, new_centers): # 判断聚类中心是否变化 break centers = new_centers # 可视化 colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k'] plt.figure(figsize=(8, 6)) for i in range(K): x, y = zip(*clusters[i]) plt.scatter(x, y, c=colors[i%len(colors)], label=f'Cluster {i+1}') plt.scatter(*zip(*centers), s=100, marker='*', c='black', label='Centers') plt.legend(loc='best') plt.show() # 测试 data = np.random.randn(100, 2) kmeans(data, K=3) ``` 该实现使用了numpy库进行矩阵计算,但没有使用任何与Kmeans聚类相关的库函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值