import random as rd
from pyscipopt import model, quicksum
def planning(s, k, a, b, v0, vn, time_limit):
n = len(s)
m = max(s)*10
model = model("production_and_storage")
x = [model.addvar(vtype="i", name="x[%s]" % (i)) for i in range(n)]
y = [model.addvar(vtype="b", name="y[%s]" % (i)) for i in range(n)]
# 以總成本最小為目標
model.setobjective(quicksum(a*x[i]+k*y[i] for i in range(n)) + b * quicksum(v0 + quicksum(x[j] for j in range(i+1)) - quicksum(s[j] for j in range(i+1)) for i in range(n-1)) , "minimize")
# 有的量大於等於賣的量
for i in range(n):
model.addcons(v0 + quicksum(x[j] for j in range(i + 1)) - quicksum(s[j] for j in range(i + 1)) >= 0)
# 有生產時必須有準備費用
for i in range(n):
model.addcons(x[i] - m*y[i] <= 0)
# 設定求解時間
model.setrealparam("limits/time", time_limit)
model.optimize()
print("\ngap:",model.getgap())
# 拿結果
p = [round(model.getval(x[i])) for i in range(n)]
return p
if __name__ == "__main__":
#月數n = 4
print("\nn:\n", n)
#銷量、生產準備成本、生產產品成本、儲存費用、起始量、最終量
s = [int(rd.random() * 1000) for i in range(n)]
# s = [400, 500, 300, 200]
print("\ns:\n", s)
k, a, b = 500, 1, 1
print("\nk a b:\n", k, a, b)
v0, vn = 100, 0
print("\nv0, vn:\n", v0, vn)
# 開始計算
p = planning(s, k, a, b, v0, vn, 10)
print("\np:\n", p)
4 4最大子段和問題(動態規劃)
問題 給定有n個整數 包含負整數 組成的序列a1,a2,a3,an,求該序列子段和的最大值。注意 當所有整數均為負值時,定義其最大欄位和為0 由bj的定義 bj是1到j位置的最大子段和 易知,當bj 1 0時bj bj 1 aj,否則bj aj。則計算bj的動態規劃遞迴式 bj max,1 j n。...
程式設計練習 動態規劃(生產線問題)
line a cost是生產線a的代價 line b cost是生產線b的代價 ab cost是從生產線a轉到生產線b的代價 ba cost是從生產線b轉到生產線a的代價 如下 include include void productionline std vector line a cost,st...
動態規劃與序列問題
1.最長公共子串問題描述 如果字串一的所有字元按其在字串中的順序出現在另外乙個字串二中,則字串一稱之為字串二的子串。注意,並不要求子串 字串一 的字元必須連續出現在字串二中。動態規劃 使用dp i j 表示 以x i 和y j 結尾的最長公共子串的長度,因為要求子串連續,所以對於x i 與y j 來...