コード例 #1
0
ファイル: multistart.py プロジェクト: kakke18/timetable
    def multistart2(self, arg_timetable, arg_teacher, sub):
        while True:
            # コピー
            timetable = copy.deepcopy(arg_timetable)
            teacher = copy.deepcopy(arg_teacher)

            # オブジェクト生成
            obj1 = arrangement.Arrangement()
            obj2 = annealing_optimize.AnnealingOptimize()

            # 時間割配置
            obj1.arrange_timetable(sub, timetable)

            # 焼きなまし
            jikanwari, teach, penalty, penalty_history = obj2.annealingoptimize2(
                timetable, teacher)

            if penalty <= MIN_PENALTY2:
                print('success')
                print('penalty:', penalty)
                print()
                break
            else:
                print('fault')
                print()

        return jikanwari, teach, penalty_history
コード例 #2
0
    def annealingoptimize1(self,
                           arg_timetable,
                           arg_teacher,
                           temp=10000,
                           cool=0.99):
        # 初期化
        cnt = 0
        penal = 1000000

        # 解の記録
        penalty_history = []

        # オブジェクト生成
        obj1 = exchange.Exchange()
        obj2 = penalty.Penalty()
        obj3 = arrangement.Arrangement()

        # 探索
        while penal > MIN_PENALTY or cnt < MAX_CNT:
            # 交換
            old_timetable = copy.deepcopy(arg_timetable)
            if (penal >= 1000000):
                obj1.exchange1(arg_timetable)
            elif (penal >= 10000):
                obj1.exchange2(arg_timetable)
            else:
                obj1.exchange3(arg_timetable)

            # 先生配置
            old_teacher = copy.deepcopy(arg_teacher)
            new_teacher = copy.deepcopy(arg_teacher)
            obj3.arrange_teacher(old_timetable, old_teacher)
            obj3.arrange_teacher(arg_timetable, new_teacher)

            # ペナルティを計算
            old_pena = obj2.calc_penalty_soft(old_timetable, old_teacher)
            new_pena = obj2.calc_penalty_soft(arg_timetable, new_teacher)

            # 温度から確立を定義
            pro = pow(math.e, -abs(new_pena - old_pena) / temp)

            # コストを比較し改善 or 確率
            if (new_pena < old_pena or random.random() < pro):
                penal = new_pena
                teacher = copy.copy(new_teacher)
            else:
                arg_timetable = copy.deepcopy(old_timetable)
                penal = old_pena
                teacher = copy.copy(old_teacher)

            # 温度を下げる
            temp = temp * cool

            # カウントインクリメント
            cnt += 1

            # 表示
            if cnt % 100 == 0:
                print('penalty:', penal)
                print('count   :', cnt)
                print()

            # 探索が停滞
            if cnt > 300 and penal > 1000000:
                break

            # ペナルティ
            penalty_history.append(penal)

        # 表示
        print('----------------------')
        print('penalty: ', penal)
        print('----------------------')

        # 戻り値
        return arg_timetable, teacher, penal, penalty_history
コード例 #3
0
ファイル: greatdeluge.py プロジェクト: kakke18/timetable
    def greatdelugels(self, arg_timetable, arg_teacher):
        # 初期化 cnt_stag:停滞回数
        cnt_stag = 0
        penalty_history = []

        # オブジェクト生成
        obj1 = exchange.Exchange()
        obj2 = penalty.Penalty()
        obj3 = arrangement.Arrangement()

        # 先生配置
        teacher = copy.deepcopy(arg_teacher)
        obj3.arrange_teacher(arg_timetable, teacher)
        # ペナルティ計算
        cost_current = obj2.calc_penalty_soft(arg_timetable, teacher)

        # 最小ペナルティ
        min_cost = cost_current
        # 初期水位
        water_level = cost_current

        # ペナルティ記録
        penalty_history.append(cost_current)

        # ループ
        while min_cost > 0 and cnt_stag < MAX_STAG2:
            ### LocalSearch ###
            # リスト
            penal = []
            timetable = []
            teacher = []
            # 近傍探索
            for x in range(5):
                # コピー
                timetable.append(copy.deepcopy(arg_timetable))
                # 交換
                obj1.exchange3(timetable[x])
                # 先生配置
                teacher.append(copy.deepcopy(arg_teacher))
                obj3.arrange_teacher(timetable[x], teacher[x])
                # 現在のペナルティ
                penal.append(obj2.calc_penalty_soft(timetable[x], teacher[x]))
            # 最小要素
            min_element = penal.index(min(penal))
            timetable = copy.deepcopy(timetable[min_element])
            teacher = copy.deepcopy(teacher[min_element])
            cost_neigh = min(penal)

            # 改善 or 水位以下
            if cost_current >= cost_neigh or water_level >= cost_neigh:
                # 交換を許可
                arg_timetable = copy.deepcopy(timetable)
                cost_current = cost_neigh

                # 改善
                if cost_current < min_cost:
                    # ペナルティ
                    min_cost = cost_current
                    min_timetable = copy.deepcopy(arg_timetable)
                    cnt_stag = 0

                # 水位以下
                if cost_current < water_level:
                    # 水位を下げる
                    water_level -= DEC_WATER2

                # 同じ
                if cost_current == min_cost or cost_current == water_level:
                    cnt_stag += 1
            else:
                cnt_stag += 1

            # ペナルティ
            penalty_history.append(cost_current)

            # 再上昇
            if cnt_stag % FREQ_RERISE2 == 0:
                water_level += RERISE2

            # 表示
            print('min_pena', min_cost)
            print('cur_pena', cost_current)
            print('water_level', water_level)
            print('cnt_stag', cnt_stag)
            print()
            # ペナルティ記録
            penalty_history.append(cost_current)

        obj3.arrange_teacher(min_timetable, arg_teacher)
        return min_timetable, arg_teacher, min_cost, penalty_history
コード例 #4
0
ファイル: greatdeluge.py プロジェクト: kakke18/timetable
    def greatdeluge2opt(self, arg_timetable, arg_teacher):
        # 初期化 cnt_stag:停滞回数 penalty_history:解の記録
        cnt_stag = 0
        penalty_history = []

        # オブジェクト生成
        obj1 = exchange.Exchange()
        obj2 = penalty.Penalty()
        obj3 = arrangement.Arrangement()

        # 先生配置
        teacher = copy.deepcopy(arg_teacher)
        obj3.arrange_teacher(arg_timetable, teacher)
        # ペナルティ計算
        cost_current = obj2.calc_penalty_soft(arg_timetable, teacher)

        # 最小ペナルティ
        min_cost = cost_current
        # 初期水位
        water_level = cost_current

        # ペナルティ記録
        penalty_history.append(cost_current)

        # ループ
        while min_cost > 0 and cnt_stag < MAX_STAG1:
            ### 2-opt ###
            # コピー
            timetable = copy.deepcopy(arg_timetable)
            teacher = copy.deepcopy(arg_teacher)
            # 交換
            obj1.exchange3(timetable)
            # 先生配置
            obj3.arrange_teacher(timetable, teacher)
            # 現在のペナルティ
            cost_neigh = obj2.calc_penalty_soft(timetable, teacher)

            # 改善 or 水位以下
            if cost_current >= cost_neigh or water_level >= cost_neigh:
                # 交換を許可
                arg_timetable = copy.deepcopy(timetable)
                cost_current = cost_neigh

                # 改善
                if cost_current < min_cost:
                    # ペナルティ
                    min_cost = cost_current
                    min_timetable = copy.deepcopy(arg_timetable)
                    cnt_stag = 0

                # 水位以下
                if cost_current < water_level:
                    # 水位を下げる
                    water_level -= DEC_WATER1

                # 同じ
                if cost_current == min_cost or cost_current == water_level:
                    cnt_stag += 1
            else:
                cnt_stag += 1

            # 再上昇
            if cnt_stag % FREQ_RERISE1 == 0:
                water_level += RERISE1

            # 表示
            print('min_pena', min_cost)
            print('cur_pena', cost_current)
            print('water_level', water_level)
            print('cnt_stag', cnt_stag)
            print()
            # ペナルティ記録
            penalty_history.append(cost_current)

        obj3.arrange_teacher(min_timetable, arg_teacher)
        return arg_timetable, teacher, min_cost, penalty_history
コード例 #5
0
ファイル: main.py プロジェクト: kakke18/timetable
GRADE = 7
CLASS = 5
DAY = 5
TIME = 5
CLASS_T = 7
TEACHERNUM = 29

# 初期化
arg_timetable = [[[[None for i4 in range(TIME)] for i3 in range(DAY)]
                  for i2 in range(CLASS + 1)] for i1 in range(GRADE + 1)]
arg_teacher = [[[[None for i4 in range(TIME)] for i3 in range(DAY)]
                for i2 in range(TEACHERNUM + 1)] for i1 in range(CLASS_T + 1)]

# オブジェクト生成
obj1 = excel.Load()
obj2 = arrangement.Arrangement()
obj3 = multistart.MultiStart()
obj4 = excel.Write()
obj5 = hillclimbing.HillClimbing()
obj6 = greatdeluge.GreatDeluge()

# 手法選択
while True:
    print('0:SA 1:SA+HC 2:SA+GD 3:SA+GD(LS) 4:hybrid all')
    method = int(input('method >> '))
    if method in range(5):
        break

# 読み込み
grad, choicesub, simusub, specsub, sub = obj1.load_excel()