1数理モデル線形計画

あなたは、線形計画を解くことができます

 

A.線形計画

第一章線形計画 - 「長官はクイを守る数理モデル化アルゴリズムとアプリケーション」を参照してください。 

プログラミングの問題線形最も一般的な解決:

パルプは、パッケージを呼び出します

import pulp
#目标函数的系数
z = [2, 3, 1]
#约束
a = [[1, 4, 2], [3, 2, 0]]
b = [8, 6]
#确定最大化最小化问题,最大化只要把Min改成Max即可
m = pulp.LpProblem(sense=pulp.LpMinimize)
#定义三个变量放到列表中
x = [pulp.LpVariable(f'x{i}', lowBound=0) for i in [1,2,3]]
#定义目标函数,lpDot可以将两个列表的对应位相乘再加和
#相当于z[0]*x[0]+z[1]*x[0]+z[2]*x[2]
m += pulp.lpDot(z, x)

#设置约束条件
for i in range(len(a)):
    m += (pulp.lpDot(a[i], x) >= b[i])
#求解
m.solve()
#输出结果
print(f'优化结果:{pulp.value(m.objective)}')
print(f'参数取值:{[pulp.value(var) for var in x]}')

#output:
#优化结果:7.0
#参数取值:[2.0, 0.0, 3.0]

同様に、存在する場合x_1+2x_2+4x_3=101、このような場合は、

A_eq = [1,2,4]
b_eq = 101
m += (pulp.lpDot(A_eq, x) == b_eq)

第二に、輸送問題

 

パルプパッケージ符号変調

import pulp
import numpy as np
from pprint import pprint

def transportation_problem(costs, x_max, y_max):

    row = len(costs)
    col = len(costs[0])

    prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMaximize)

    var = [[pulp.LpVariable(f'x{i}{j}', lowBound=0, cat=pulp.LpInteger) for j in range(col)] for i in range(row)]

    flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x]

    prob += pulp.lpDot(flatten(var), costs.flatten())

    for i in range(row):
        prob += (pulp.lpSum(var[i]) <= x_max[i])

    for j in range(col):
        prob += (pulp.lpSum([var[i][j] for i in range(row)]) <= y_max[j])

    prob.solve()

    return {'objective':pulp.value(prob.objective), 'var': [[pulp.value(var[i][j]) for j in range(col)] for i in range(row)]}


if __name__ == '__main__':
    costs = np.array([[500, 550, 630, 1000, 800, 700],
                       [800, 700, 600, 950, 900, 930],
                       [1000, 960, 840, 650, 600, 700],
                       [1200, 1040, 980, 860, 880, 780]])

    max_plant = [76, 88, 96, 40]
    max_cultivation = [42, 56, 44, 39, 60, 59]
    res = transportation_problem(costs, max_plant, max_cultivation)

    print(f'最大值为{res["objective"]}')
    print('各变量的取值为:')
    pprint(res['var'])

#output:
#最大值为284230.0
#各变量的取值为:
#[[0.0, 0.0, 6.0, 39.0, 31.0, 0.0],
# [0.0, 0.0, 0.0, 0.0, 29.0, 59.0],
# [2.0, 56.0, 38.0, 0.0, 0.0, 0.0],
# [40.0, 0.0, 0.0, 0.0, 0.0, 0.0]]

 

第三に、割り当て問題

https://www.jianshu.com/p/9be417cbfebb

https://blog.csdn.net/your_answer/article/details/79160045

概要割り当て問題:

実際には、このような問題が発生します、完了n個の個々の1を必要とし、それぞれが異なるタスクのn個の項目が存在している、誰もがタスクを完了するために同じ時間ではありません。だから、問題は、割り当てタスクにそれは時間の最小値をとるようにどのように、そこにあります。

人気の用語は、N * N行列、選択n個の要素、行要素ごとに1つのそれぞれ、およびそう最小です。

図は次のとおりです。

問題の割り当て本質:

行が1行(列)の行列、最適解と元の行列の最適解を与える最小の要素、マトリクス縮小の個別要素(列)から減算されている場合、最適な割り当ての問題は、そのような性質を有しています同じ。

ハンガリー、フランス:

 

 

何線が描画されなくなるまで(3)が一時的に覆われたワイヤ要素が繰り返される(1)(2)を参照します。

 

(4)(2)によれば、要素数が0、0を分析見出さn個の独立した要素は、成功であり、nは、本例では(以下フェイル以上であり、n = 5、それが割り当て後の最初の試験を見ることができるが見つかりました0 4つの別々の要素を満たすには、存在していないです)

4.カバー0線画:

目標:すべての要素0をカバーするために少なくとも数直線を行うには、0定額数は独立した要素の数です。

注:これは、3つの異なると線である線を描画しない貪欲法、など

1 0 0

1 1 0

1 0 1

最初の横延伸した場合、図面は、2つだけ本当の三行を持って、最初のドローが垂直である場合には、行列の転置同様にリアを。

 

ステップ3の位置は独立した要素を取得して0

公開された23元の記事 ウォン称賛20 ビュー40000 +

おすすめ

転載: blog.csdn.net/GAIYA2050/article/details/99829450
おすすめ