| @@ -17,7 +17,7 @@ package scheduler | |||
| import ( | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/pkg/response" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/models" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algo" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algorithm/providerPricing" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/utils" | |||
| "gorm.io/gorm" | |||
| ) | |||
| @@ -41,22 +41,22 @@ func (as *aiScheduler) getNewStructForDb(task *response.TaskInfo, resource strin | |||
| return ai, nil | |||
| } | |||
| func (as *aiScheduler) pickOptimalStrategy(task *algo.Task, providers ...*algo.Provider) (*algo.Strategy, error) { | |||
| func (as *aiScheduler) pickOptimalStrategy(task *providerPricing.Task, providers ...*providerPricing.Provider) (*providerPricing.Strategy, error) { | |||
| return nil, nil | |||
| } | |||
| func (as *aiScheduler) genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*algo.Task, []*algo.Provider) { | |||
| func (as *aiScheduler) genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*providerPricing.Task, []*providerPricing.Provider) { | |||
| var proParams []providerParams | |||
| sqlstr := "SELECT SUM(a.disk_avail) as disk_avail,SUM(a.mem_avail) as mem_avail,SUM(a.cpu_total * a.cpu_usable) as cpu_avail,participant_id from (SELECT * from sc_node_avail_info where created_time in (SELECT MAX(created_time) as time from sc_node_avail_info where deleted_flag = 0 GROUP BY participant_id,node_name)) a GROUP BY a.participant_id" | |||
| dbEngin.Raw(sqlstr).Scan(&proParams) | |||
| var providerList []*algo.Provider | |||
| var providerList []*providerPricing.Provider | |||
| for _, p := range proParams { | |||
| provider := algo.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0) | |||
| provider := providerPricing.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0) | |||
| providerList = append(providerList, provider) | |||
| } | |||
| t := algo.NewTask(0, 1, 2, 75120000, 301214500, 1200, 2, 6, 2000) | |||
| t := providerPricing.NewTask(0, 1, 2, 75120000, 301214500, 1200, 2, 6, 2000) | |||
| return t, providerList | |||
| } | |||
| @@ -1,49 +0,0 @@ | |||
| /* | |||
| Copyright (c) [2023] [pcm] | |||
| [pcm-coordinator] is licensed under Mulan PSL v2. | |||
| You can use this software according to the terms and conditions of the Mulan PSL v2. | |||
| You may obtain a copy of Mulan PSL v2 at: | |||
| http://license.coscl.org.cn/MulanPSL2 | |||
| THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, | |||
| EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, | |||
| MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. | |||
| See the Mulan PSL v2 for more details. | |||
| */ | |||
| package algo | |||
| type strategyService interface { | |||
| computeMaxScore() (*Task, error) | |||
| } | |||
| func ScheduleWithFullCollaboration(strategyService strategyService, ProviderList []*Provider) (*Task, error) { | |||
| task, err := strategyService.computeMaxScore() | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| //计算任务i的resourcePerTask属性 | |||
| for i, _ := range ProviderList { | |||
| tasksolu := task.MaxscoreStrategy.Tasksolution[i] // 第j个提供商分到的任务数 | |||
| resourcesolu := task.MaxscoreStrategy.Resourcesolution[0][i] // 第j个提供商分到的资源数 | |||
| // 在第j个云提供商处声明一个长度为资源数的链表 | |||
| resourcePerTaskPerProviders := make([]int, resourcesolu) | |||
| if tasksolu > 0 { | |||
| for tasksolu > 0 { | |||
| for j := 0; j < resourcesolu; j++ { | |||
| resourcePerTaskPerProviders[j] += 1 | |||
| tasksolu -= 1 | |||
| } | |||
| } | |||
| } else if tasksolu == 0 { | |||
| resourcePerTaskPerProviders = []int{0} | |||
| } | |||
| task.ResourcePerTask = append(task.ResourcePerTask, resourcePerTaskPerProviders) | |||
| } | |||
| return task, nil | |||
| } | |||
| @@ -12,102 +12,14 @@ | |||
| */ | |||
| package algo | |||
| package providerPricing | |||
| import ( | |||
| "errors" | |||
| "gonum.org/v1/gonum/mat" | |||
| "math" | |||
| ) | |||
| type k8sStrategy struct { | |||
| ProviderList []*Provider | |||
| Task *Task | |||
| StrategyList []*Strategy | |||
| } | |||
| func NewK8sStrategy(task *Task, providers ...*Provider) *k8sStrategy { | |||
| var providerList []*Provider | |||
| var res [][]int | |||
| for _, p := range providers { | |||
| p.GenMaxResourceNum(task) | |||
| providerList = append(providerList, p) | |||
| } | |||
| back_trace_task(task.Replicas, 0, providerList, 0, &res, 0) | |||
| var strategyList []*Strategy | |||
| for _, r := range res { | |||
| var path []int | |||
| var pathlist [][]int | |||
| var resourcePerProvider []int | |||
| for j, p := range providerList { | |||
| if r[j] > p.MaxReplicas { | |||
| resourcePerProvider = append(resourcePerProvider, p.MaxReplicas) | |||
| } else { | |||
| resourcePerProvider = append(resourcePerProvider, r[j]) | |||
| } | |||
| } | |||
| back_trace_resource(resourcePerProvider, 0, path, &pathlist) | |||
| strategy := NewStrategy() | |||
| strategy.Tasksolution = r | |||
| strategy.Resourcesolution = pathlist | |||
| strategyList = append(strategyList, strategy) | |||
| } | |||
| return &k8sStrategy{ProviderList: providerList, Task: task, StrategyList: strategyList} | |||
| } | |||
| func (ps *k8sStrategy) computeMaxScore() (*Task, error) { | |||
| maxStrategy := NewStrategy() | |||
| var maxprofit float64 | |||
| //先计算出最大的利润值 | |||
| for _, strategy := range ps.StrategyList { | |||
| for _, resourceSolu := range strategy.Resourcesolution { | |||
| profit := computeProfit(ps.Task, strategy.Tasksolution, resourceSolu, ps.ProviderList) | |||
| if profit > maxprofit { | |||
| maxprofit = profit | |||
| } | |||
| } | |||
| } | |||
| for _, strategy := range ps.StrategyList { | |||
| for _, resourceSolu := range strategy.Resourcesolution { | |||
| profit := computeProfit(ps.Task, strategy.Tasksolution, resourceSolu, ps.ProviderList) | |||
| highDegree := computeHighDegree(ps.Task, resourceSolu, ps.ProviderList) | |||
| valueSum := profit/maxprofit + highDegree | |||
| //将每个确定任务分配策略的最高的策略得分存储到里面 | |||
| if valueSum > maxStrategy.ValueSum { | |||
| strategy.Profit = profit | |||
| strategy.HighDegree = highDegree | |||
| } | |||
| if valueSum > maxStrategy.ValueSum { | |||
| maxStrategy.ValueSum = valueSum | |||
| maxStrategy.Tasksolution = strategy.Tasksolution | |||
| newResourceSolu := [][]int{} | |||
| newResourceSolu = append(newResourceSolu, resourceSolu) | |||
| maxStrategy.Resourcesolution = newResourceSolu | |||
| maxStrategy.Profit = profit | |||
| maxStrategy.HighDegree = highDegree | |||
| } | |||
| } | |||
| } | |||
| if len(ps.ProviderList) == 0 { | |||
| return nil, errors.New("empty providers") | |||
| } | |||
| ps.Task.MaxscoreStrategy = maxStrategy // 记录该任务的最终分配策略 | |||
| return ps.Task, nil | |||
| } | |||
| func computeProfit(task *Task, tasksolution []int, resourcesolution []int, providerList []*Provider) float64 { | |||
| func ComputeProfit(task *Task, tasksolution []int, resourcesolution []int, providerList []*Provider) float64 { | |||
| var timeexecution int //记录任务的实际最大执行时间 | |||
| var costSum float64 //该任务在多个云厂商所需支付的成本总价 | |||
| @@ -170,7 +82,7 @@ func computeProfit(task *Task, tasksolution []int, resourcesolution []int, provi | |||
| return profitSum | |||
| } | |||
| func computeHighDegree(task *Task, resourcesolution []int, providerList []*Provider) float64 { | |||
| func ComputeHighDegree(task *Task, resourcesolution []int, providerList []*Provider) float64 { | |||
| var highDegreeSum float64 | |||
| // 依次计算每个云厂商的资源可用度 | |||
| for i, provider := range providerList { | |||
| @@ -205,7 +117,7 @@ func computeHighDegree(task *Task, resourcesolution []int, providerList []*Provi | |||
| return highDegreeSum / float64(len(providerList)) | |||
| } | |||
| func back_trace_task(ReplicaNum int, DoneReplicasNum int, providerList []*Provider, staclu int, res *[][]int, sum int) { | |||
| func Back_trace_task(ReplicaNum int, DoneReplicasNum int, providerList []*Provider, staclu int, res *[][]int, sum int) { | |||
| //var count int = 0 | |||
| pnum := len(providerList) | |||
| @@ -228,16 +140,16 @@ func back_trace_task(ReplicaNum int, DoneReplicasNum int, providerList []*Provid | |||
| if providerList[staclu].CurReplicas < providerList[staclu].MaxTaskCanRun { | |||
| providerList[staclu].CurReplicas += 1 | |||
| back_trace_task(ReplicaNum, DoneReplicasNum+1, providerList, staclu, res, sum) | |||
| Back_trace_task(ReplicaNum, DoneReplicasNum+1, providerList, staclu, res, sum) | |||
| providerList[staclu].CurReplicas -= 1 | |||
| back_trace_task(ReplicaNum, DoneReplicasNum, providerList, staclu+1, res, sum) | |||
| Back_trace_task(ReplicaNum, DoneReplicasNum, providerList, staclu+1, res, sum) | |||
| } else { | |||
| back_trace_task(ReplicaNum, DoneReplicasNum, providerList, staclu+1, res, sum) | |||
| Back_trace_task(ReplicaNum, DoneReplicasNum, providerList, staclu+1, res, sum) | |||
| } | |||
| } | |||
| func back_trace_resource(list []int, i int, path []int, pathlist *[][]int) { | |||
| func Back_trace_resource(list []int, i int, path []int, pathlist *[][]int) { | |||
| if i == len(list) { | |||
| var pathCopy = make([]int, len(path)) | |||
| copy(pathCopy, path) | |||
| @@ -247,12 +159,12 @@ func back_trace_resource(list []int, i int, path []int, pathlist *[][]int) { | |||
| if list[i] == 0 { | |||
| path = append(path, 0) | |||
| back_trace_resource(list, i+1, path, pathlist) | |||
| Back_trace_resource(list, i+1, path, pathlist) | |||
| path = path[:len(path)-1] | |||
| } else { | |||
| for j := 1; j < list[i]+1; j++ { | |||
| path = append(path, j) | |||
| back_trace_resource(list, i+1, path, pathlist) | |||
| Back_trace_resource(list, i+1, path, pathlist) | |||
| path = path[:len(path)-1] | |||
| } | |||
| } | |||
| @@ -12,9 +12,11 @@ | |||
| */ | |||
| package algo | |||
| package providerPricing | |||
| import "math" | |||
| import ( | |||
| "math" | |||
| ) | |||
| type Provider struct { | |||
| Pid int64 | |||
| @@ -12,7 +12,7 @@ | |||
| */ | |||
| package algo | |||
| package providerPricing | |||
| type Strategy struct { | |||
| Tasksolution []int //对应1种任务分配方案 | |||
| @@ -12,7 +12,7 @@ | |||
| */ | |||
| package algo | |||
| package providerPricing | |||
| type Task struct { | |||
| Tid int | |||
| @@ -18,7 +18,8 @@ import ( | |||
| "bytes" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/pkg/response" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/models" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algo" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algorithm/providerPricing" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/strategies" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/utils" | |||
| "gorm.io/gorm" | |||
| "io" | |||
| @@ -35,11 +36,11 @@ func NewCloudScheduler() *cloudScheduler { | |||
| return &cloudScheduler{} | |||
| } | |||
| func (cs *cloudScheduler) pickOptimalStrategy(task *algo.Task, providers ...*algo.Provider) (*algo.Strategy, error) { | |||
| func (cs *cloudScheduler) pickOptimalStrategy(task *providerPricing.Task, providers ...*providerPricing.Provider) (*providerPricing.Strategy, error) { | |||
| //调度算法 | |||
| strategy := algo.NewK8sStrategy(task, providers...) | |||
| taskResult, err := algo.ScheduleWithFullCollaboration(strategy, strategy.ProviderList) | |||
| strategy := strategies.NewPricingStrategy(task, providers...) | |||
| taskResult, err := strategies.ScheduleWithFullCollaboration(strategy, strategy.ProviderList) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| @@ -99,19 +100,19 @@ func (cs *cloudScheduler) UnMarshalK8sStruct(yamlString string, taskId int64, ns | |||
| return cloud | |||
| } | |||
| func (cs *cloudScheduler) genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*algo.Task, []*algo.Provider) { | |||
| func (cs *cloudScheduler) genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*providerPricing.Task, []*providerPricing.Provider) { | |||
| var proParams []providerParams | |||
| sqlstr := "SELECT SUM(a.disk_avail) as disk_avail,SUM(a.mem_avail) as mem_avail,SUM(a.cpu_total * a.cpu_usable) as cpu_avail,participant_id from (SELECT * from sc_node_avail_info where created_time in (SELECT MAX(created_time) as time from sc_node_avail_info where deleted_flag = 0 GROUP BY participant_id,node_name)) a GROUP BY a.participant_id" | |||
| dbEngin.Raw(sqlstr).Scan(&proParams) | |||
| var providerList []*algo.Provider | |||
| var providerList []*providerPricing.Provider | |||
| for _, p := range proParams { | |||
| provider := algo.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0) | |||
| provider := providerPricing.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0) | |||
| providerList = append(providerList, provider) | |||
| } | |||
| //replicas := task.Metadata.(map[string]interface{})["spec"].(map[string]interface{})["replicas"].(float64) | |||
| //t := algo.NewTask(0, int(replicas), 2, 75120000, 301214500, 1200, 2, 6, 2000) | |||
| //t := algorithm.NewTask(0, int(replicas), 2, 75120000, 301214500, 1200, 2, 6, 2000) | |||
| return nil, providerList | |||
| } | |||
| @@ -16,7 +16,7 @@ package scheduler | |||
| import ( | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/pkg/response" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algo" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algorithm/providerPricing" | |||
| "gorm.io/gorm" | |||
| "math/rand" | |||
| "time" | |||
| @@ -24,8 +24,8 @@ import ( | |||
| type scheduleService interface { | |||
| getNewStructForDb(task *response.TaskInfo, resource string, participantId int64) (interface{}, error) | |||
| pickOptimalStrategy(task *algo.Task, providers ...*algo.Provider) (*algo.Strategy, error) | |||
| genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*algo.Task, []*algo.Provider) | |||
| pickOptimalStrategy(task *providerPricing.Task, providers ...*providerPricing.Provider) (*providerPricing.Strategy, error) | |||
| genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*providerPricing.Task, []*providerPricing.Provider) | |||
| } | |||
| type providerParams struct { | |||
| @@ -18,7 +18,7 @@ import ( | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/pkg/response" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/constants" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/models" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algo" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algorithm/providerPricing" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/utils" | |||
| "gorm.io/gorm" | |||
| ) | |||
| @@ -42,22 +42,22 @@ func (h *hpcScheduler) getNewStructForDb(task *response.TaskInfo, resource strin | |||
| return hpc, nil | |||
| } | |||
| func (h *hpcScheduler) pickOptimalStrategy(task *algo.Task, providers ...*algo.Provider) (*algo.Strategy, error) { | |||
| func (h *hpcScheduler) pickOptimalStrategy(task *providerPricing.Task, providers ...*providerPricing.Provider) (*providerPricing.Strategy, error) { | |||
| return nil, nil | |||
| } | |||
| func (h *hpcScheduler) genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*algo.Task, []*algo.Provider) { | |||
| func (h *hpcScheduler) genTaskAndProviders(task *response.TaskInfo, dbEngin *gorm.DB) (*providerPricing.Task, []*providerPricing.Provider) { | |||
| var proParams []providerParams | |||
| sqlstr := "SELECT SUM(a.disk_avail) as disk_avail,SUM(a.mem_avail) as mem_avail,SUM(a.cpu_total * a.cpu_usable) as cpu_avail,participant_id from (SELECT * from sc_node_avail_info where created_time in (SELECT MAX(created_time) as time from sc_node_avail_info where deleted_flag = 0 GROUP BY participant_id,node_name)) a GROUP BY a.participant_id" | |||
| dbEngin.Raw(sqlstr).Scan(&proParams) | |||
| var providerList []*algo.Provider | |||
| var providerList []*providerPricing.Provider | |||
| for _, p := range proParams { | |||
| provider := algo.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0) | |||
| provider := providerPricing.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0) | |||
| providerList = append(providerList, provider) | |||
| } | |||
| t := algo.NewTask(0, 1, 2, 75120000, 301214500, 1200, 2, 6, 2000) | |||
| t := providerPricing.NewTask(0, 1, 2, 75120000, 301214500, 1200, 2, 6, 2000) | |||
| return t, providerList | |||
| } | |||
| @@ -19,7 +19,7 @@ import ( | |||
| "github.com/pkg/errors" | |||
| "github.com/zeromicro/go-zero/core/logx" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/pkg/response" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algo" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algorithm/providerPricing" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/rpc/client/participantservice" | |||
| "gorm.io/gorm" | |||
| "sigs.k8s.io/yaml" | |||
| @@ -180,7 +180,7 @@ func (s *scheduler) SaveToDb() error { | |||
| return nil | |||
| } | |||
| func (s *scheduler) obtainParamsForStrategy() (*algo.Task, []*algo.Provider, error) { | |||
| func (s *scheduler) obtainParamsForStrategy() (*providerPricing.Task, []*providerPricing.Provider, error) { | |||
| task, providerList := s.scheduleService.genTaskAndProviders(s.task, s.dbEngin) | |||
| if len(providerList) == 0 { | |||
| @@ -190,7 +190,7 @@ func (s *scheduler) obtainParamsForStrategy() (*algo.Task, []*algo.Provider, err | |||
| return task, providerList, nil | |||
| } | |||
| func (s *scheduler) assignReplicasToResult(strategy *algo.Strategy, providerList []*algo.Provider) error { | |||
| func (s *scheduler) assignReplicasToResult(strategy *providerPricing.Strategy, providerList []*providerPricing.Provider) error { | |||
| if len(strategy.Tasksolution) == 0 { | |||
| return errors.New("调度失败, 未能获取调度结果") | |||
| @@ -0,0 +1,141 @@ | |||
| /* | |||
| Copyright (c) [2023] [pcm] | |||
| [pcm-coordinator] is licensed under Mulan PSL v2. | |||
| You can use this software according to the terms and conditions of the Mulan PSL v2. | |||
| You may obtain a copy of Mulan PSL v2 at: | |||
| http://license.coscl.org.cn/MulanPSL2 | |||
| THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, | |||
| EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, | |||
| MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. | |||
| See the Mulan PSL v2 for more details. | |||
| */ | |||
| package strategies | |||
| import ( | |||
| "errors" | |||
| "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/scheduler/algorithm/providerPricing" | |||
| ) | |||
| type pricingStrategy struct { | |||
| ProviderList []*providerPricing.Provider | |||
| Task *providerPricing.Task | |||
| StrategyList []*providerPricing.Strategy | |||
| } | |||
| func NewPricingStrategy(task *providerPricing.Task, providers ...*providerPricing.Provider) *pricingStrategy { | |||
| var providerList []*providerPricing.Provider | |||
| var res [][]int | |||
| for _, p := range providers { | |||
| p.GenMaxResourceNum(task) | |||
| providerList = append(providerList, p) | |||
| } | |||
| providerPricing.Back_trace_task(task.Replicas, 0, providerList, 0, &res, 0) | |||
| var strategyList []*providerPricing.Strategy | |||
| for _, r := range res { | |||
| var path []int | |||
| var pathlist [][]int | |||
| var resourcePerProvider []int | |||
| for j, p := range providerList { | |||
| if r[j] > p.MaxReplicas { | |||
| resourcePerProvider = append(resourcePerProvider, p.MaxReplicas) | |||
| } else { | |||
| resourcePerProvider = append(resourcePerProvider, r[j]) | |||
| } | |||
| } | |||
| providerPricing.Back_trace_resource(resourcePerProvider, 0, path, &pathlist) | |||
| strategy := providerPricing.NewStrategy() | |||
| strategy.Tasksolution = r | |||
| strategy.Resourcesolution = pathlist | |||
| strategyList = append(strategyList, strategy) | |||
| } | |||
| return &pricingStrategy{ProviderList: providerList, Task: task, StrategyList: strategyList} | |||
| } | |||
| func (ps *pricingStrategy) computeMaxScore() (*providerPricing.Task, error) { | |||
| maxStrategy := providerPricing.NewStrategy() | |||
| var maxprofit float64 | |||
| //先计算出最大的利润值 | |||
| for _, strategy := range ps.StrategyList { | |||
| for _, resourceSolu := range strategy.Resourcesolution { | |||
| profit := providerPricing.ComputeProfit(ps.Task, strategy.Tasksolution, resourceSolu, ps.ProviderList) | |||
| if profit > maxprofit { | |||
| maxprofit = profit | |||
| } | |||
| } | |||
| } | |||
| for _, strategy := range ps.StrategyList { | |||
| for _, resourceSolu := range strategy.Resourcesolution { | |||
| profit := providerPricing.ComputeProfit(ps.Task, strategy.Tasksolution, resourceSolu, ps.ProviderList) | |||
| highDegree := providerPricing.ComputeHighDegree(ps.Task, resourceSolu, ps.ProviderList) | |||
| valueSum := profit/maxprofit + highDegree | |||
| //将每个确定任务分配策略的最高的策略得分存储到里面 | |||
| if valueSum > maxStrategy.ValueSum { | |||
| strategy.Profit = profit | |||
| strategy.HighDegree = highDegree | |||
| } | |||
| if valueSum > maxStrategy.ValueSum { | |||
| maxStrategy.ValueSum = valueSum | |||
| maxStrategy.Tasksolution = strategy.Tasksolution | |||
| newResourceSolu := [][]int{} | |||
| newResourceSolu = append(newResourceSolu, resourceSolu) | |||
| maxStrategy.Resourcesolution = newResourceSolu | |||
| maxStrategy.Profit = profit | |||
| maxStrategy.HighDegree = highDegree | |||
| } | |||
| } | |||
| } | |||
| if len(ps.ProviderList) == 0 { | |||
| return nil, errors.New("empty providers") | |||
| } | |||
| ps.Task.MaxscoreStrategy = maxStrategy // 记录该任务的最终分配策略 | |||
| return ps.Task, nil | |||
| } | |||
| type strategyService interface { | |||
| computeMaxScore() (*providerPricing.Task, error) | |||
| } | |||
| func ScheduleWithFullCollaboration(strategyService strategyService, ProviderList []*providerPricing.Provider) (*providerPricing.Task, error) { | |||
| task, err := strategyService.computeMaxScore() | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| //计算任务i的resourcePerTask属性 | |||
| for i, _ := range ProviderList { | |||
| tasksolu := task.MaxscoreStrategy.Tasksolution[i] // 第j个提供商分到的任务数 | |||
| resourcesolu := task.MaxscoreStrategy.Resourcesolution[0][i] // 第j个提供商分到的资源数 | |||
| // 在第j个云提供商处声明一个长度为资源数的链表 | |||
| resourcePerTaskPerProviders := make([]int, resourcesolu) | |||
| if tasksolu > 0 { | |||
| for tasksolu > 0 { | |||
| for j := 0; j < resourcesolu; j++ { | |||
| resourcePerTaskPerProviders[j] += 1 | |||
| tasksolu -= 1 | |||
| } | |||
| } | |||
| } else if tasksolu == 0 { | |||
| resourcePerTaskPerProviders = []int{0} | |||
| } | |||
| task.ResourcePerTask = append(task.ResourcePerTask, resourcePerTaskPerProviders) | |||
| } | |||
| return task, nil | |||
| } | |||