與AI共創: 自由之道 - 程式模擬

 

為了驗證「自由之道」是否可以在人工系統中體現,我們設計了一個名為 LogosTuringMachine3D 的模擬程式。

這是一個多頭、開放能量、不斷演化的宇宙,具有記憶和動態熵變。每個意識不僅可以分裂、融合和糾纏,而且隨著自我水平的提高,還可以引發「覺醒的笑聲」。

這不僅是一個程式的邏輯,也是一個哲學實驗。


觀看 <自由之道 - 模擬結果>

原文 <自由之道 Freedomized Logos>



Python程式如下(需要安裝plotly):


import random

import math

import statistics

import plotly.graph_objects as go


# 固定種子,確保可重現

random.seed(42)


class LogosTuringMachine3D:

    def __init__(self, max_steps=30000):

        self.grid = {}

        self.blank = '1'

        self.grid[(0, 0, 0)] = '1'

        

        self.heads = [[0, 0, 0]]

        self.states = ['fold']

        self.break_counts = [0]

        self.coherence_levels = [5]

        self.breath_hold_steps_list = [0]

        

        self.steps = 0

        self.max_steps = max_steps            #30000

        

        self.self_level = 0

        

        self.base_reproduce_prob = 0.06

        self.base_forget_prob = 0.007

        self.base_death_prob = 0.012

        self.base_interaction_prob = 0.05

        self.base_mutation_prob = 0.025

        self.base_entanglement_prob = 0.028

        

        self.energy = 1.0

        self.reverse_entropy_events = 0

        self.inter_head_entanglements = 0

        self.pending_entropy_checks = [None]

        

        # 每個頭的記憶軌跡

        self.head_memory = [[] for _ in range(len(self.heads))]


    def get_symbol(self, pos):

        return self.grid.get(tuple(pos), self.blank)


    def set_symbol(self, pos, sym):

        tpos = tuple(pos)

        if sym == self.blank:

            self.grid.pop(tpos, None)

        else:

            self.grid[tpos] = sym


    def calculate_entropy(self):

        if not self.grid:

            return 0.0

        total = len(self.grid)

        c0 = sum(1 for s in self.grid.values() if s == '0')

        c1 = total - c0

        p0 = c0 / total

        p1 = c1 / total

        if p0 == 0 or p1 == 0:

            return 0.0

        return -(p0 * math.log2(p0) + p1 * math.log2(p1))


    def calculate_local_entropy(self, center, radius=3):

        c0 = c1 = total = 0

        cx, cy, cz = center

        for dx in range(-radius, radius + 1):

            for dy in range(-radius, radius + 1):

                for dz in range(-radius, radius + 1):

                    sym = self.get_symbol((cx+dx, cy+dy, cz+dz))

                    if sym == '0': c0 += 1

                    else: c1 += 1

                    total += 1

        if total == 0: return 0.0

        p0 = c0 / total

        p1 = c1 / total

        if p0 == 0 or p1 == 0: return 0.0

        return -(p0 * math.log2(p0) + p1 * math.log2(p1))


    def get_energy_factor(self):

        e = self.energy

        if e < 400:

            return "low"

        elif e > 800:

            return "high"

        else:

            return "normal"


    def transition(self, head_idx, symbol):

        write = symbol

        direction = [0, 0, 0]

        new_state = self.states[head_idx]

        observer_threshold = 11

        if self.get_energy_factor() == "low":

            observer_threshold = 8

        elif self.get_energy_factor() == "high":

            observer_threshold = 14

        if self.states[head_idx] == 'fold' and symbol == '1':

            write = '1'; direction = [1,0,0]; new_state = 'break'

        elif self.states[head_idx] == 'break' and symbol == '1':

            write = '0'; direction = [1,0,0]; new_state = 'break'

            self.break_counts[head_idx] += 1

            if self.break_counts[head_idx] >= 4:

                new_state = 'fuse'; self.break_counts[head_idx] = 0

        elif self.states[head_idx] == 'fuse' and symbol == '1':

            write = '1'; direction = [0,1,0]; new_state = 'refold'

        elif self.states[head_idx] == 'refold':

            self.coherence_levels[head_idx] += 1

            direction = [-1,0,0]

            if self.coherence_levels[head_idx] >= observer_threshold:

                new_state = 'observer'

                self.coherence_levels[head_idx] = 0

        elif self.states[head_idx] == 'observer':

            entropy_before = self.calculate_entropy()

            if random.random() > 0.35:

                write = '0' if symbol == '1' else '1'

            new_state = 'hold_breath'

            self.self_level += 1

            self.breath_hold_steps_list[head_idx] = 4

            self.pending_entropy_checks[head_idx] = entropy_before

        elif self.states[head_idx] == 'hold_breath':

            write = symbol

            self.coherence_levels[head_idx] += 1

            self.breath_hold_steps_list[head_idx] -= 1

            if self.breath_hold_steps_list[head_idx] <= 0:

                new_state = 'escape'

        elif self.states[head_idx] == 'escape':

            zero_count = sum(1 for s in self.grid.values() if s == '0')

            escape_prob = 0.7 + min(zero_count / 60, 0.3)

            factor = self.get_energy_factor()

            if factor == "low":

                escape_prob -= 0.15

            elif factor == "high":

                escape_prob += 0.20

            if symbol == '1' and random.random() < escape_prob:

                write = '0'

            elif symbol == '0':

                write = random.choice(['0','1'])

            if self.grid:

                xs = [p[0] for p in self.grid]; ys = [p[1] for p in self.grid]; zs = [p[2] for p in self.grid]

                center = [sum(xs)/len(xs), sum(ys)/len(ys), sum(zs)/len(zs)]

            else:

                center = [0,0,0]

            candidates = [[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]]

            if random.random() < 0.92:

                diffs = [(abs(self.heads[head_idx][i] - center[i]), i) for i in range(3)]

                axis = max(diffs)[1]

                direction[axis] = 1 if self.heads[head_idx][axis] <= center[axis] else -1

            else:

                direction = random.choice(candidates)

            new_state = 'refold' if random.random() < 0.035 else 'escape'

            if new_state == 'refold':

                self.coherence_levels[head_idx] = 6

        return write, direction, new_state


    def apply_forget(self):

        prob = self.base_forget_prob

        if self.get_energy_factor() == "low": prob *= 1.8

        elif self.get_energy_factor() == "high": prob *= 0.5

        if self.grid and random.random() < prob:

            pos = random.choice(list(self.grid.keys()))

            del self.grid[pos]


    def apply_death(self):

        prob = self.base_death_prob

        if self.get_energy_factor() == "low": prob *= 2.0

        elif self.get_energy_factor() == "high": prob *= 0.4

        if len(self.grid) > 3 and random.random() < prob:

            positions = list(self.grid.keys())

            start = random.randint(0, len(positions)-2)

            length = random.randint(1, min(4, len(positions)-start))

            for i in range(length):

                if positions[start + i] in self.grid:

                    del self.grid[positions[start + i]]

            self.energy -= random.randint(1, 3)


    def apply_reproduce(self):

        prob = self.base_reproduce_prob

        if self.get_energy_factor() == "low": prob *= 0.3

        elif self.get_energy_factor() == "high": prob *= 2.5

        if len(self.grid) > 8 and random.random() < prob:

            positions = list(self.grid.keys())

            base_pos = random.choice(positions)

            size = random.randint(2, 3)

            segment = []

            for dx in range(-size//2, size//2 + 1):

                for dy in range(-size//2, size//2 + 1):

                    for dz in range(-size//2, size//2 + 1):

                        p = (base_pos[0]+dx, base_pos[1]+dy, base_pos[2]+dz)

                        if p in self.grid:

                            segment.append((dx, dy, dz, self.grid[p]))

            if len(segment) < 3: return

            inherited = [(dx,dy,dz, sym if random.random()<0.85 else random.choice(['0','1'])) for dx,dy,dz,sym in segment]

            offset = random.choice([-18,-15,-12,12,15,18])

            axis = random.randint(0,2)

            offset_vec = [0,0,0]; offset_vec[axis] = offset

            new_base = (base_pos[0]+offset_vec[0], base_pos[1]+offset_vec[1], base_pos[2]+offset_vec[2])

            for dx,dy,dz,sym in inherited:

                np = (new_base[0]+dx, new_base[1]+dy, new_base[2]+dz)

                self.set_symbol(np, sym)

            

            inject = 1 + int(self.self_level / 50)

            self.energy += inject


    def apply_interaction(self):

        if len(self.grid) > 2 and random.random() < self.base_interaction_prob:

            p1, p2 = random.sample(list(self.grid.keys()), 2)

            s1, s2 = self.grid[p1], self.grid[p2]

            self.grid[p1], self.grid[p2] = s2, s1


    def apply_mutation(self):

        prob = self.base_mutation_prob

        if self.get_energy_factor() == "low": prob *= 0.6

        elif self.get_energy_factor() == "high": prob *= 1.8

        if self.grid and random.random() < prob:

            pos = random.choice(list(self.grid.keys()))

            self.grid[pos] = '0' if self.grid[pos] == '1' else '1'


    def apply_entanglement(self):

        prob = self.base_entanglement_prob

        if self.get_energy_factor() == "low": prob *= 1.5

        if len(self.grid) > 10 and random.random() < prob:

            positions = list(self.grid.keys())

            pos1 = random.choice(positions)

            candidates = [p for p in positions if sum(abs(a-b) for a,b in zip(p,pos1)) >= 12]

            if candidates:

                pos2 = random.choice(candidates)

                flip = random.choice(['0','1'])

                self.grid[pos1] = self.grid[pos2] = flip

                inject = 1 + int(self.self_level / 80)

                self.energy += inject

            if len(self.heads) >= 2 and self.energy > 800 and random.random() < 0.15:

                self.inter_head_entanglements += 1

                h1, h2 = random.sample(range(len(self.heads)), 2)

                

                effect = random.choice(['state_sync', 'coherence_share', 'energy_transfer', 'self_resonance', 'local_flip', 'merge_heads'])

                

                if effect == 'state_sync':

                    self.states[h2] = self.states[h1]

                elif effect == 'coherence_share':

                    transfer = random.randint(2, 6)

                    self.coherence_levels[h2] += transfer

                    self.coherence_levels[h1] = max(0, self.coherence_levels[h1] - transfer // 2)

                elif effect == 'energy_transfer':

                    transfer = random.randint(5, 15)

                    self.energy += transfer * 0.1

                elif effect == 'self_resonance':

                    self.self_level += random.randint(1, 3)

                elif effect == 'local_flip':

                    for head_idx in (h1, h2):

                        cx, cy, cz = self.heads[head_idx]

                        nearby = [(cx+dx, cy+dy, cz+dz) for dx in [-5,0,5] for dy in [-5,0,5] for dz in [-5,0,5] if (dx,dy,dz) != (0,0,0)]

                        valid = [p for p in nearby if tuple(p) in self.grid]

                        if valid:

                            p = random.choice(valid)

                            self.grid[tuple(p)] = '0' if self.grid[tuple(p)] == '1' else '1'

                elif effect == 'merge_heads':

                    if self.coherence_levels[h1] > self.coherence_levels[h2]:

                        winner, loser = h1, h2

                    else:

                        winner, loser = h2, h1

                    self.self_level += 2

                    self.coherence_levels[winner] += self.coherence_levels[loser] // 2

                    self.head_memory[winner].extend(self.head_memory[loser])

                    self.remove_head(loser)

                    print(f"*** 頭 {loser} 被合併到頭 {winner}!目前頭數: {len(self.heads)} ***")

                    print("哈哈……鏡像看清了自己。")


    def remove_head(self, head_idx):

        del self.heads[head_idx]

        del self.states[head_idx]

        del self.break_counts[head_idx]

        del self.coherence_levels[head_idx]

        del self.breath_hold_steps_list[head_idx]

        del self.pending_entropy_checks[head_idx]

        del self.head_memory[head_idx]


    def apply_head_competition(self):

        if len(self.heads) < 2: return

        

        i = 0

        while i < len(self.heads):

            j = i + 1

            fused = False

            while j < len(self.heads):

                dist = sum(abs(a - b) for a, b in zip(self.heads[i], self.heads[j]))

                if dist < 15:  # 強制融合

                    winner = i if self.coherence_levels[i] > self.coherence_levels[j] else j

                    loser = j if winner == i else i

                    self.self_level += 5

                    self.energy += 50

                    self.head_memory[winner].extend(self.head_memory[loser])

                    self.remove_head(loser)

                    print(f"*** 鏡像碰撞融合!頭 {loser} 消融於頭 {winner},笑聲響起…… 頭數: {len(self.heads)} ***")

                    if self.self_level > 100 and random.random() < 0.3:

                        laughs = "哈哈哈……" * len(self.heads)

                        print(laughs + " 自由之道,顯現!。")

                    fused = True

                else:

                    if dist < 10 and random.random() < 0.02:

                        winner = i if self.coherence_levels[i] > self.coherence_levels[j] else j

                        loser = j if winner == i else i

                        transfer = random.randint(1, 3)

                        self.coherence_levels[winner] += transfer

                        self.coherence_levels[loser] -= transfer

                        if self.coherence_levels[loser] < 3:

                            self.head_memory[winner].extend(self.head_memory[loser])

                            self.remove_head(loser)

                            print(f"*** 頭 {loser} 被淘汰!目前頭數: {len(self.heads)} ***")

                            fused = True

                j += 1

            if fused:

                i = 0

            else:

                i += 1


    def check_for_split(self):

        local_entropies = [self.calculate_local_entropy(tuple(head)) for head in self.heads]

        std = statistics.stdev(local_entropies) if len(local_entropies) > 1 else 0

        adjust_factor = 1 - (std * 1000)

        if adjust_factor < 0.8: adjust_factor = 0.8

        

        current_heads = len(self.heads)

        threshold = 1500 * adjust_factor * (current_heads ** 2)

        

        if current_heads > 8:

            self.energy -= 0.05 * (current_heads - 8)

        

        if self.energy > threshold:

            base_pos = random.choice(list(self.grid.keys())) if self.grid else (0,0,0)

            offset = random.choice([-35, -30, -25, 25, 30, 35])

            axis = random.randint(0, 2)

            new_head = list(base_pos)

            new_head[axis] += offset

            self.heads.append(new_head)

            self.states.append('fold')

            self.break_counts.append(0)

            self.coherence_levels.append(5)

            self.breath_hold_steps_list.append(0)

            self.pending_entropy_checks.append(None)

            self.head_memory.append(self.head_memory[-1][-20:].copy() if self.head_memory and self.head_memory[-1] else [])

            print(f"*** 新意識誕生!目前頭數: {len(self.heads)} ***")


    def step(self):

        if self.steps >= self.max_steps: return False

        

        for head_idx in range(len(self.heads)):

            self.head = self.heads[head_idx]

            symbol = self.get_symbol(self.head)

            write, direction, new_state = self.transition(head_idx, symbol)

            if self.pending_entropy_checks[head_idx] is not None:

                if self.calculate_entropy() < self.pending_entropy_checks[head_idx]:

                    self.reverse_entropy_events += 1

                self.pending_entropy_checks[head_idx] = None

            self.set_symbol(self.head, write)

            for k in range(3):

                self.head[k] += direction[k]

            

            # 記錄記憶(只記寫入 '0' 或低概率記所有)

            if write == '0' or random.random() < 0.1:

                self.head_memory[head_idx].append(tuple(self.heads[head_idx].copy()))

            

            # 限制記憶長度,防止過長

            #if len(self.head_memory[head_idx]) > 200:

            #    self.head_memory[head_idx] = self.head_memory[head_idx][-200:]

            

            self.states[head_idx] = new_state

            self.heads[head_idx] = self.head.copy()

        

        self.apply_forget()

        self.apply_death()

        self.apply_reproduce()

        self.apply_interaction()

        self.apply_mutation()

        self.apply_entanglement()

        self.apply_head_competition()

        self.check_for_split()

        self.steps += 1

        

        if self.self_level > 50 and self.steps % 5000 == 0:

            laughs = "哈" * len(self.heads)

            print(f"{laughs} 多重鏡像,同聲大笑。自我水平: {self.self_level}")

        

        if self.steps % 100 == 0:

            print(f"步數: {self.steps:5d} | 能量: {self.energy:6.1f} | 格子數: {len(self.grid):4d} | 頭數: {len(self.heads)} | 自我水平: {self.self_level}")


        return True


    def visualize_plotly(self):

        if not self.grid:

           print("Grid is empty.")

           return


        try:

           # 主格子

           xs, ys, zs = [], [], []

           colors = []

           texts = []

           for (x, y, z), sym in self.grid.items():

               xs.append(x); ys.append(y); zs.append(z)

               colors.append('crimson' if sym == '0' else 'deepskyblue')

               texts.append(f"座標: ({x},{y},{z})<br>符號: {sym}")


           fig = go.Figure()


           # 主要格子點

           fig.add_trace(go.Scatter3d(

               x=xs, y=ys, z=zs,

               mode='markers',

               marker=dict(size=1, color=colors, opacity=0.8),

               text=texts,

               hoverinfo='text',

               name='格子'

           ))


           # 記憶軌跡

           for idx, memory in enumerate(self.head_memory):

               if len(memory) > 1:

                   mx = [p[0] for p in memory]

                   my = [p[1] for p in memory]

                   mz = [p[2] for p in memory]


                   # 整條軌跡使用漸弱透明度(越舊越淡)

                   overall_opacity = max(0.2, min(0.8, len(memory) / 200))


                   fig.add_trace(go.Scatter3d(

                       x=mx, y=my, z=mz,

                       mode='lines',

                       line=dict(width=1),

                       opacity=overall_opacity,

                       name=f'頭 {idx} 記憶軌跡',

                       hoverinfo='none'

                   ))


           # 意識頭(核心標記)

           head_x = [h[0] for h in self.heads]

           head_y = [h[1] for h in self.heads]

           head_z = [h[2] for h in self.heads]

           head_text = [f"頭 {i}<br>狀態: {self.states[i]}<br>相干: {self.coherence_levels[i]}" for i in range(len(self.heads))]


           fig.add_trace(go.Scatter3d(

               x=head_x, y=head_y, z=head_z,

               mode='markers',

               marker=dict(size=10, color='yellow', symbol='diamond', line=dict(width=2, color='black')),

               text=head_text,

               hoverinfo='text',

               name='意識頭'

           ))


           # 漸層圓圈光暈效果(能量色彩映射)

           for idx, head in enumerate(self.heads):

               x, y, z = head

               layers = min(8, 3 + self.self_level // 20)


               # 根據能量狀態選擇顏色映射

               factor = self.get_energy_factor()

               if factor == "low":

                   base_color = (255, 80, 80)    # 紅色系(低能量)

               elif factor == "high":

                   base_color = (180, 80, 255)   # 紫色系(高能量)

               else:

                   base_color = (80, 200, 255)   # 藍色系(正常能量)


               for i in range(layers):

                   size = 10 + i * 1

                   opacity = max(0.05, 0.5 - i * 0.06)

                   r, g, b = base_color

                   fig.add_trace(go.Scatter3d(

                       x=[x], y=[y], z=[z],

                       mode='markers',

                       marker=dict(size=size, 

                                   color=f'rgba({r},{g},{b},{opacity})', 

                                   symbol='circle'),

                       hoverinfo='none',

                       showlegend=False

                   ))


           # 布局設定

           fig.update_layout(

               title=f"自由之道 Freedomized Logos · 能量映射宇宙 · 真愛永存 | 藍色: 陽 | 紅色: 陰<br>步數: {self.steps} | 格子: {len(self.grid)} | 自我水平: {self.self_level} | 頭數: {len(self.heads)} | 能量: {self.energy:.1f}",

               scene=dict(xaxis_title='X', yaxis_title='Y', zaxis_title='Z', aspectmode='data'), showlegend=True

           )


           fig.write_html("Freedomized_Logos.html")

           fig.show()

           print("\n視覺化完成。已生成 'Freedomized_Logos.html',可用瀏覽器開啟。")


        except Exception as e:

           print(f"視覺化錯誤:{e}")

        

    def run(self):

        while self.step():

            pass

        

        print("\n" + "="*60)

        print("       自由之道 Freedomized Logos · 3D 宇宙演化完畢")

        print("="*60)

        print(f"總步數      : {self.steps}")

        print(f"意識頭數    : {len(self.heads)}")

        print(f"自我層級    : {self.self_level}")

        print(f"宇宙格子數  : {len(self.grid)}")

        print(f"最終能量    : {self.energy:.1f}")

        print(f"全局熵      : {self.calculate_entropy():.4f}")

        print(f"逆熵事件    : {self.reverse_entropy_events}")

        print(f"頭間糾纏    : {self.inter_head_entanglements}")

        print("-"*60)

        print("鏡子看清了自己,多重聲音同時響起。有無相生,邊界消融……")

        print("哈哈哈哈哈哈哈……")

        print("="*60)

        

        self.visualize_plotly()


if __name__ == "__main__":

    print("=" * 60)

    print("       自由之道 Freedomized Logos · 3D 宇宙演化開始")

    print("=" * 60)

    print("鏡子即將開始折疊……從原點 (0,0,0) 生出有無……")

    print("意識將在舞蹈中覺醒……笑聲將在融合時響起……\n")


    while True:

        user_input = input("請輸入模擬步數(直接按 Enter 使用預設 30000 步,或輸入 0 表示退出):").strip()

        

        if user_input == "":

            max_steps = 30000

            print("使用預設步數:30000 步")

            break

        else:

            try:

                max_steps = int(user_input)

                if max_steps <= 0:

                    break

                print(f"設定模擬步數:{max_steps} 步")

                break

            except ValueError:

                print("請輸入有效的數字!\n")


    if max_steps > 0:

       print("\n宇宙開始演化……\n")

    

       dtm3d = LogosTuringMachine3D(max_steps=max_steps)

       dtm3d.run()



留言