python蝇取最適化4遺伝アルゴリズム3 geatpy実践

、文選良い。

1業務問題

たとえば存在よう業務问题:

  • 1爬虫サーバーでから、kの同じ爬虫つけ上って目標サイト
  • 2ある爬虫类にとって、取りに登るたび一ipを使用する必要に請求
  • 3ある瞬間、爬虫サーバー爬虫类の数によって代行に請求のipが必要で、ip制限が1分と毎日の最大の数の2つの

仮定

  • 1机械から別の爬虫処理速度のように、
  • 2安定目標本体の反応
  • 3同じ代行ipの性能が安定し、

推論

  • 爬虫类の速度で𝑐𝑖次第代行の質ip
  • 安定時間𝑇𝑖ipごとの安定を指す可用时间
  • と使用の上限𝑁𝑖ごと代行を提供することができる最大のipアドレスの数、毎日𝑛𝑖数は1分当たり最大のipを提供できる代行
  • 平均秒速つけ上って企業で裁断爬虫类の速度で𝑐𝑖

目標

  • 最適化代行池と爬虫サーバーの数は、一定のコストで最高のつけ上って効率を获得(つけ上ってスピード)

3整数计画

前の整数プランの方法で完成し、比較に見える数学

from pulp import *
# 函数定义
# 定义函数,输入各项参数,返回变量 x1, x2, y1, y2取值和最优值

#参数:
#服务器起的爬虫数 k1,k2,服务器金额 m1, m2
#两种代理稳定时间 t1, t2,每日使用上限 N1, N2,单位时间可维持的最大ip数 n1, n2,代理金额 M1, M2
#爬虫爬取速度 c1, c2,总预算 M
def linprog(k1, k2, m1, m2, t1, t2, N1, N2, n1, n2, M1, M2, c1, c2, M):
   
    # Create a new model
    f = LpProblem(name="Problem1", sense=LpMaximize)

    # Create variables
    y1 = LpVariable(cat=LpInteger, name="y1", lowBound=0)
    y2 = LpVariable(cat=LpInteger, name="y2", lowBound=0)
    x1 = LpVariable(cat=LpInteger, name="x1", lowBound=0)
    x2 = LpVariable(cat=LpInteger, name="x2", lowBound=0)

    # Set objective
    f += c1 * y1 + c2 * y2, 'Obj'

    # Add constraint
    f += y1 + y2 - k1*x1 - k2*x2 == 0, 'c0'
    f += m1 * x1 + m2 * x2 <= M - M1 - M2 , 'c1'
    f += 24*60/t1 * y1 <= N1, 'c2'
    f += 24*60/t2 * y2 <= N2, 'c3'
    f += y1 <= n1, 'c4'
    f += y2 <= n2, 'c5'

    # Calculate
    status = f.solve()
    
    res = {}
    
    for v in f.variables():
        res[v.name] = v.varValue
    
    res['objective'] = value(f.objective)
    
    return res
    

次にパラメータ賦値に

#服务器起的爬虫数 k1,k2
k1 = 4
k2 = 3

#服务器金额 m1, m2
m1 = 2000
m2 = 600

#两种代理稳定时间 t1, t2
t1 = 2
t2 = 6

#每日使用上限 N1, N2
N1 = 150000
N2 = 580000

#单位时间可维持的最大ip数 n1, n2
n1 = 10
n2 = 10

#代理金额 M1, M2
M1 = 1000
M2 = 1360

#爬虫爬取速度 c1, c2
c1 = 1.2033
c2 = 1.9567

#总预算 M
M = 8000

執行の関数結果をに

# 测下时间 %%timeit
res = linprog(k1, k2, m1, m2, t1, t2, N1, N2, n1, n2, M1, M2, c1, c2, M)
---
16.1 ms ± 79.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each

print('x1 高配爬虫服务器(4个爬虫):%s \nx2 低配爬虫服务器(3个爬虫) %s \ny1 分配给代理商1的爬虫 %s \ny2 分配给代理商2的爬虫 %s \n每秒爬取量:%.2f(%.2f/每天) \n' 
      %(res['x1'], res['x2'], res['y1'], res['y2'], res['objective'],res['objective']*86400))

x1 高配爬虫服务器(4个爬虫):1.0 
x2 低配爬虫服务器(3个爬虫) 5.0 
y1 分配给代理商1的爬虫 9.0 
y2 分配给代理商2的爬虫 10.0 
每秒爬取量:30.40(2626274.88/每天) 

相当の速いスピードは、16 ms。

5まとめ

  • 1遺伝アルゴリズムと整数计画に同様の結果が出た
  • 2アナログの个体数、あるいは超回数が少ない大きな偏差が、満足ができないほど等式の取り締まり
  • 3 gに限定し、木曜、x3 rd-x4の帰国し、进化の回数を適切に減らすことができる(も結果ができる最も优)
  • 4実際に使う時を対象に実装できるのは、そんなにコード
  • 5どうして遺伝アルゴリズムを?
    • 1採用geatpy提供の進化アルゴリズムできる枠組みが最大限にもよく描かれ要求解の問題であり、また、进化アルゴリズムは高度
    • 2また遺伝アルゴリズムのメリットは、目標できる関数书がかなり複雑であるため、複雑な問題を解決することができる、たとえば神経ネットワーク。

根本的な原因は、実は整数计画に属する解析方法、遺伝アルゴリズムを模擬アルゴリズムに属する。

ソースネットワーク 戻る