整數規劃的模型與線性規劃基本相同,只是額外的新增了部分變數為整數的約束。
2. 求解步驟
整數規劃求解的基本框架是分支定界法(branch and bound,bnb)。首先去除整數約束得到「鬆弛模型」,使用線性規劃的方法求解。若有某個變數不是整數,在鬆弛模型上分別新增約束:
x <= floor(a)
和
x >= ceil(a)
然後再分別求解,這個過程叫做分支。當節點求解結果中所有變數都是整數時,停止分支。這樣不斷迭代,形成了一棵樹。
定界,指的是葉子節點產生後,相當於給問題定了乙個下界。
之後在求解過程中一旦某個節點的目標函式值小於這個下界,那就直接pass,不用再進行分支了;每次新產生葉子節點,則更新下界。
3. python演算法實現
import math
from scipy.optimize import linprog
import sys
def integerpro(c, a, b, aeq, beq,t=1.0e-12):
res = linprog(c, a_ub=a, b_ub=b, a_eq=aeq, b_eq=beq)
if (type(res.x) is float): #produces error code
bestx = [sys.maxsize]*len(c)
else:
bestx = res.x
bestval = sum([x*y for x,y in zip(c, bestx)])
if all(((x-math.floor(x))t and (math.ceil(x)-x)>t][0]
newcon1 = [0]*len(a[0])
newcon2 = [0]*len(a[0])
newcon1[ind] = -1
newcon2[ind] = 1
newa1 = a.copy()
newa2 = a.copy()
newb1 = b.copy()
newb2 = b.copy()
r1 = integerpro(c, newa1, newb1, aeq, beq)
r2 = integerpro(c, newa2, newb2, aeq, beq)
if r1[0] < r2[0]:
return r1
else:
return r2
例子:輸入
c = [3,4,1]
a = [[-1,-6,-2],[-2,0,0]]
b = [-5,-3]
aeq = [[0,0,0]]
beq = [0]
print(integerpro(c, a, b, aeq, beq))
輸出
(8.0, array([2., 0., 2.]))
其中8是目標函式值,2,0,2是3個整數變數的值。
求解問題為:
葉子結點和分支節點 理論分析B 樹最優結點大小
本文使用 zhihu on vscode 創作並發布 b 樹是有序的,平衡的多叉樹型結構,是資料庫系統中最為通用的索引資料結構。在傳統的關係型磁碟資料庫中,索引結構儲存在磁碟上,磁碟按頁 page 訪問,且隨機訪問時有較高的尋道延時 disk seek latency b 樹的結點塊結構適應了磁碟按...
葉子結點和分支節點 樹的度和結點數的關係
一 概念 與圖論中的 度 不同,樹的度是如下定義的 有根樹t中,結點x的子女數目稱為x的度。也就是 在樹中,結點有幾個分叉,度就是幾。乙個有用的小公式 樹中結點數 總分叉數 1。這裡的分叉數就是所有結點的度之和 二 度的計算 1.設樹t的度為4,其中度為1,2,3,4的節點個數分別為4,2,1,1,...
求葉子節點到根結點路徑和為14,並且列印路徑
求葉子節點到根結點路徑和為14,並且列印路徑,實現過程如下所示 package cn.edu.nwu.structs.tree author jcm 時間 2016年9月1日 public class printtreenodepath author jcm 求葉子節點到根結點路徑和為14,並列印路...